diff --git a/analyzer/BUILD.gn b/analyzer/BUILD.gn
index 53de368..d3757b8 100644
--- a/analyzer/BUILD.gn
+++ b/analyzer/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for analyzer-0.35.4
+# This file is generated by importer.py for analyzer-0.36.3
 
 import("//build/dart/dart_library.gni")
 
@@ -13,19 +13,20 @@
 
   deps = [
     "//third_party/dart-pkg/pub/kernel",
-    "//third_party/dart-pkg/pub/convert",
     "//third_party/dart-pkg/pub/args",
-    "//third_party/dart-pkg/pub/front_end",
-    "//third_party/dart-pkg/pub/pub_semver",
     "//third_party/dart-pkg/pub/glob",
     "//third_party/dart-pkg/pub/package_config",
-    "//third_party/dart-pkg/pub/crypto",
     "//third_party/dart-pkg/pub/collection",
     "//third_party/dart-pkg/pub/watcher",
-    "//third_party/dart-pkg/pub/yaml",
     "//third_party/dart-pkg/pub/meta",
     "//third_party/dart-pkg/pub/path",
     "//third_party/dart-pkg/pub/source_span",
+    "//third_party/dart-pkg/pub/convert",
+    "//third_party/dart-pkg/pub/front_end",
+    "//third_party/dart-pkg/pub/pub_semver",
+    "//third_party/dart-pkg/pub/crypto",
+    "//third_party/dart-pkg/pub/yaml",
+    "//third_party/dart-pkg/pub/html",
     "//third_party/dart-pkg/pub/charcode",
   ]
 }
diff --git a/analyzer/CHANGELOG.md b/analyzer/CHANGELOG.md
index e376b96..19b5b21 100644
--- a/analyzer/CHANGELOG.md
+++ b/analyzer/CHANGELOG.md
@@ -1,3 +1,62 @@
+## 0.36.3
+* Deprecated `AstFactory.compilationUnit`.  In a future analyzer release, this
+  method will be changed so that all its parameters are named parameters.
+  Clients wishing to prepare for this should switch to using
+  `AstFactory.compilationUnit2`.
+* Deprecated Parser setters `enableControlFlowCollections`, `enableNonNullable`,
+  `enableSpreadCollections`, and `enableTripleShift`, as well as the
+  recently-introduced method `configureFeatures`.  Parsers should now be
+  configured by passing a FeatureSet object to the Parser constructor.
+* Deprecated `AnalysisError.isStaticOnly`.
+* Deprecated `AnalysisError.offset` setter.
+* Added method `LinterContext.canBeConstConstructor`.
+* Bug fixes: #36732, #36775.
+
+## 0.36.2
+* Bug fixes: #36724.
+
+## 0.36.1
+* Deprecated `DartType.isUndefined`, and now it always returns `false`.
+* The "UI as code" features (control_flow_collections and spread_collections)
+  are now enabled.
+* Bug fixes: #32918, #36262, #36380, #36439, #36492, #36529, #36576, #36667,
+  #36678, #36691.
+
+## 0.36.0
+* Changed the return type of `Expression.precendence` to `Precedence`.  Clients
+  that prepared for this change by switching to `Expression.precedence2` should
+  now return to using `Expression.precedence`.
+* AST cleanup related to the "UI as code" feature:
+  * Removed the following AST node types:
+    * `ForEachStatement` (use `ForStatement` instead)
+    * `MapLiteral` and `MapLiteral2` (use `SetOrMapLiteral` instead)
+    * `SetLiteral` and `SetLiteral2` (use `SetOrMapLiteral` instead)
+    * `ListLiteral2` (use `ListLiteral` instead)
+  * Deprecated `ForStatement2` (use `ForStatement` instead)
+  * Removed the following visit methods:
+    * `visitForEachStatement` (override `visitForStatement` instead)
+    * `visitMapLiteral` and `visitMapLiteral2` (override `visitSetOrMapLiteral`
+      instead)
+    * `visitSetLiteral` and `visitSetLiteral2` (override `visitSetOrMapLiteral`
+      instead)
+    * `visitListLiteral2` (override `visitListLiteral` instead)
+  * Deprecated the `visitForStatement2` visit method (use `VisitForStatement`
+    instead)
+  * Removed the following AstFactory methods:
+    * `mapLiteral` and `mapLiteral2` (use `setOrMapLiteral` instead)
+    * `setLiteral` and `setLiteral2` (use `setOrMapLiteral` instead)
+    * `listLiteral2` (use `listLiteral` instead)
+  * Deprecated `AstFactory.forStatement2`, and introduced
+    `AstFactory.forStatement` to replace it
+  * Changed the type of the getter `ListLiteral.elements` to
+    `NodeList<CollectionElement>`
+  * Deprecated `ListLiteral.elements2` (use `ListLiteral.elements` instead)
+  * Deprecated `SetOrMapLiteral.elements2`, and introduced
+    `SetOrMapLiteral.elements` to replace it
+  * Deprecated `NodeLintRegistry.addForStatement2` (use
+    `NodeLintRegistry.addForStatement` instead)
+* Bug fixes: #36158, #36212, #36255
+
 ## 0.35.4
 * Deprecated AST structures that will no longer be used after the
   control_flow_collections and spread_collections experiments are enabled.  The
diff --git a/analyzer/lib/analyzer.dart b/analyzer/lib/analyzer.dart
index 3516414..0e8a271 100644
--- a/analyzer/lib/analyzer.dart
+++ b/analyzer/lib/analyzer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,6 +7,7 @@
 
 import 'dart:io';
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
@@ -40,9 +41,14 @@
 /// If [parseFunctionBodies] is [false] then only function signatures will be
 /// parsed.
 CompilationUnit parseCompilationUnit(String contents,
-    {String name, bool suppressErrors: false, bool parseFunctionBodies: true}) {
+    {String name,
+    bool suppressErrors: false,
+    bool parseFunctionBodies: true,
+    FeatureSet featureSet}) {
+  // TODO(paulberry): make featureSet a required parameter
+  featureSet ??= FeatureSet.fromEnableFlags([]);
   Source source = new StringSource(contents, name);
-  return _parseSource(contents, source,
+  return _parseSource(contents, source, featureSet,
       suppressErrors: suppressErrors, parseFunctionBodies: parseFunctionBodies);
 }
 
@@ -54,7 +60,11 @@
 /// If [parseFunctionBodies] is [false] then only function signatures will be
 /// parsed.
 CompilationUnit parseDartFile(String path,
-    {bool suppressErrors: false, bool parseFunctionBodies: true}) {
+    {bool suppressErrors: false,
+    bool parseFunctionBodies: true,
+    FeatureSet featureSet}) {
+  // TODO(paulberry): Make featureSet a required parameter
+  featureSet ??= FeatureSet.fromEnableFlags([]);
   String contents = new File(path).readAsStringSync();
   var sourceFactory = new SourceFactory(
       [new ResourceUriResolver(PhysicalResourceProvider.INSTANCE)]);
@@ -68,7 +78,7 @@
     throw new ArgumentError("Source $source doesn't exist");
   }
 
-  return _parseSource(contents, source,
+  return _parseSource(contents, source, featureSet,
       suppressErrors: suppressErrors, parseFunctionBodies: parseFunctionBodies);
 }
 
@@ -83,13 +93,16 @@
 /// Throws an [AnalyzerErrorGroup] if any errors occurred, unless
 /// [suppressErrors] is `true`, in which case any errors are discarded.
 CompilationUnit parseDirectives(String contents,
-    {String name, bool suppressErrors: false}) {
+    {String name, bool suppressErrors: false, FeatureSet featureSet}) {
+  // TODO(paulberry): make featureSet a required parameter.
+  featureSet ??= FeatureSet.fromEnableFlags([]);
   var source = new StringSource(contents, name);
   var errorCollector = new _ErrorCollector();
   var reader = new CharSequenceReader(contents);
-  var scanner = new Scanner(source, reader, errorCollector);
+  var scanner = new Scanner(source, reader, errorCollector)
+    ..configureFeatures(featureSet);
   var token = scanner.tokenize();
-  var parser = new Parser(source, errorCollector);
+  var parser = new Parser(source, errorCollector, featureSet: featureSet);
   var unit = parser.parseDirectives(token);
   unit.lineInfo = new LineInfo(scanner.lineStarts);
 
@@ -103,13 +116,15 @@
   return literal.stringValue;
 }
 
-CompilationUnit _parseSource(String contents, Source source,
+CompilationUnit _parseSource(
+    String contents, Source source, FeatureSet featureSet,
     {bool suppressErrors: false, bool parseFunctionBodies: true}) {
   var reader = new CharSequenceReader(contents);
   var errorCollector = new _ErrorCollector();
-  var scanner = new Scanner(source, reader, errorCollector);
+  var scanner = new Scanner(source, reader, errorCollector)
+    ..configureFeatures(featureSet);
   var token = scanner.tokenize();
-  var parser = new Parser(source, errorCollector)
+  var parser = new Parser(source, errorCollector, featureSet: featureSet)
     ..parseFunctionBodies = parseFunctionBodies;
   var unit = parser.parseCompilationUnit(token)
     ..lineInfo = new LineInfo(scanner.lineStarts);
diff --git a/analyzer/lib/context/context_root.dart b/analyzer/lib/context/context_root.dart
index 7625503..df4a4b4 100644
--- a/analyzer/lib/context/context_root.dart
+++ b/analyzer/lib/context/context_root.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/context/declared_variables.dart b/analyzer/lib/context/declared_variables.dart
index c0d7fdf..74dc187 100644
--- a/analyzer/lib/context/declared_variables.dart
+++ b/analyzer/lib/context/declared_variables.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/dart/analysis/analysis_context.dart b/analyzer/lib/dart/analysis/analysis_context.dart
index e24bfc8..6c3728f 100644
--- a/analyzer/lib/dart/analysis/analysis_context.dart
+++ b/analyzer/lib/dart/analysis/analysis_context.dart
@@ -1,77 +1,65 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 import 'package:analyzer/dart/analysis/context_root.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/src/generated/engine.dart' hide AnalysisResult;
 
-/**
- * A representation of a body of code and the context in which the code is to be
- * analyzed.
- *
- * The body of code is represented as a collection of files and directories, as
- * defined by the list of included paths. If the list of included paths
- * contains one or more directories, then zero or more files or directories
- * within the included directories can be excluded from analysis, as defined by
- * the list of excluded paths.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A representation of a body of code and the context in which the code is to
+/// be analyzed.
+///
+/// The body of code is represented as a collection of files and directories, as
+/// defined by the list of included paths. If the list of included paths
+/// contains one or more directories, then zero or more files or directories
+/// within the included directories can be excluded from analysis, as defined by
+/// the list of excluded paths.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class AnalysisContext {
-  /**
-   * The analysis options used to control the way the code is analyzed.
-   */
+  /// The analysis options used to control the way the code is analyzed.
   AnalysisOptions get analysisOptions;
 
-  /**
-   * Return the context root from which this context was created.
-   */
+  /// Return the context root from which this context was created.
   ContextRoot get contextRoot;
 
-  /**
-   * Return the currently active analysis session.
-   */
+  /// Return the currently active analysis session.
   AnalysisSession get currentSession;
 
-  /**
-   * A list of the absolute, normalized paths of files and directories that
-   * will not be analyzed.
-   *
-   * Deprecated: Use `contextRoot.excludedPaths`.
-   */
+  /// A list of the absolute, normalized paths of files and directories that
+  /// will not be analyzed.
+  ///
+  /// Deprecated: Use `contextRoot.excludedPaths`.
   @deprecated
   List<String> get excludedPaths;
 
-  /**
-   * A list of the absolute, normalized paths of files and directories that
-   * will be analyzed. If a path in the list represents a file, then that file
-   * will be analyzed, even if it is in the list of [excludedPaths]. If path in
-   * the list represents a directory, then all of the files contained in that
-   * directory, either directly or indirectly, and that are not explicitly
-   * excluded by the list of [excludedPaths] will be analyzed.
-   *
-   * Deprecated: Use `contextRoot.includedPaths`.
-   */
+  /// A list of the absolute, normalized paths of files and directories that
+  /// will be analyzed. If a path in the list represents a file, then that file
+  /// will be analyzed, even if it is in the list of [excludedPaths]. If path in
+  /// the list represents a directory, then all of the files contained in that
+  /// directory, either directly or indirectly, and that are not explicitly
+  /// excluded by the list of [excludedPaths] will be analyzed.
+  ///
+  /// Deprecated: Use `contextRoot.includedPaths`.
   @deprecated
   List<String> get includedPaths;
 
-  /**
-   * Return the absolute, normalized paths of all of the files that are
-   * contained in this context. These are all of the files that are included
-   * directly or indirectly by one or more of the [includedPaths] and that are
-   * not excluded by any of the [excludedPaths].
-   *
-   * Deprecated: Use `contextRoot.analyzedFiles`.
-   */
+  /// Return the absolute, normalized paths of all of the files that are
+  /// contained in this context. These are all of the files that are included
+  /// directly or indirectly by one or more of the [includedPaths] and that are
+  /// not excluded by any of the [excludedPaths].
+  ///
+  /// Deprecated: Use `contextRoot.analyzedFiles`.
   @deprecated
   Iterable<String> analyzedFiles();
 
-  /**
-   * Return `true` if the file or directory with the given [path] will be
-   * analyzed in this context. A file (or directory) will be analyzed if it is
-   * either the same as or contained in one of the [includedPaths] and, if it is
-   * is contained in one of the [includedPaths], is not the same as or contained
-   * in one of the [excludedPaths].
-   *
-   * Deprecated: Use `contextRoot.isAnalyzed`.
-   */
+  /// Return `true` if the file or directory with the given [path] will be
+  /// analyzed in this context. A file (or directory) will be analyzed if it is
+  /// either the same as or contained in one of the [includedPaths] and, if it
+  /// is contained in one of the [includedPaths], is not the same as or
+  /// contained in one of the [excludedPaths].
+  ///
+  /// Deprecated: Use `contextRoot.isAnalyzed`.
   @deprecated
   bool isAnalyzed(String path);
 }
diff --git a/analyzer/lib/dart/analysis/context_builder.dart b/analyzer/lib/dart/analysis/context_builder.dart
index f99dce5..08cbd34 100644
--- a/analyzer/lib/dart/analysis/context_builder.dart
+++ b/analyzer/lib/dart/analysis/context_builder.dart
@@ -9,39 +9,33 @@
 import 'package:analyzer/src/dart/analysis/context_builder.dart';
 import 'package:meta/meta.dart';
 
-/**
- * A utility class used to build an analysis context based on a context root.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A utility class used to build an analysis context based on a context root.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ContextBuilder {
-  /**
-   * Initialize a newly created context builder. If a [resourceProvider] is
-   * given, then it will be used to access the file system, otherwise the
-   * default resource provider will be used.
-   */
+  /// Initialize a newly created context builder. If a [resourceProvider] is
+  /// given, then it will be used to access the file system, otherwise the
+  /// default resource provider will be used.
   factory ContextBuilder({ResourceProvider resourceProvider}) =
       ContextBuilderImpl;
 
-  /**
-   * Return an analysis context corresponding to the given [contextRoot].
-   *
-   * If a set of [declaredVariables] is provided, the values will be used to map
-   * the the variable names found in `fromEnvironment` invocations to the
-   * constant value that will be returned. If none is given, then no variables
-   * will be defined.
-   * 
-   * If a list of [librarySummaryPaths] is provided, then the summary files at
-   * those paths will be used, when possible, when analyzing the libraries
-   * contained in the summary files.
-   *
-   * If an [sdkPath] is provided, and if it is a valid path to a directory
-   * containing a valid SDK, then the SDK in the referenced directory will be
-   * used when analyzing the code in the context.
-   * 
-   * If an [sdkSummaryPath] is provided, then that file will be used as the
-   * summary file for the SDK.
-   */
+  /// Return an analysis context corresponding to the given [contextRoot].
+  ///
+  /// If a set of [declaredVariables] is provided, the values will be used to
+  /// map the the variable names found in `fromEnvironment` invocations to the
+  /// constant value that will be returned. If none is given, then no variables
+  /// will be defined.
+  ///
+  /// If a list of [librarySummaryPaths] is provided, then the summary files at
+  /// those paths will be used, when possible, when analyzing the libraries
+  /// contained in the summary files.
+  ///
+  /// If an [sdkPath] is provided, and if it is a valid path to a directory
+  /// containing a valid SDK, then the SDK in the referenced directory will be
+  /// used when analyzing the code in the context.
+  ///
+  /// If an [sdkSummaryPath] is provided, then that file will be used as the
+  /// summary file for the SDK.
   AnalysisContext createContext(
       {@required ContextRoot contextRoot,
       DeclaredVariables declaredVariables,
diff --git a/analyzer/lib/dart/analysis/context_locator.dart b/analyzer/lib/dart/analysis/context_locator.dart
index ce4d07a..d2c4cd3 100644
--- a/analyzer/lib/dart/analysis/context_locator.dart
+++ b/analyzer/lib/dart/analysis/context_locator.dart
@@ -8,39 +8,33 @@
 import 'package:analyzer/src/dart/analysis/context_locator.dart';
 import 'package:meta/meta.dart';
 
-/**
- * Determines the list of analysis contexts that can be used to analyze the
- * files and folders that should be analyzed given a list of included files and
- * folders and a list of excluded files and folders.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// Determines the list of analysis contexts that can be used to analyze the
+/// files and folders that should be analyzed given a list of included files and
+/// folders and a list of excluded files and folders.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ContextLocator {
-  /**
-   * Initialize a newly created context locator. If a [resourceProvider] is
-   * supplied, it will be used to access the file system. Otherwise the default
-   * resource provider will be used.
-   */
+  /// Initialize a newly created context locator. If a [resourceProvider] is
+  /// supplied, it will be used to access the file system. Otherwise the default
+  /// resource provider will be used.
   factory ContextLocator({ResourceProvider resourceProvider}) =
       ContextLocatorImpl;
 
-  /**
-   * Return a list of the analysis contexts that should be used to analyze the
-   * files that are included by the list of [includedPaths] and not excluded by
-   * the list of [excludedPaths].
-   *
-   * If an [optionsFile] is specified, then it is assumed to be the path to the
-   * `analysis_options.yaml` (or `.analysis_options`) file that should be used
-   * in place of the ones that would be found by looking in the directories
-   * containing the context roots.
-   *
-   * If a [packagesFile] is specified, then it is assumed to be the path to the
-   * `.packages` file that should be used in place of the one that would be
-   * found by looking in the directories containing the context roots.
-   *
-   * If the [sdkPath] is specified, then it is used as the path to the root of
-   * the SDK that should be used during analysis.
-   */
+  /// Return a list of the analysis contexts that should be used to analyze the
+  /// files that are included by the list of [includedPaths] and not excluded by
+  /// the list of [excludedPaths].
+  ///
+  /// If an [optionsFile] is specified, then it is assumed to be the path to the
+  /// `analysis_options.yaml` (or `.analysis_options`) file that should be used
+  /// in place of the ones that would be found by looking in the directories
+  /// containing the context roots.
+  ///
+  /// If a [packagesFile] is specified, then it is assumed to be the path to the
+  /// `.packages` file that should be used in place of the one that would be
+  /// found by looking in the directories containing the context roots.
+  ///
+  /// If the [sdkPath] is specified, then it is used as the path to the root of
+  /// the SDK that should be used during analysis.
   @deprecated
   List<AnalysisContext> locateContexts(
       {@required List<String> includedPaths,
@@ -49,20 +43,18 @@
       String packagesFile: null,
       String sdkPath: null});
 
-  /**
-   * Return a list of the context roots that should be used to analyze the files
-   * that are included by the list of [includedPaths] and not excluded by the
-   * list of [excludedPaths].
-   *
-   * If an [optionsFile] is specified, then it is assumed to be the path to the
-   * `analysis_options.yaml` (or `.analysis_options`) file that should be used
-   * in place of the ones that would be found by looking in the directories
-   * containing the context roots.
-   *
-   * If a [packagesFile] is specified, then it is assumed to be the path to the
-   * `.packages` file that should be used in place of the one that would be
-   * found by looking in the directories containing the context roots.
-   */
+  /// Return a list of the context roots that should be used to analyze the
+  /// files that are included by the list of [includedPaths] and not excluded by
+  /// the list of [excludedPaths].
+  ///
+  /// If an [optionsFile] is specified, then it is assumed to be the path to the
+  /// `analysis_options.yaml` (or `.analysis_options`) file that should be used
+  /// in place of the ones that would be found by looking in the directories
+  /// containing the context roots.
+  ///
+  /// If a [packagesFile] is specified, then it is assumed to be the path to the
+  /// `.packages` file that should be used in place of the one that would be
+  /// found by looking in the directories containing the context roots.
   List<ContextRoot> locateRoots(
       {@required List<String> includedPaths,
       List<String> excludedPaths: null,
diff --git a/analyzer/lib/dart/analysis/context_root.dart b/analyzer/lib/dart/analysis/context_root.dart
index a8998fe..ccb15b5 100644
--- a/analyzer/lib/dart/analysis/context_root.dart
+++ b/analyzer/lib/dart/analysis/context_root.dart
@@ -4,79 +4,58 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 
-/**
- * Information about the root directory associated with an analysis context.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// Information about the root directory associated with an analysis context.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ContextRoot {
-  /**
-   * A list of the files and directories within the root directory that should
-   * not be analyzed.
-   */
+  /// A list of the files and directories within the root directory that should
+  /// not be analyzed.
   List<Resource> get excluded;
 
-  /**
-   * A collection of the absolute, normalized paths of files and directories
-   * within the root directory that should not be analyzed.
-   */
+  /// A collection of the absolute, normalized paths of files and directories
+  /// within the root directory that should not be analyzed.
   Iterable<String> get excludedPaths;
 
-  /**
-   * A list of the files and directories within the root directory that should
-   * be analyzed. If all of the files in the root directory (other than those
-   * that are explicitly excluded) should be analyzed, then this list will
-   * contain the root directory.
-   */
+  /// A list of the files and directories within the root directory that should
+  /// be analyzed. If all of the files in the root directory (other than those
+  /// that are explicitly excluded) should be analyzed, then this list will
+  /// contain the root directory.
   List<Resource> get included;
 
-  /**
-   * A collection of the absolute, normalized paths of files within the root
-   * directory that should be analyzed. If all of the files in the root
-   * directory (other than those that are explicitly excluded) should be
-   * analyzed, then this collection will contain the path of the root directory.
-   */
+  /// A collection of the absolute, normalized paths of files within the root
+  /// directory that should be analyzed. If all of the files in the root
+  /// directory (other than those that are explicitly excluded) should be
+  /// analyzed, then this collection will contain the path of the root
+  /// directory.
   Iterable<String> get includedPaths;
 
-  /**
-   * The analysis options file that should be used when analyzing the files
-   * within this context root, or `null` if there is no options file.
-   */
+  /// The analysis options file that should be used when analyzing the files
+  /// within this context root, or `null` if there is no options file.
   File get optionsFile;
 
-  /**
-   * The packages file that should be used when analyzing the files within this
-   * context root, or `null` if there is no options file.
-   */
+  /// The packages file that should be used when analyzing the files within this
+  /// context root, or `null` if there is no options file.
   File get packagesFile;
 
-  /**
-   * The resource provider used to access the file system.
-   */
+  /// The resource provider used to access the file system.
   ResourceProvider get resourceProvider;
 
-  /**
-   * The root directory containing the files to be analyzed.
-   */
+  /// The root directory containing the files to be analyzed.
   Folder get root;
 
-  /**
-   * Return the absolute, normalized paths of all of the files that are
-   * contained in this context. These are all of the files that are included
-   * directly or indirectly by one or more of the [includedPaths] and that are
-   * not excluded by any of the [excludedPaths].
-   *
-   * Note that the list is not filtered based on the file suffix, so non-Dart
-   * files can be returned.
-   */
+  /// Return the absolute, normalized paths of all of the files that are
+  /// contained in this context. These are all of the files that are included
+  /// directly or indirectly by one or more of the [includedPaths] and that are
+  /// not excluded by any of the [excludedPaths].
+  ///
+  /// Note that the list is not filtered based on the file suffix, so non-Dart
+  /// files can be returned.
   Iterable<String> analyzedFiles();
 
-  /**
-   * Return `true` if the file or directory with the given [path] will be
-   * analyzed in this context. A file (or directory) will be analyzed if it is
-   * either the same as or contained in one of the [includedPaths] and, if it is
-   * contained in one of the [includedPaths], is not the same as or contained
-   * in one of the [excludedPaths].
-   */
+  /// Return `true` if the file or directory with the given [path] will be
+  /// analyzed in this context. A file (or directory) will be analyzed if it is
+  /// either the same as or contained in one of the [includedPaths] and, if it
+  /// is contained in one of the [includedPaths], is not the same as or
+  /// contained in one of the [excludedPaths].
   bool isAnalyzed(String path);
 }
diff --git a/analyzer/lib/dart/analysis/declared_variables.dart b/analyzer/lib/dart/analysis/declared_variables.dart
index a517582..bcd0d74 100644
--- a/analyzer/lib/dart/analysis/declared_variables.dart
+++ b/analyzer/lib/dart/analysis/declared_variables.dart
@@ -6,67 +6,49 @@
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 
-/**
- * An object used to provide access to the values of variables that have been
- * defined on the command line using the `-D` option.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An object used to provide access to the values of variables that have been
+/// defined on the command line using the `-D` option.
+///
+/// Clients may not extend, implement or mix-in this class.
 class DeclaredVariables {
-  /**
-   * A table mapping the names of declared variables to their values.
-   */
+  /// A table mapping the names of declared variables to their values.
   Map<String, String> _declaredVariables = <String, String>{};
 
-  /**
-   * Initialize a newly created set of declared variables in which there are no
-   * variables.
-   */
+  /// Initialize a newly created set of declared variables in which there are no
+  /// variables.
   DeclaredVariables();
 
-  /**
-   * Initialize a newly created set of declared variables to define variables
-   * whose names are the keys in the give [variableMap] and whose values are the
-   * corresponding values from the map.
-   */
+  /// Initialize a newly created set of declared variables to define variables
+  /// whose names are the keys in the give [variableMap] and whose values are
+  /// the corresponding values from the map.
   DeclaredVariables.fromMap(Map<String, String> variableMap) {
     _declaredVariables.addAll(variableMap);
   }
 
-  /**
-   * Return the names of the variables for which a value has been defined.
-   */
+  /// Return the names of the variables for which a value has been defined.
   Iterable<String> get variableNames => _declaredVariables.keys;
 
-  /**
-   * Add all variables of [other] to this object.
-   */
+  /// Add all variables of [other] to this object.
   @deprecated
   void addAll(DeclaredVariables other) {
     _declaredVariables.addAll(other._declaredVariables);
   }
 
-  /**
-   * Define a variable with the given [name] to have the given [value].
-   */
+  /// Define a variable with the given [name] to have the given [value].
   @deprecated
   void define(String name, String value) {
     _declaredVariables[name] = value;
   }
 
-  /**
-   * Return the raw string value of the variable with the given [name],
-   * or `null` of the variable is not defined.
-   */
+  /// Return the raw string value of the variable with the given [name],
+  /// or `null` of the variable is not defined.
   String get(String name) => _declaredVariables[name];
 
-  /**
-   * Return the value of the variable with the given [name] interpreted as a
-   * 'boolean' value. If the variable is not defined (or [name] is `null`), a
-   * DartObject representing "unknown" is returned. If the value cannot be
-   * parsed as a boolean, a DartObject representing 'null' is returned. The
-   * [typeProvider] is the type provider used to find the type 'bool'.
-   */
+  /// Return the value of the variable with the given [name] interpreted as a
+  /// 'boolean' value. If the variable is not defined (or [name] is `null`), a
+  /// DartObject representing "unknown" is returned. If the value cannot be
+  /// parsed as a boolean, a DartObject representing 'null' is returned. The
+  /// [typeProvider] is the type provider used to find the type 'bool'.
   DartObject getBool(TypeProvider typeProvider, String name) {
     String value = _declaredVariables[name];
     if (value == null) {
@@ -80,12 +62,10 @@
     return new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE);
   }
 
-  /**
-   * Return the value of the variable with the given [name] interpreted as an
-   * integer value. If the variable is not defined (or [name] is `null`), a
-   * DartObject representing "unknown" is returned. If the value cannot be
-   * parsed as an integer, a DartObject representing 'null' is returned.
-   */
+  /// Return the value of the variable with the given [name] interpreted as an
+  /// integer value. If the variable is not defined (or [name] is `null`), a
+  /// DartObject representing "unknown" is returned. If the value cannot be
+  /// parsed as an integer, a DartObject representing 'null' is returned.
   DartObject getInt(TypeProvider typeProvider, String name) {
     String value = _declaredVariables[name];
     if (value == null) {
@@ -100,14 +80,12 @@
     return new DartObjectImpl(typeProvider.intType, new IntState(bigInteger));
   }
 
-  /**
-   * Return the value of the variable with the given [name] interpreted as a
-   * String value, or `null` if the variable is not defined. Return the value of
-   * the variable with the given name interpreted as a String value. If the
-   * variable is not defined (or [name] is `null`), a DartObject representing
-   * "unknown" is returned. The [typeProvider] is the type provider used to find
-   * the type 'String'.
-   */
+  /// Return the value of the variable with the given [name] interpreted as a
+  /// String value, or `null` if the variable is not defined. Return the value
+  /// of the variable with the given name interpreted as a String value. If the
+  /// variable is not defined (or [name] is `null`), a DartObject representing
+  /// "unknown" is returned. The [typeProvider] is the type provider used to
+  /// find the type 'String'.
   DartObject getString(TypeProvider typeProvider, String name) {
     String value = _declaredVariables[name];
     if (value == null) {
diff --git a/analyzer/lib/dart/analysis/features.dart b/analyzer/lib/dart/analysis/features.dart
new file mode 100644
index 0000000..6841054
--- /dev/null
+++ b/analyzer/lib/dart/analysis/features.dart
@@ -0,0 +1,89 @@
+// 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:meta/meta.dart';
+import 'package:pub_semver/pub_semver.dart';
+
+/// Information about a single language feature whose presence or absence
+/// depends on the supported Dart SDK version, and possibly on the presence of
+/// experimental flags.
+abstract class Feature {
+  /// Feature information for the 2018 constant update.
+  static const constant_update_2018 = ExperimentalFeatures.constant_update_2018;
+
+  /// Feature information for non-nullability by default.
+  static const non_nullable = ExperimentalFeatures.non_nullable;
+
+  /// Feature information for control flow collections.
+  static const control_flow_collections =
+      ExperimentalFeatures.control_flow_collections;
+
+  /// Feature information for spread collections.
+  static const spread_collections = ExperimentalFeatures.spread_collections;
+
+  /// Feature information for set literals.
+  static const set_literals = ExperimentalFeatures.set_literals;
+
+  /// Feature information for the triple-shift operator.
+  static const triple_shift = ExperimentalFeatures.triple_shift;
+
+  /// If the feature may be enabled or disabled on the command line, the
+  /// experimental flag that may be used to enable it.  Otherwise `null`.
+  ///
+  /// Should be `null` if [status] is `current` or `abandoned`.
+  String get experimentalFlag;
+
+  /// If [status] is not `future`, the first version of the Dart SDK in which
+  /// the given feature was supported.  Otherwise `null`.
+  Version get firstSupportedVersion;
+
+  /// The status of the feature.
+  FeatureStatus get status;
+}
+
+/// An unordered collection of [Feature] objects.
+abstract class FeatureSet {
+  /// Computes a set of features for use in a unit test.  Computes the set of
+  /// features enabled in [sdkVersion], plus any specified [additionalFeatures].
+  ///
+  /// If [sdkVersion] is not supplied (or is `null`), then the current set of
+  /// enabled features is used as the starting point.
+  @visibleForTesting
+  factory FeatureSet.forTesting(
+          {String sdkVersion, List<Feature> additionalFeatures}) =
+      // ignore: invalid_use_of_visible_for_testing_member
+      ExperimentStatus.forTesting;
+
+  /// Computes the set of features implied by the given set of experimental
+  /// enable flags.
+  factory FeatureSet.fromEnableFlags(List<String> flags) =
+      ExperimentStatus.fromStrings;
+
+  /// Queries whether the given [feature] is contained in this feature set.
+  bool isEnabled(Feature feature);
+
+  /// Computes a subset of this FeatureSet by removing any features that weren't
+  /// available in the given Dart SDK version.
+  FeatureSet restrictToVersion(Version version);
+}
+
+/// Information about the status of a language feature.
+enum FeatureStatus {
+  /// The language feature has not yet shipped.  It may not be used unless an
+  /// experimental flag is used to enable it.
+  future,
+
+  /// The language feature has not yet shipped, but we are testing the effect of
+  /// enabling it by default.  It may be used in any library with an appopriate
+  /// version constraint, unless an experimental flag is used to disable it.
+  provisional,
+
+  /// The language feature has been shipped.  It may be used in any library with
+  /// an appropriate version constraint.
+  current,
+
+  /// The language feature is no longer planned.  It may not be used.
+  abandoned,
+}
diff --git a/analyzer/lib/dart/analysis/uri_converter.dart b/analyzer/lib/dart/analysis/uri_converter.dart
index ec1ed8d..a93d045 100644
--- a/analyzer/lib/dart/analysis/uri_converter.dart
+++ b/analyzer/lib/dart/analysis/uri_converter.dart
@@ -2,29 +2,25 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * A utility class used to convert between URIs and absolute file paths.
- */
+/// A utility class used to convert between URIs and absolute file paths.
 abstract class UriConverter {
-  /**
-   * Return the URI that should be used to reference the file at the absolute
-   * [path], or `null` if there is no valid way to reference the file in this
-   * converter’s context. The file at that path is not required to exist.
-   *
-   * If a [containingPath] is provided and both the [path] and [containingPath]
-   * are within the root of this converter’s context, then the returned URI will
-   * be a relative path. Otherwise, the returned URI will be an absolute URI.
-   *
-   * Throws an `ArgumentError` if the [path] is `null` or is not a valid
-   * absolute file path.
-   */
+  /// Return the URI that should be used to reference the file at the absolute
+  /// [path], or `null` if there is no valid way to reference the file in this
+  /// converter’s context. The file at that path is not required to exist.
+  ///
+  /// If a [containingPath] is provided and both the [path] and [containingPath]
+  /// are within the root of this converter’s context, then the returned URI
+  /// will be a relative path. Otherwise, the returned URI will be an absolute
+  /// URI.
+  ///
+  /// Throws an `ArgumentError` if the [path] is `null` or is not a valid
+  /// absolute file path.
   Uri pathToUri(String path, {String containingPath});
 
-  /**
-   * Return the absolute path of the file to which the absolute [uri] resolves,
-   * or `null` if the [uri] cannot be resolved in this converter’s context.
-   *
-   * Throws an `ArgumentError` if the [uri] is `null` or is not an absolute URI.
-   */
+  /// Return the absolute path of the file to which the absolute [uri] resolves,
+  /// or `null` if the [uri] cannot be resolved in this converter’s context.
+  ///
+  /// Throws an `ArgumentError` if the [uri] is `null` or is not an absolute
+  /// URI.
   String uriToPath(Uri uri);
 }
diff --git a/analyzer/lib/dart/ast/ast.dart b/analyzer/lib/dart/ast/ast.dart
index b2ce8fa..f233ef1 100644
--- a/analyzer/lib/dart/ast/ast.dart
+++ b/analyzer/lib/dart/ast/ast.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/analysis/features.dart';
 import 'package:analyzer/dart/ast/precedence.dart';
 
 /// Defines the AST model. The AST (Abstract Syntax Tree) model describes the
@@ -507,9 +508,6 @@
 
   R visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node);
 
-  @Deprecated('Replaced by visitForStatement2')
-  R visitForEachStatement(ForEachStatement node);
-
   R visitForElement(ForElement node);
 
   R visitFormalParameterList(FormalParameterList node);
@@ -518,9 +516,9 @@
 
   R visitForPartsWithExpression(ForPartsWithExpression node);
 
-  @Deprecated('Replaced by visitForStatement2')
   R visitForStatement(ForStatement node);
 
+  @Deprecated('Replaced by visitForStatement')
   R visitForStatement2(ForStatement2 node);
 
   R visitFunctionDeclaration(FunctionDeclaration node);
@@ -571,15 +569,6 @@
 
   R visitListLiteral(ListLiteral node);
 
-  @Deprecated('Replaced by visitListLiteral')
-  R visitListLiteral2(ListLiteral2 node);
-
-  @Deprecated('Replaced by visitSetOrMapLiteral')
-  R visitMapLiteral(MapLiteral node);
-
-  @Deprecated('Replaced by visitSetOrMapLiteral')
-  R visitMapLiteral2(MapLiteral2 node);
-
   R visitMapLiteralEntry(MapLiteralEntry node);
 
   R visitMethodDeclaration(MethodDeclaration node);
@@ -621,12 +610,6 @@
 
   R visitScriptTag(ScriptTag node);
 
-  @Deprecated('Replaced by visitSetOrMapLiteral')
-  R visitSetLiteral(SetLiteral node);
-
-  @Deprecated('Replaced by visitSetOrMapLiteral')
-  R visitSetLiteral2(SetLiteral2 node);
-
   R visitSetOrMapLiteral(SetOrMapLiteral node);
 
   R visitShowCombinator(ShowCombinator node);
@@ -1241,6 +1224,17 @@
   /// [token].
   void set endToken(Token token);
 
+  /// The set of features available to this compilation unit, or `null` if
+  /// unknown.
+  ///
+  /// Determined by some combination of the .packages file, the enclosing
+  /// package's SDK version constraint, and/or the presence of a `@dart`
+  /// directive in a comment at the top of the file.
+  ///
+  /// Might be `null` if, for example, this [CompilationUnit] has been
+  /// resynthesized from a summary,
+  FeatureSet get featureSet;
+
   /// Return the line information for this compilation unit.
   LineInfo get lineInfo;
 
@@ -1983,14 +1977,13 @@
   /// integer value that defines how the source code is parsed into an AST. For
   /// example `a * b + c` is parsed as `(a * b) + c` because the precedence of
   /// `*` is greater than the precedence of `+`.
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
-  int get precedence;
+  Precedence get precedence;
 
   /// Return the precedence of this expression. The precedence is a positive
   /// integer value that defines how the source code is parsed into an AST. For
   /// example `a * b + c` is parsed as `(a * b) + c` because the precedence of
   /// `*` is greater than the precedence of `+`.
+  @Deprecated('Use precedence')
   Precedence get precedence2;
 
   /// If this expression is an argument to an invocation, and the AST structure
@@ -2239,63 +2232,6 @@
   SimpleIdentifier get identifier;
 }
 
-/// A for-each statement.
-///
-///    forEachStatement ::=
-///        'await'? 'for' '(' [DeclaredIdentifier] 'in' [Expression] ')' [Block]
-///      | 'await'? 'for' '(' [SimpleIdentifier] 'in' [Expression] ')' [Block]
-///
-/// This is the class that is used to represent a for-each loop when neither the
-/// 'control-flow-collections' nor 'spread-collections' experiments are enabled.
-/// If either of those experiments are enabled, then [ForStatement2] will be
-/// used.
-///
-/// Clients may not extend, implement or mix-in this class.
-@Deprecated('Replaced by ForStatement2')
-abstract class ForEachStatement implements ForStatement2 {
-  /// Set the token representing the 'await' keyword to the given [token].
-  void set awaitKeyword(Token token);
-
-  /// Set the body of the loop to the given [statement].
-  void set body(Statement statement);
-
-  /// Set the token representing the 'for' keyword to the given [token].
-  void set forKeyword(Token token);
-
-  /// Return the loop variable, or `null` if the loop variable is declared in
-  /// the 'for'.
-  SimpleIdentifier get identifier;
-
-  /// Set the loop variable to the given [identifier].
-  void set identifier(SimpleIdentifier identifier);
-
-  /// Return the token representing the 'in' keyword.
-  Token get inKeyword;
-
-  /// Set the token representing the 'in' keyword to the given [token].
-  void set inKeyword(Token token);
-
-  /// Return the expression evaluated to produce the iterator.
-  Expression get iterable;
-
-  /// Set the expression evaluated to produce the iterator to the given
-  /// [expression].
-  void set iterable(Expression expression);
-
-  /// Set the left parenthesis to the given [token].
-  void set leftParenthesis(Token token);
-
-  /// Return the declaration of the loop variable, or `null` if the loop
-  /// variable is a simple identifier.
-  DeclaredIdentifier get loopVariable;
-
-  /// Set the declaration of the loop variable to the given [variable].
-  void set loopVariable(DeclaredIdentifier variable);
-
-  /// Set the right parenthesis to the given [token].
-  void set rightParenthesis(Token token);
-}
-
 /// The basic structure of a for element.
 ///
 /// Clients may not extend, implement or mix-in this class.
@@ -2365,15 +2301,17 @@
   /// even though they are implicitly final.
   bool get isFinal;
 
-  /// Return `true` if this parameter is a named parameter. Named parameters are
-  /// always optional, even when they are annotated with the `@required`
-  /// annotation.
+  /// Return `true` if this parameter is a named parameter. Named parameters can
+  /// either be required or optional.
   bool get isNamed;
 
   /// Return `true` if this parameter is an optional parameter. Optional
   /// parameters can either be positional or named.
   bool get isOptional;
 
+  /// Return `true` if this parameter is both an optional and named parameter.
+  bool get isOptionalNamed;
+
   /// Return `true` if this parameter is both an optional and positional
   /// parameter.
   bool get isOptionalPositional;
@@ -2383,18 +2321,31 @@
   bool get isPositional;
 
   /// Return `true` if this parameter is a required parameter. Required
-  /// parameters are always positional.
+  /// parameters can either be positional or named.
   ///
-  /// 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 `true` if this parameter is both a required and named parameter.
+  ///
+  /// Note: this will return `false` for a named parameter that is annotated
+  /// with the `@required` annotation.
+  bool get isRequiredNamed;
+
+  /// Return `true` if this parameter is both a required and positional
+  /// parameter.
+  bool get isRequiredPositional;
+
   /// Return the kind of this parameter.
   @deprecated
   ParameterKind get kind;
 
   /// 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
@@ -2511,78 +2462,6 @@
   Expression get initialization;
 }
 
-/// A for statement.
-///
-///    forStatement ::=
-///        'for' '(' forLoopParts ')' [Statement]
-///
-///    forLoopParts ::=
-///        forInitializerStatement ';' [Expression]? ';' [Expression]?
-///
-///    forInitializerStatement ::=
-///        [DefaultFormalParameter]
-///      | [Expression]?
-///
-/// This is the class that is used to represent a for loop when neither the
-/// 'control-flow-collections' nor 'spread-collections' experiments are enabled.
-/// If either of those experiments are enabled, then [ForStatement2] will be
-/// used.
-///
-/// Clients may not extend, implement or mix-in this class.
-@Deprecated('Replaced by ForStatement2')
-abstract class ForStatement implements ForStatement2 {
-  /// Set the body of the loop to the given [statement].
-  void set body(Statement statement);
-
-  /// Return the condition used to determine when to terminate the loop, or
-  /// `null` if there is no condition.
-  Expression get condition;
-
-  /// Set the condition used to determine when to terminate the loop to the
-  /// given [expression].
-  void set condition(Expression expression);
-
-  /// Set the token representing the 'for' keyword to the given [token].
-  void set forKeyword(Token token);
-
-  /// Return the initialization expression, or `null` if there is no
-  /// initialization expression.
-  Expression get initialization;
-
-  /// Set the initialization expression to the given [expression].
-  void set initialization(Expression initialization);
-
-  /// Set the left parenthesis to the given [token].
-  void set leftParenthesis(Token token);
-
-  /// Return the semicolon separating the initializer and the condition.
-  Token get leftSeparator;
-
-  /// Set the semicolon separating the initializer and the condition to the
-  /// given [token].
-  void set leftSeparator(Token token);
-
-  /// Set the right parenthesis to the given [token].
-  void set rightParenthesis(Token token);
-
-  /// Return the semicolon separating the condition and the updater.
-  Token get rightSeparator;
-
-  /// Set the semicolon separating the condition and the updater to the given
-  /// [token].
-  void set rightSeparator(Token token);
-
-  /// Return the list of expressions run after each execution of the loop body.
-  NodeList<Expression> get updaters;
-
-  /// Return the declaration of the loop variables, or `null` if there are no
-  /// variables.
-  VariableDeclarationList get variables;
-
-  /// Set the declaration of the loop variables to the given [variableList].
-  void set variables(VariableDeclarationList variableList);
-}
-
 /// A for or for-each statement.
 ///
 ///    forStatement ::=
@@ -2600,7 +2479,7 @@
 /// `ForEachStatement` will be used.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class ForStatement2 implements Statement {
+abstract class ForStatement implements Statement {
   /// Return the token representing the 'await' keyword, or `null` if there is
   /// no 'await' keyword.
   Token get awaitKeyword;
@@ -2621,6 +2500,26 @@
   Token get rightParenthesis;
 }
 
+/// A for or for-each statement.
+///
+///    forStatement ::=
+///        'for' '(' forLoopParts ')' [Statement]
+///
+///    forLoopParts ::=
+///       [VariableDeclaration] ';' [Expression]? ';' expressionList?
+///     | [Expression]? ';' [Expression]? ';' expressionList?
+///     | [DeclaredIdentifier] 'in' [Expression]
+///     | [SimpleIdentifier] 'in' [Expression]
+///
+/// This is the class that is used to represent a for loop when either the
+/// 'control-flow-collections' or 'spread-collections' experiments are enabled.
+/// If neither of those experiments are enabled, then either `ForStatement` or
+/// `ForEachStatement` will be used.
+///
+/// Clients may not extend, implement or mix-in this class.
+@Deprecated('Replaced by ForStatement')
+abstract class ForStatement2 extends ForStatement {}
+
 /// A node representing the body of a function or method.
 ///
 ///    functionBody ::=
@@ -3695,11 +3594,11 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class ListLiteral implements TypedLiteral {
-  /// Return the expressions used to compute the elements of the list.
-  @Deprecated('Use elements2')
-  NodeList<Expression> get elements;
+  /// Return the syntactic elements used to compute the elements of the list.
+  NodeList<CollectionElement> get elements;
 
   /// Return the syntactic elements used to compute the elements of the list.
+  @Deprecated('Replaced by elements')
   NodeList<CollectionElement> get elements2;
 
   /// Return the left square bracket.
@@ -3715,38 +3614,6 @@
   void set rightBracket(Token token);
 }
 
-/// A list literal.
-///
-///    listLiteral ::=
-///        'const'? [TypeAnnotationList]? '[' elements? ']'
-///
-///    elements ::=
-///        [CollectionElement] (',' [CollectionElement])* ','?
-///
-/// This is the class that is used to represent a list literal when either the
-/// 'control-flow-collections' or 'spread-collections' experiments are enabled.
-/// If neither of those experiments are enabled, then [ListLiteral] will be
-/// used.
-///
-/// Clients may not extend, implement or mix-in this class.
-@Deprecated('Replaced by ListLiteral')
-abstract class ListLiteral2 implements TypedLiteral {
-  /// Return the expressions used to compute the elements of the list.
-  NodeList<CollectionElement> get elements;
-
-  /// Return the left square bracket.
-  Token get leftBracket;
-
-  /// Set the left square bracket to the given [token].
-  void set leftBracket(Token token);
-
-  /// Return the right square bracket.
-  Token get rightBracket;
-
-  /// Set the right square bracket to the given [token].
-  void set rightBracket(Token token);
-}
-
 /// A node that represents a literal expression.
 ///
 ///    literal ::=
@@ -3761,65 +3628,6 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class Literal implements Expression {}
 
-/// A literal map.
-///
-///    mapLiteral ::=
-///        'const'? ('<' [TypeAnnotation] (',' [TypeAnnotation])* '>')?
-///        '{' ([MapLiteralEntry] (',' [MapLiteralEntry])* ','?)? '}'
-///
-/// This is the class that is used to represent a map literal when neither the
-/// 'control-flow-collections' nor 'spread-collections' experiments are enabled.
-/// If either of those experiments are enabled, then [SetOrMapLiteral] will be
-/// used.
-///
-/// Clients may not extend, implement or mix-in this class.
-@Deprecated('Replaced by SetOrMapLiteral')
-abstract class MapLiteral implements SetOrMapLiteral {
-  /// Return the entries in the map.
-  NodeList<MapLiteralEntry> get entries;
-
-  /// Return the left curly bracket.
-  Token get leftBracket;
-
-  /// Set the left curly bracket to the given [token].
-  void set leftBracket(Token token);
-
-  /// Return the right curly bracket.
-  Token get rightBracket;
-
-  /// Set the right curly bracket to the given [token].
-  void set rightBracket(Token token);
-}
-
-/// A literal map.
-///
-///    mapLiteral ::=
-///        'const'? ('<' [TypeAnnotation] (',' [TypeAnnotation])* '>')?
-///        '{' ([MapElement] (',' [MapElement])* ','?)? '}'
-///
-/// This is the class that is used to represent a map literal when either the
-/// 'control-flow-collections' or 'spread-collections' experiments are enabled.
-/// If neither of those experiments are enabled, then [MapLiteral] will be used.
-///
-/// Clients may not extend, implement or mix-in this class.
-@Deprecated('Replaced by SetOrMapLiteral')
-abstract class MapLiteral2 implements TypedLiteral {
-  /// Return the entries in the map.
-  NodeList<CollectionElement> get entries;
-
-  /// Return the left curly bracket.
-  Token get leftBracket;
-
-  /// Set the left curly bracket to the given [token].
-  void set leftBracket(Token token);
-
-  /// Return the right curly bracket.
-  Token get rightBracket;
-
-  /// Set the right curly bracket to the given [token].
-  void set rightBracket(Token token);
-}
-
 /// A single key/value pair in a map literal.
 ///
 ///    mapLiteralEntry ::=
@@ -4645,67 +4453,6 @@
   void set scriptTag(Token token);
 }
 
-/// A literal set.
-///
-///    setLiteral ::=
-///        'const'? ('<' [TypeAnnotation] '>')?
-///        '{' [Expression] (',' [Expression])* ','? '}'
-///      | 'const'? ('<' [TypeAnnotation] '>')? '{' '}'
-///
-/// This is the class that is used to represent a set literal when neither the
-/// 'control-flow-collections' nor 'spread-collections' experiments are enabled.
-/// If either of those experiments are enabled, then [SetOrMapLiteral] will be
-/// used.
-///
-/// Clients may not extend, implement or mix-in this class.
-@Deprecated('Replaced by SetOrMapLiteral')
-abstract class SetLiteral implements SetOrMapLiteral {
-  /// Return the expressions used to compute the elements of the set.
-  NodeList<Expression> get elements;
-
-  /// Return the left curly bracket.
-  Token get leftBracket;
-
-  /// Set the left curly bracket to the given [token].
-  void set leftBracket(Token token);
-
-  /// Return the right curly bracket.
-  Token get rightBracket;
-
-  /// Set the right curly bracket to the given [token].
-  void set rightBracket(Token token);
-}
-
-/// A literal set.
-///
-///    setLiteral ::=
-///        'const'? ('<' [TypeAnnotation] '>')?
-///        '{' [CollectionElement] (',' [CollectionElement])* ','? '}'
-///      | 'const'? ('<' [TypeAnnotation] '>')? '{' '}'
-///
-/// This is the class that is used to represent a set literal when either the
-/// 'control-flow-collections' or 'spread-collections' experiments are enabled.
-/// If neither of those experiments are enabled, then [SetLiteral] will be used.
-///
-/// Clients may not extend, implement or mix-in this class.
-@Deprecated('Replaced by SetOrMapLiteral')
-abstract class SetLiteral2 implements TypedLiteral {
-  /// Return the expressions used to compute the elements of the set.
-  NodeList<CollectionElement> get elements;
-
-  /// Return the left curly bracket.
-  Token get leftBracket;
-
-  /// Set the left curly bracket to the given [token].
-  void set leftBracket(Token token);
-
-  /// Return the right curly bracket.
-  Token get rightBracket;
-
-  /// Set the right curly bracket to the given [token].
-  void set rightBracket(Token token);
-}
-
 /// A set or map literal.
 ///
 ///    setOrMapLiteral ::=
@@ -4724,6 +4471,11 @@
 abstract class SetOrMapLiteral implements TypedLiteral {
   /// Return the syntactic elements used to compute the elements of the set or
   /// map.
+  NodeList<CollectionElement> get elements;
+
+  /// Return the syntactic elements used to compute the elements of the set or
+  /// map.
+  @Deprecated('Replaced by elements')
   NodeList<CollectionElement> get elements2;
 
   /// Return `true` if this literal represents a map literal.
@@ -5499,6 +5251,9 @@
   /// even though they are implicitly final.
   bool get isFinal;
 
+  /// Return `true` if this variable was declared with the 'late' modifier.
+  bool get isLate;
+
   /// Return the name of the variable being declared.
   SimpleIdentifier get name;
 
@@ -5512,10 +5267,10 @@
 ///        finalConstVarOrType [VariableDeclaration] (',' [VariableDeclaration])*
 ///
 ///    finalConstVarOrType ::=
-///      | 'final' [TypeAnnotation]?
+///      'final' 'late'? [TypeAnnotation]?
 ///      | 'const' [TypeAnnotation]?
 ///      | 'var'
-///      | [TypeAnnotation]
+///      | 'late'? [TypeAnnotation]
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class VariableDeclarationList implements AnnotatedNode {
@@ -5529,6 +5284,10 @@
   /// this is a syntactic check rather than a semantic check.)
   bool get isFinal;
 
+  /// Return `true` if the variables in this list were declared with the 'late'
+  /// modifier.
+  bool get isLate;
+
   /// Return the token representing the 'final', 'const' or 'var' keyword, or
   /// `null` if no keyword was included.
   Token get keyword;
@@ -5537,6 +5296,10 @@
   /// given [token].
   void set keyword(Token token);
 
+  /// Return the token representing the 'late' keyword, or `null` if the late
+  /// modifier was not included.
+  Token get lateKeyword;
+
   /// Return the type of the variables being declared, or `null` if no type was
   /// provided.
   TypeAnnotation get type;
diff --git a/analyzer/lib/dart/ast/ast_factory.dart b/analyzer/lib/dart/ast/ast_factory.dart
index b057147..815ad03 100644
--- a/analyzer/lib/dart/ast/ast_factory.dart
+++ b/analyzer/lib/dart/ast/ast_factory.dart
@@ -1,51 +1,40 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:front_end/src/scanner/token.dart';
 import 'package:meta/meta.dart';
 
-/**
- * A collection of factory methods which may be used to create concrete
- * instances of the interfaces that constitute the AST.
- *
- * Clients should not extend, implement or mix-in this class.
- */
+/// A collection of factory methods which may be used to create concrete
+/// instances of the interfaces that constitute the AST.
+///
+/// Clients should not extend, implement or mix-in this class.
 abstract class AstFactory {
-  /**
-   * Returns a newly created list of adjacent strings. To be syntactically
-   * valid, the list of [strings] must contain at least two elements.
-   */
+  /// Returns a newly created list of adjacent strings. To be syntactically
+  /// valid, the list of [strings] must contain at least two elements.
   AdjacentStrings adjacentStrings(List<StringLiteral> strings);
 
-  /**
-   * Returns a newly created annotation. Both the [period] and the
-   * [constructorName] can be `null` if the annotation is not referencing a
-   * named constructor. The [arguments] can be `null` if the annotation is not
-   * referencing a constructor.
-   */
+  /// Returns a newly created annotation. Both the [period] and the
+  /// [constructorName] can be `null` if the annotation is not referencing a
+  /// named constructor. The [arguments] can be `null` if the annotation is not
+  /// referencing a constructor.
   Annotation annotation(Token atSign, Identifier name, Token period,
       SimpleIdentifier constructorName, ArgumentList arguments);
 
-  /**
-   * Returns a newly created list of arguments. The list of [arguments] can
-   * be `null` if there are no arguments.
-   */
+  /// Returns a newly created list of arguments. The list of [arguments] can
+  /// be `null` if there are no arguments.
   ArgumentList argumentList(Token leftParenthesis, List<Expression> arguments,
       Token rightParenthesis);
 
-  /**
-   * Returns a newly created as expression.
-   */
+  /// Returns a newly created as expression.
   AsExpression asExpression(
       Expression expression, Token asOperator, TypeAnnotation type);
 
-  /**
-   * Returns a newly created assert initializer. The [comma] and [message]
-   * can be `null` if there is no message.
-   */
+  /// Returns a newly created assert initializer. The [comma] and [message]
+  /// can be `null` if there is no message.
   AssertInitializer assertInitializer(
       Token assertKeyword,
       Token leftParenthesis,
@@ -54,10 +43,8 @@
       Expression message,
       Token rightParenthesis);
 
-  /**
-   * Returns a newly created assert statement. The [comma] and [message] can
-   * be `null` if there is no message.
-   */
+  /// Returns a newly created assert statement. The [comma] and [message] can
+  /// be `null` if there is no message.
   AssertStatement assertStatement(
       Token assertKeyword,
       Token leftParenthesis,
@@ -67,67 +54,47 @@
       Token rightParenthesis,
       Token semicolon);
 
-  /**
-   * Returns a newly created assignment expression.
-   */
+  /// Returns a newly created assignment expression.
   AssignmentExpression assignmentExpression(
       Expression leftHandSide, Token operator, Expression rightHandSide);
 
-  /**
-   * Returns a newly created await expression.
-   */
+  /// Returns a newly created await expression.
   AwaitExpression awaitExpression(Token awaitKeyword, Expression expression);
 
-  /**
-   * Returns a newly created binary expression.
-   */
+  /// Returns a newly created binary expression.
   BinaryExpression binaryExpression(
       Expression leftOperand, Token operator, Expression rightOperand);
 
-  /**
-   * Returns a newly created block of code.
-   */
+  /// Returns a newly created block of code.
   Block block(
       Token leftBracket, List<Statement> statements, Token rightBracket);
 
-  /**
-   * Returns a block comment consisting of the given [tokens].
-   */
+  /// Returns a block comment consisting of the given [tokens].
   Comment blockComment(List<Token> tokens);
 
-  /**
-   * Returns a newly created function body consisting of a block of
-   * statements. The [keyword] can be `null` if there is no keyword specified
-   * for the block. The [star] can be `null` if there is no star following the
-   * keyword (and must be `null` if there is no keyword).
-   */
+  /// Returns a newly created function body consisting of a block of
+  /// statements. The [keyword] can be `null` if there is no keyword specified
+  /// for the block. The [star] can be `null` if there is no star following the
+  /// keyword (and must be `null` if there is no keyword).
   BlockFunctionBody blockFunctionBody(Token keyword, Token star, Block block);
 
-  /**
-   * Returns a newly created boolean literal.
-   */
+  /// Returns a newly created boolean literal.
   BooleanLiteral booleanLiteral(Token literal, bool value);
 
-  /**
-   * Returns a newly created break statement. The [label] can be `null` if
-   * there is no label associated with the statement.
-   */
+  /// Returns a newly created break statement. The [label] can be `null` if
+  /// there is no label associated with the statement.
   BreakStatement breakStatement(
       Token breakKeyword, SimpleIdentifier label, Token semicolon);
 
-  /**
-   * Returns a newly created cascade expression. The list of
-   * [cascadeSections] must contain at least one element.
-   */
+  /// Returns a newly created cascade expression. The list of
+  /// [cascadeSections] must contain at least one element.
   CascadeExpression cascadeExpression(
       Expression target, List<Expression> cascadeSections);
 
-  /**
-   * Returns a newly created catch clause. The [onKeyword] and
-   * [exceptionType] can be `null` if the clause will catch all exceptions. The
-   * [comma] and [stackTraceParameter] can be `null` if the stack trace
-   * parameter is not defined.
-   */
+  /// Returns a newly created catch clause. The [onKeyword] and [exceptionType]
+  /// can be `null` if the clause will catch all exceptions. The [comma] and
+  /// [stackTraceParameter] can be `null` if the stack trace parameter is not
+  /// defined.
   CatchClause catchClause(
       Token onKeyword,
       TypeAnnotation exceptionType,
@@ -139,16 +106,14 @@
       Token rightParenthesis,
       Block body);
 
-  /**
-   * Returns a newly created class declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the class does not have the
-   * corresponding attribute. The [abstractKeyword] can be `null` if the class
-   * is not abstract. The [typeParameters] can be `null` if the class does not
-   * have any type parameters. Any or all of the [extendsClause], [withClause],
-   * and [implementsClause] can be `null` if the class does not have the
-   * corresponding clause. The list of [members] can be `null` if the class does
-   * not have any members.
-   */
+  /// Returns a newly created class declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the class does not have the
+  /// corresponding attribute. The [abstractKeyword] can be `null` if the class
+  /// is not abstract. The [typeParameters] can be `null` if the class does not
+  /// have any type parameters. Any or all of the [extendsClause], [withClause],
+  /// and [implementsClause] can be `null` if the class does not have the
+  /// corresponding clause. The list of [members] can be `null` if the class
+  /// does not have any members.
   ClassDeclaration classDeclaration(
       Comment comment,
       List<Annotation> metadata,
@@ -163,14 +128,12 @@
       List<ClassMember> members,
       Token rightBracket);
 
-  /**
-   * Returns a newly created class type alias. Either or both of the
-   * [comment] and [metadata] can be `null` if the class type alias does not
-   * have the corresponding attribute. The [typeParameters] can be `null` if the
-   * class does not have any type parameters. The [abstractKeyword] can be
-   * `null` if the class is not abstract. The [implementsClause] can be `null`
-   * if the class does not implement any interfaces.
-   */
+  /// Returns a newly created class type alias. Either or both of the [comment]
+  /// and [metadata] can be `null` if the class type alias does not have the
+  /// corresponding attribute. The [typeParameters] can be `null` if the class
+  /// does not have any type parameters. The [abstractKeyword] can be `null` if
+  /// the class is not abstract. The [implementsClause] can be `null` if the
+  /// class does not implement any interfaces.
   ClassTypeAlias classTypeAlias(
       Comment comment,
       List<Annotation> metadata,
@@ -184,29 +147,41 @@
       ImplementsClause implementsClause,
       Token semicolon);
 
-  /**
-   * Returns a newly created reference to a Dart element. The [newKeyword]
-   * can be `null` if the reference is not to a constructor.
-   */
+  /// Returns a newly created reference to a Dart element. The [newKeyword]
+  /// can be `null` if the reference is not to a constructor.
   CommentReference commentReference(Token newKeyword, Identifier identifier);
 
-  /**
-   * Returns a newly created compilation unit to have the given directives
-   * and declarations. The [scriptTag] can be `null` if there is no script tag
-   * in the compilation unit. The list of [directives] can be `null` if there
-   * are no directives in the compilation unit. The list of [declarations] can
-   * be `null` if there are no declarations in the compilation unit.
-   */
+  /// Returns a newly created compilation unit to have the given directives
+  /// and declarations. The [scriptTag] can be `null` if there is no script tag
+  /// in the compilation unit. The list of [directives] can be `null` if there
+  /// are no directives in the compilation unit. The list of [declarations] can
+  /// be `null` if there are no declarations in the compilation unit.
+  @Deprecated('Use compilationUnit2')
   CompilationUnit compilationUnit(
       Token beginToken,
       ScriptTag scriptTag,
       List<Directive> directives,
       List<CompilationUnitMember> declarations,
-      Token endToken);
+      Token endToken,
+      [FeatureSet featureSet]);
 
-  /**
-   * Returns a newly created conditional expression.
-   */
+  /// Returns a newly created compilation unit to have the given directives and
+  /// declarations.  The [scriptTag] can be `null` (or omitted) if there is no
+  /// script tag in the compilation unit.  The list of [declarations] can be
+  /// `null` (or omitted) if there are no directives in the compilation unit.
+  /// The list of `declarations` can be `null` (or omitted) if there are no
+  /// declarations in the compilation unit.  The [featureSet] can be `null` if
+  /// the set of features for this compilation unit is not known (this
+  /// restricts what analysis can be done of the compilation unit).
+  CompilationUnit compilationUnit2(
+      {@required Token beginToken,
+      ScriptTag scriptTag,
+      List<Directive> directives,
+      List<CompilationUnitMember> declarations,
+      @required Token endToken,
+      @required FeatureSet featureSet});
+
+  /// Returns a newly created conditional expression.
   ConditionalExpression conditionalExpression(
       Expression condition,
       Token question,
@@ -214,9 +189,7 @@
       Token colon,
       Expression elseExpression);
 
-  /**
-   * Returns a newly created configuration.
-   */
+  /// Returns a newly created configuration.
   Configuration configuration(
       Token ifKeyword,
       Token leftParenthesis,
@@ -226,21 +199,19 @@
       Token rightParenthesis,
       StringLiteral libraryUri);
 
-  /**
-   * Returns a newly created constructor declaration. The [externalKeyword]
-   * can be `null` if the constructor is not external. Either or both of the
-   * [comment] and [metadata] can be `null` if the constructor does not have the
-   * corresponding attribute. The [constKeyword] can be `null` if the
-   * constructor cannot be used to create a constant. The [factoryKeyword] can
-   * be `null` if the constructor is not a factory. The [period] and [name] can
-   * both be `null` if the constructor is not a named constructor. The
-   * [separator] can be `null` if the constructor does not have any initializers
-   * and does not redirect to a different constructor. The list of
-   * [initializers] can be `null` if the constructor does not have any
-   * initializers. The [redirectedConstructor] can be `null` if the constructor
-   * does not redirect to a different constructor. The [body] can be `null` if
-   * the constructor does not have a body.
-   */
+  /// Returns a newly created constructor declaration. The [externalKeyword]
+  /// can be `null` if the constructor is not external. Either or both of the
+  /// [comment] and [metadata] can be `null` if the constructor does not have
+  /// the corresponding attribute. The [constKeyword] can be `null` if the
+  /// constructor cannot be used to create a constant. The [factoryKeyword] can
+  /// be `null` if the constructor is not a factory. The [period] and [name] can
+  /// both be `null` if the constructor is not a named constructor. The
+  /// [separator] can be `null` if the constructor does not have any
+  /// initializers and does not redirect to a different constructor. The list of
+  /// [initializers] can be `null` if the constructor does not have any
+  /// initializers. The [redirectedConstructor] can be `null` if the constructor
+  /// does not redirect to a different constructor. The [body] can be `null` if
+  /// the constructor does not have a body.
   ConstructorDeclaration constructorDeclaration(
       Comment comment,
       List<Annotation> metadata,
@@ -256,11 +227,9 @@
       ConstructorName redirectedConstructor,
       FunctionBody body);
 
-  /**
-   * Returns a newly created field initializer to initialize the field with
-   * the given name to the value of the given expression. The [thisKeyword] and
-   * [period] can be `null` if the 'this' keyword was not specified.
-   */
+  /// Returns a newly created field initializer to initialize the field with
+  /// the given name to the value of the given expression. The [thisKeyword] and
+  /// [period] can be `null` if the 'this' keyword was not specified.
   ConstructorFieldInitializer constructorFieldInitializer(
       Token thisKeyword,
       Token period,
@@ -268,26 +237,20 @@
       Token equals,
       Expression expression);
 
-  /**
-   * Returns a newly created constructor name. The [period] and [name] can be
-   * `null` if the constructor being named is the unnamed constructor.
-   */
+  /// Returns a newly created constructor name. The [period] and [name] can be
+  /// `null` if the constructor being named is the unnamed constructor.
   ConstructorName constructorName(
       TypeName type, Token period, SimpleIdentifier name);
 
-  /**
-   * Returns a newly created continue statement. The [label] can be `null` if
-   * there is no label associated with the statement.
-   */
+  /// Returns a newly created continue statement. The [label] can be `null` if
+  /// there is no label associated with the statement.
   ContinueStatement continueStatement(
       Token continueKeyword, SimpleIdentifier label, Token semicolon);
 
-  /**
-   * Returns a newly created formal parameter. Either or both of the
-   * [comment] and [metadata] can be `null` if the declaration does not have the
-   * corresponding attribute. The [keyword] can be `null` if a type name is
-   * given. The [type] must be `null` if the keyword is 'var'.
-   */
+  /// Returns a newly created formal parameter. Either or both of the
+  /// [comment] and [metadata] can be `null` if the declaration does not have
+  /// the corresponding attribute. The [keyword] can be `null` if a type name is
+  /// given. The [type] must be `null` if the keyword is 'var'.
   DeclaredIdentifier declaredIdentifier(
       Comment comment,
       List<Annotation> metadata,
@@ -295,23 +258,17 @@
       TypeAnnotation type,
       SimpleIdentifier identifier);
 
-  /**
-   * Returns a newly created default formal parameter. The [separator] and
-   * [defaultValue] can be `null` if there is no default value.
-   */
+  /// Returns a newly created default formal parameter. The [separator] and
+  /// [defaultValue] can be `null` if there is no default value.
   DefaultFormalParameter defaultFormalParameter(NormalFormalParameter parameter,
       ParameterKind kind, Token separator, Expression defaultValue);
 
-  /**
-   * Returns a documentation comment consisting of the given [tokens] and having
-   * the given [references] (if supplied) embedded within it.
-   */
+  /// Returns a documentation comment consisting of the given [tokens] and
+  /// having the given [references] (if supplied) embedded within it.
   Comment documentationComment(List<Token> tokens,
       [List<CommentReference> references]);
 
-  /**
-   * Returns a newly created do loop.
-   */
+  /// Returns a newly created do loop.
   DoStatement doStatement(
       Token doKeyword,
       Statement body,
@@ -321,46 +278,32 @@
       Token rightParenthesis,
       Token semicolon);
 
-  /**
-   * Returns a newly created dotted name.
-   */
+  /// Returns a newly created dotted name.
   DottedName dottedName(List<SimpleIdentifier> components);
 
-  /**
-   * Returns a newly created floating point literal.
-   */
+  /// Returns a newly created floating point literal.
   DoubleLiteral doubleLiteral(Token literal, double value);
 
-  /**
-   * Returns a newly created function body.
-   */
+  /// Returns a newly created function body.
   EmptyFunctionBody emptyFunctionBody(Token semicolon);
 
-  /**
-   * Returns a newly created empty statement.
-   */
+  /// Returns a newly created empty statement.
   EmptyStatement emptyStatement(Token semicolon);
 
-  /**
-   * Returns an end-of-line comment consisting of the given [tokens].
-   */
+  /// Returns an end-of-line comment consisting of the given [tokens].
   Comment endOfLineComment(List<Token> tokens);
 
-  /**
-   * Returns a newly created enum constant declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the constant does not have the
-   * corresponding attribute. (Technically, enum constants cannot have metadata,
-   * but we allow it for consistency.)
-   */
+  /// Returns a newly created enum constant declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the constant does not have the
+  /// corresponding attribute. (Technically, enum constants cannot have
+  /// metadata, but we allow it for consistency.)
   EnumConstantDeclaration enumConstantDeclaration(
       Comment comment, List<Annotation> metadata, SimpleIdentifier name);
 
-  /**
-   * Returns a newly created enumeration declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the declaration does not have the
-   * corresponding attribute. The list of [constants] must contain at least one
-   * value.
-   */
+  /// Returns a newly created enumeration declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the declaration does not have
+  /// the corresponding attribute. The list of [constants] must contain at least
+  /// one value.
   EnumDeclaration enumDeclaration(
       Comment comment,
       List<Annotation> metadata,
@@ -370,12 +313,10 @@
       List<EnumConstantDeclaration> constants,
       Token rightBracket);
 
-  /**
-   * Returns a newly created export directive. Either or both of the
-   * [comment] and [metadata] can be `null` if the directive does not have the
-   * corresponding attribute. The list of [combinators] can be `null` if there
-   * are no combinators.
-   */
+  /// Returns a newly created export directive. Either or both of the
+  /// [comment] and [metadata] can be `null` if the directive does not have the
+  /// corresponding attribute. The list of [combinators] can be `null` if there
+  /// are no combinators.
   ExportDirective exportDirective(
       Comment comment,
       List<Annotation> metadata,
@@ -385,43 +326,33 @@
       List<Combinator> combinators,
       Token semicolon);
 
-  /**
-   * Returns a newly created function body consisting of a block of
-   * statements. The [keyword] can be `null` if the function body is not an
-   * async function body.
-   */
+  /// Returns a newly created function body consisting of a block of statements.
+  /// The [keyword] can be `null` if the function body is not an async function
+  /// body.
   ExpressionFunctionBody expressionFunctionBody(Token keyword,
       Token functionDefinition, Expression expression, Token semicolon);
 
-  /**
-   * Returns a newly created expression statement.
-   */
+  /// Returns a newly created expression statement.
   ExpressionStatement expressionStatement(
       Expression expression, Token semicolon);
 
-  /**
-   * Returns a newly created extends clause.
-   */
+  /// Returns a newly created extends clause.
   ExtendsClause extendsClause(Token extendsKeyword, TypeName superclass);
 
-  /**
-   * Returns a newly created field declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the declaration does not have the
-   * corresponding attribute. The [staticKeyword] can be `null` if the field is
-   * not a static field.
-   *
-   * Use [fieldDeclaration2] instead.
-   */
+  /// Returns a newly created field declaration. Either or both of the [comment]
+  /// and [metadata] can be `null` if the declaration does not have the
+  /// corresponding attribute. The [staticKeyword] can be `null` if the field is
+  /// not a static field.
+  ///
+  /// Use [fieldDeclaration2] instead.
   @deprecated
   FieldDeclaration fieldDeclaration(Comment comment, List<Annotation> metadata,
       Token staticKeyword, VariableDeclarationList fieldList, Token semicolon);
 
-  /**
-   * Returns a newly created field declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the declaration does not have the
-   * corresponding attribute. The [staticKeyword] can be `null` if the field is
-   * not a static field.
-   */
+  /// Returns a newly created field declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the declaration does not have
+  /// the corresponding attribute. The [staticKeyword] can be `null` if the
+  /// field is not a static field.
   FieldDeclaration fieldDeclaration2(
       {Comment comment,
       List<Annotation> metadata,
@@ -430,17 +361,15 @@
       @required VariableDeclarationList fieldList,
       @required Token semicolon});
 
-  /**
-   * Returns 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. The [keyword] can be `null` if there is a type.
-   * The [type] must be `null` if the keyword is 'var'. The [thisKeyword] and
-   * [period] can be `null` if the keyword 'this' was not provided.  The
-   * [parameters] can be `null` if this is not a function-typed field formal
-   * parameter.
-   *
-   * Use [fieldFormalParameter2] instead.
-   */
+  /// Returns 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. The [keyword] can be `null` if there is a type.
+  /// The [type] must be `null` if the keyword is 'var'. The [thisKeyword] and
+  /// [period] can be `null` if the keyword 'this' was not provided.  The
+  /// [parameters] can be `null` if this is not a function-typed field formal
+  /// parameter.
+  ///
+  /// Use [fieldFormalParameter2] instead.
   @deprecated
   FieldFormalParameter fieldFormalParameter(
       Comment comment,
@@ -453,19 +382,18 @@
       TypeParameterList typeParameters,
       FormalParameterList parameters);
 
-  /**
-   * Returns 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. The [keyword] can be `null` if there is a type.
-   * The [type] must be `null` if the keyword is 'var'. The [thisKeyword] and
-   * [period] can be `null` if the keyword 'this' was not provided.  The
-   * [parameters] can be `null` if this is not a function-typed field formal
-   * parameter.
-   */
+  /// Returns 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. The [keyword] can be `null` if there is a type.
+  /// The [type] must be `null` if the keyword is 'var'. The [thisKeyword] and
+  /// [period] can be `null` if the keyword 'this' was not provided.  The
+  /// [parameters] can be `null` if this is not a function-typed field formal
+  /// parameter.
   FieldFormalParameter fieldFormalParameter2(
       {Comment comment,
       List<Annotation> metadata,
       Token covariantKeyword,
+      Token requiredKeyword,
       Token keyword,
       TypeAnnotation type,
       @required Token thisKeyword,
@@ -474,23 +402,17 @@
       TypeParameterList typeParameters,
       FormalParameterList parameters});
 
-  /**
-   * Returns a newly created for each part that includes a declaration.
-   */
+  /// Returns a newly created for each part that includes a declaration.
   ForEachPartsWithDeclaration forEachPartsWithDeclaration(
       {DeclaredIdentifier loopVariable, Token inKeyword, Expression iterable});
 
-  /**
-   * Returns a newly created for each part that includes an identifier that is
-   * declared outside of the loop.
-   */
+  /// Returns a newly created for each part that includes an identifier that is
+  /// declared outside of the loop.
   ForEachPartsWithIdentifier forEachPartsWithIdentifier(
       {SimpleIdentifier identifier, Token inKeyword, Expression iterable});
 
-  /**
-   * Returns a newly created for element that can be part of a list, map or set
-   * literal.
-   */
+  /// Returns a newly created for element that can be part of a list, map or set
+  /// literal.
   ForElement forElement(
       {Token awaitKeyword,
       Token forKeyword,
@@ -499,11 +421,9 @@
       Token rightParenthesis,
       CollectionElement body});
 
-  /**
-   * Returns a newly created parameter list. The list of [parameters] can be
-   * `null` if there are no parameters. The [leftDelimiter] and [rightDelimiter]
-   * can be `null` if there are no optional parameters.
-   */
+  /// Returns a newly created parameter list. The list of [parameters] can be
+  /// `null` if there are no parameters. The [leftDelimiter] and
+  /// [rightDelimiter] can be `null` if there are no optional parameters.
   FormalParameterList formalParameterList(
       Token leftParenthesis,
       List<FormalParameter> parameters,
@@ -511,9 +431,7 @@
       Token rightDelimiter,
       Token rightParenthesis);
 
-  /**
-   * Returns a newly created for part that includes a declaration.
-   */
+  /// Returns a newly created for part that includes a declaration.
   ForPartsWithDeclarations forPartsWithDeclarations(
       {VariableDeclarationList variables,
       Token leftSeparator,
@@ -521,9 +439,7 @@
       Token rightSeparator,
       List<Expression> updaters});
 
-  /**
-   * Returns a newly created for part that includes an expression.
-   */
+  /// Returns a newly created for part that includes an expression.
   ForPartsWithExpression forPartsWithExpression(
       {Expression initialization,
       Token leftSeparator,
@@ -531,10 +447,8 @@
       Token rightSeparator,
       List<Expression> updaters});
 
-  /**
-   * Returns a newly created for statement.
-   */
-  ForStatement2 forStatement2(
+  /// Returns a newly created for statement.
+  ForStatement forStatement(
       {Token awaitKeyword,
       Token forKeyword,
       Token leftParenthesis,
@@ -542,14 +456,22 @@
       Token rightParenthesis,
       Statement body});
 
-  /**
-   * Returns a newly created function declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the function does not have the
-   * corresponding attribute. The [externalKeyword] can be `null` if the
-   * function is not an external function. The [returnType] can be `null` if no
-   * return type was specified. The [propertyKeyword] can be `null` if the
-   * function is neither a getter or a setter.
-   */
+  /// Returns a newly created for statement.
+  @Deprecated('Replaced by forStatement')
+  ForStatement forStatement2(
+      {Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
+      ForLoopParts forLoopParts,
+      Token rightParenthesis,
+      Statement body});
+
+  /// Returns a newly created function declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the function does not have the
+  /// corresponding attribute. The [externalKeyword] can be `null` if the
+  /// function is not an external function. The [returnType] can be `null` if no
+  /// return type was specified. The [propertyKeyword] can be `null` if the
+  /// function is neither a getter or a setter.
   FunctionDeclaration functionDeclaration(
       Comment comment,
       List<Annotation> metadata,
@@ -559,31 +481,23 @@
       SimpleIdentifier name,
       FunctionExpression functionExpression);
 
-  /**
-   * Returns a newly created function declaration statement.
-   */
+  /// Returns a newly created function declaration statement.
   FunctionDeclarationStatement functionDeclarationStatement(
       FunctionDeclaration functionDeclaration);
 
-  /**
-   * Returns a newly created function declaration.
-   */
+  /// Returns a newly created function declaration.
   FunctionExpression functionExpression(TypeParameterList typeParameters,
       FormalParameterList parameters, FunctionBody body);
 
-  /**
-   * Returns a newly created function expression invocation.
-   */
+  /// Returns a newly created function expression invocation.
   FunctionExpressionInvocation functionExpressionInvocation(Expression function,
       TypeArgumentList typeArguments, ArgumentList argumentList);
 
-  /**
-   * Returns a newly created function type alias. Either or both of the
-   * [comment] and [metadata] can be `null` if the function does not have the
-   * corresponding attribute. The [returnType] can be `null` if no return type
-   * was specified. The [typeParameters] can be `null` if the function has no
-   * type parameters.
-   */
+  /// Returns a newly created function type alias. Either or both of the
+  /// [comment] and [metadata] can be `null` if the function does not have the
+  /// corresponding attribute. The [returnType] can be `null` if no return type
+  /// was specified. The [typeParameters] can be `null` if the function has no
+  /// type parameters.
   FunctionTypeAlias functionTypeAlias(
       Comment comment,
       List<Annotation> metadata,
@@ -594,14 +508,12 @@
       FormalParameterList parameters,
       Token semicolon);
 
-  /**
-   * Returns 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. The [returnType] can be `null` if no return type
-   * was specified.
-   *
-   * Use [functionTypedFormalParameter2] instead.
-   */
+  /// Returns 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. The [returnType] can be `null` if no return type
+  /// was specified.
+  ///
+  /// Use [functionTypedFormalParameter2] instead.
   @deprecated
   FunctionTypedFormalParameter functionTypedFormalParameter(
       Comment comment,
@@ -611,24 +523,21 @@
       TypeParameterList typeParameters,
       FormalParameterList parameters);
 
-  /**
-   * Returns 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. The [returnType] can be `null` if no return type
-   * was specified.
-   */
+  /// Returns 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. The [returnType] can be `null` if no return type
+  /// was specified.
   FunctionTypedFormalParameter functionTypedFormalParameter2(
       {Comment comment,
       List<Annotation> metadata,
       Token covariantKeyword,
+      Token requiredKeyword,
       TypeAnnotation returnType,
       @required SimpleIdentifier identifier,
       TypeParameterList typeParameters,
       @required FormalParameterList parameters});
 
-  /**
-   * Initialize a newly created generic function type.
-   */
+  /// Initialize a newly created generic function type.
   GenericFunctionType genericFunctionType(
       TypeAnnotation returnType,
       Token functionKeyword,
@@ -636,12 +545,10 @@
       FormalParameterList parameters,
       {Token question});
 
-  /**
-   * Returns a newly created generic type alias. Either or both of the
-   * [comment] and [metadata] can be `null` if the variable list does not have
-   * the corresponding attribute. The [typeParameters] can be `null` if there
-   * are no type parameters.
-   */
+  /// Returns a newly created generic type alias. Either or both of the
+  /// [comment] and [metadata] can be `null` if the variable list does not have
+  /// the corresponding attribute. The [typeParameters] can be `null` if there
+  /// are no type parameters.
   GenericTypeAlias genericTypeAlias(
       Comment comment,
       List<Annotation> metadata,
@@ -652,16 +559,12 @@
       GenericFunctionType functionType,
       Token semicolon);
 
-  /**
-   * Returns a newly created import show combinator.
-   */
+  /// Returns a newly created import show combinator.
   HideCombinator hideCombinator(
       Token keyword, List<SimpleIdentifier> hiddenNames);
 
-  /**
-   * Returns a newly created if element that can be part of a list, map or set
-   * literal.
-   */
+  /// Returns a newly created if element that can be part of a list, map or set
+  /// literal.
   IfElement ifElement(
       {Token ifKeyword,
       Token leftParenthesis,
@@ -671,10 +574,8 @@
       Token elseKeyword,
       CollectionElement elseElement});
 
-  /**
-   * Returns a newly created if statement. The [elseKeyword] and
-   * [elseStatement] can be `null` if there is no else clause.
-   */
+  /// Returns a newly created if statement. The [elseKeyword] and
+  /// [elseStatement] can be `null` if there is no else clause.
   IfStatement ifStatement(
       Token ifKeyword,
       Token leftParenthesis,
@@ -684,20 +585,16 @@
       Token elseKeyword,
       Statement elseStatement);
 
-  /**
-   * Returns a newly created implements clause.
-   */
+  /// Returns a newly created implements clause.
   ImplementsClause implementsClause(
       Token implementsKeyword, List<TypeName> interfaces);
 
-  /**
-   * Returns a newly created import directive. Either or both of the
-   * [comment] and [metadata] can be `null` if the function does not have the
-   * corresponding attribute. The [deferredKeyword] can be `null` if the import
-   * is not deferred. The [asKeyword] and [prefix] can be `null` if the import
-   * does not specify a prefix. The list of [combinators] can be `null` if there
-   * are no combinators.
-   */
+  /// Returns a newly created import directive. Either or both of the
+  /// [comment] and [metadata] can be `null` if the function does not have the
+  /// corresponding attribute. The [deferredKeyword] can be `null` if the import
+  /// is not deferred. The [asKeyword] and [prefix] can be `null` if the import
+  /// does not specify a prefix. The list of [combinators] can be `null` if
+  /// there are no combinators.
   ImportDirective importDirective(
       Comment comment,
       List<Annotation> metadata,
@@ -710,129 +607,70 @@
       List<Combinator> combinators,
       Token semicolon);
 
-  /**
-   * Returns a newly created index expression.
-   */
+  /// Returns a newly created index expression.
   IndexExpression indexExpressionForCascade(
       Token period, Token leftBracket, Expression index, Token rightBracket);
 
-  /**
-   * Returns a newly created index expression.
-   */
+  /// Returns a newly created index expression.
   IndexExpression indexExpressionForTarget(Expression target, Token leftBracket,
       Expression index, Token rightBracket);
 
-  /**
-   * Returns a newly created instance creation expression.
-   */
+  /// Returns a newly created instance creation expression.
   InstanceCreationExpression instanceCreationExpression(
       Token keyword, ConstructorName constructorName, ArgumentList argumentList,
       {TypeArgumentList typeArguments});
 
-  /**
-   * Returns a newly created integer literal.
-   */
+  /// Returns a newly created integer literal.
   IntegerLiteral integerLiteral(Token literal, int value);
 
-  /**
-   * Returns a newly created interpolation expression.
-   */
+  /// Returns a newly created interpolation expression.
   InterpolationExpression interpolationExpression(
       Token leftBracket, Expression expression, Token rightBracket);
 
-  /**
-   * Returns a newly created string of characters that are part of a string
-   * interpolation.
-   */
+  /// Returns a newly created string of characters that are part of a string
+  /// interpolation.
   InterpolationString interpolationString(Token contents, String value);
 
-  /**
-   * Returns a newly created is expression. The [notOperator] can be `null`
-   * if the sense of the test is not negated.
-   */
+  /// Returns a newly created is expression. The [notOperator] can be `null`
+  /// if the sense of the test is not negated.
   IsExpression isExpression(Expression expression, Token isOperator,
       Token notOperator, TypeAnnotation type);
 
-  /**
-   * Returns a newly created label.
-   */
+  /// Returns a newly created label.
   Label label(SimpleIdentifier label, Token colon);
 
-  /**
-   * Returns a newly created labeled statement.
-   */
+  /// Returns a newly created labeled statement.
   LabeledStatement labeledStatement(List<Label> labels, Statement statement);
 
-  /**
-   * Returns a newly created library directive. Either or both of the
-   * [comment] and [metadata] can be `null` if the directive does not have the
-   * corresponding attribute.
-   */
+  /// Returns a newly created library directive. Either or both of the
+  /// [comment] and [metadata] can be `null` if the directive does not have the
+  /// corresponding attribute.
   LibraryDirective libraryDirective(Comment comment, List<Annotation> metadata,
       Token libraryKeyword, LibraryIdentifier name, Token semicolon);
 
-  /**
-   * Returns a newly created prefixed identifier.
-   */
+  /// Returns a newly created prefixed identifier.
   LibraryIdentifier libraryIdentifier(List<SimpleIdentifier> components);
 
-  /**
-   * Returns a newly created list literal. The [constKeyword] can be `null`
-   * if the literal is not a constant. The [typeArguments] can be `null` if no
-   * type arguments were declared. The list of [elements] can be `null` if the
-   * list is empty.
-   */
+  /// Returns a newly created list literal. The [constKeyword] can be `null`
+  /// if the literal is not a constant. The [typeArguments] can be `null` if no
+  /// type arguments were declared. The list of [elements] can be `null` if the
+  /// list is empty.
   ListLiteral listLiteral(Token constKeyword, TypeArgumentList typeArguments,
       Token leftBracket, List<CollectionElement> elements, Token rightBracket);
 
-  /**
-   * Returns a newly created list literal.
-   */
-  @Deprecated('Use listLiteral')
-  ListLiteral2 listLiteral2(
-      {Token constKeyword,
-      TypeArgumentList typeArguments,
-      Token leftBracket,
-      List<CollectionElement> elements,
-      Token rightBracket});
-
-  /**
-   * Returns a newly created map literal. The [constKeyword] can be `null` if
-   * the literal is not a constant. The [typeArguments] can be `null` if no type
-   * arguments were declared. The [entries] can be `null` if the map is empty.
-   */
-  @Deprecated('Use setOrMapLiteral')
-  MapLiteral mapLiteral(Token constKeyword, TypeArgumentList typeArguments,
-      Token leftBracket, List<MapLiteralEntry> entries, Token rightBracket);
-
-  /**
-   * Returns a newly created map literal.
-   */
-  @Deprecated('Use setOrMapLiteral')
-  MapLiteral2 mapLiteral2(
-      {Token constKeyword,
-      TypeArgumentList typeArguments,
-      Token leftBracket,
-      List<CollectionElement> entries,
-      Token rightBracket});
-
-  /**
-   * Returns a newly created map literal entry.
-   */
+  /// Returns a newly created map literal entry.
   MapLiteralEntry mapLiteralEntry(
       Expression key, Token separator, Expression value);
 
-  /**
-   * Returns a newly created method declaration. Either or both of the
-   * [comment] and [metadata] can be `null` if the declaration does not have the
-   * corresponding attribute. The [externalKeyword] can be `null` if the method
-   * is not external. The [modifierKeyword] can be `null` if the method is
-   * neither abstract nor static. The [returnType] can be `null` if no return
-   * type was specified. The [propertyKeyword] can be `null` if the method is
-   * neither a getter or a setter. The [operatorKeyword] can be `null` if the
-   * method does not implement an operator. The [parameters] must be `null` if
-   * this method declares a getter.
-   */
+  /// Returns a newly created method declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the declaration does not have
+  /// the corresponding attribute. The [externalKeyword] can be `null` if the
+  /// method is not external. The [modifierKeyword] can be `null` if the method
+  /// is neither abstract nor static. The [returnType] can be `null` if no
+  /// return type was specified. The [propertyKeyword] can be `null` if the
+  /// method is neither a getter or a setter. The [operatorKeyword] can be
+  /// `null` if the method does not implement an operator. The [parameters] must
+  /// be `null` if this method declares a getter.
   MethodDeclaration methodDeclaration(
       Comment comment,
       List<Annotation> metadata,
@@ -846,10 +684,8 @@
       FormalParameterList parameters,
       FunctionBody body);
 
-  /**
-   * Returns a newly created method invocation. The [target] and [operator]
-   * can be `null` if there is no target.
-   */
+  /// Returns a newly created method invocation. The [target] and [operator]
+  /// can be `null` if there is no target.
   MethodInvocation methodInvocation(
       Expression target,
       Token operator,
@@ -857,9 +693,7 @@
       TypeArgumentList typeArguments,
       ArgumentList argumentList);
 
-  /**
-   * Return a newly created mixin declaration.
-   */
+  /// Return a newly created mixin declaration.
   MixinDeclaration mixinDeclaration(
       Comment comment,
       List<Annotation> metadata,
@@ -872,59 +706,41 @@
       List<ClassMember> members,
       Token rightBracket);
 
-  /**
-   * Returns a newly created named expression..
-   */
+  /// Returns a newly created named expression.
   NamedExpression namedExpression(Label name, Expression expression);
 
-  /**
-   * Returns a newly created native clause.
-   */
+  /// Returns a newly created native clause.
   NativeClause nativeClause(Token nativeKeyword, StringLiteral name);
 
-  /**
-   * Returns a newly created function body consisting of the 'native' token,
-   * a string literal, and a semicolon.
-   */
+  /// Returns a newly created function body consisting of the 'native' token,
+  /// a string literal, and a semicolon.
   NativeFunctionBody nativeFunctionBody(
       Token nativeKeyword, StringLiteral stringLiteral, Token semicolon);
 
-  /**
-   * Returns a newly created list of nodes such that all of the nodes that
-   * are added to the list will have their parent set to the given [owner]. The
-   * list will initially be populated with the given [elements].
-   */
+  /// Returns a newly created list of nodes such that all of the nodes that
+  /// are added to the list will have their parent set to the given [owner]. The
+  /// list will initially be populated with the given [elements].
   NodeList<E> nodeList<E extends AstNode>(AstNode owner, [List<E> elements]);
 
-  /**
-   * Returns a newly created null literal.
-   */
+  /// Returns a newly created null literal.
   NullLiteral nullLiteral(Token literal);
 
-  /**
-   * Return a newly created on clause.
-   */
+  /// Return a newly created on clause.
   OnClause onClause(Token onKeyword, List<TypeName> superclassConstraints);
 
-  /**
-   * Returns a newly created parenthesized expression.
-   */
+  /// Returns a newly created parenthesized expression.
   ParenthesizedExpression parenthesizedExpression(
       Token leftParenthesis, Expression expression, Token rightParenthesis);
 
-  /**
-   * Returns a newly created part directive. Either or both of the [comment]
-   * and [metadata] can be `null` if the directive does not have the
-   * corresponding attribute.
-   */
+  /// Returns a newly created part directive. Either or both of the [comment]
+  /// and [metadata] can be `null` if the directive does not have the
+  /// corresponding attribute.
   PartDirective partDirective(Comment comment, List<Annotation> metadata,
       Token partKeyword, StringLiteral partUri, Token semicolon);
 
-  /**
-   * Returns a newly created part-of directive. Either or both of the
-   * [comment] and [metadata] can be `null` if the directive does not have the
-   * corresponding attribute.
-   */
+  /// Returns a newly created part-of directive. Either or both of the
+  /// [comment] and [metadata] can be `null` if the directive does not have the
+  /// corresponding attribute.
   PartOfDirective partOfDirective(
       Comment comment,
       List<Annotation> metadata,
@@ -934,83 +750,44 @@
       LibraryIdentifier libraryName,
       Token semicolon);
 
-  /**
-   * Returns a newly created postfix expression.
-   */
+  /// Returns a newly created postfix expression.
   PostfixExpression postfixExpression(Expression operand, Token operator);
 
-  /**
-   * Returns a newly created prefixed identifier.
-   */
+  /// Returns a newly created prefixed identifier.
   PrefixedIdentifier prefixedIdentifier(
       SimpleIdentifier prefix, Token period, SimpleIdentifier identifier);
 
-  /**
-   * Returns a newly created prefix expression.
-   */
+  /// Returns a newly created prefix expression.
   PrefixExpression prefixExpression(Token operator, Expression operand);
 
-  /**
-   * Returns a newly created property access expression.
-   */
+  /// Returns a newly created property access expression.
   PropertyAccess propertyAccess(
       Expression target, Token operator, SimpleIdentifier propertyName);
 
-  /**
-   * Returns a newly created redirecting invocation to invoke the constructor
-   * with the given name with the given arguments. The [constructorName] can be
-   * `null` if the constructor being invoked is the unnamed constructor.
-   */
+  /// Returns a newly created redirecting invocation to invoke the constructor
+  /// with the given name with the given arguments. The [constructorName] can be
+  /// `null` if the constructor being invoked is the unnamed constructor.
   RedirectingConstructorInvocation redirectingConstructorInvocation(
       Token thisKeyword,
       Token period,
       SimpleIdentifier constructorName,
       ArgumentList argumentList);
 
-  /**
-   * Returns a newly created rethrow expression.
-   */
+  /// Returns a newly created rethrow expression.
   RethrowExpression rethrowExpression(Token rethrowKeyword);
 
-  /**
-   * Returns a newly created return statement. The [expression] can be `null`
-   * if no explicit value was provided.
-   */
+  /// Returns a newly created return statement. The [expression] can be `null`
+  /// if no explicit value was provided.
   ReturnStatement returnStatement(
       Token returnKeyword, Expression expression, Token semicolon);
 
-  /**
-   * Returns a newly created script tag.
-   */
+  /// Returns a newly created script tag.
   ScriptTag scriptTag(Token scriptTag);
 
-  /**
-   * Returns a newly created set literal. The [constKeyword] can be `null`
-   * if the literal is not a constant. The [typeArguments] can be `null` if no
-   * type arguments were declared. The list of [elements] can be `null` if the
-   * set is empty.
-   */
-  @Deprecated('Use setOrMapLiteral')
-  SetLiteral setLiteral(Token constKeyword, TypeArgumentList typeArguments,
-      Token leftBracket, List<Expression> elements, Token rightBracket);
-
-  /**
-   * Returns a newly created set literal.
-   */
-  @Deprecated('Use setOrMapLiteral')
-  SetLiteral2 setLiteral2(
-      {Token constKeyword,
-      TypeArgumentList typeArguments,
-      Token leftBracket,
-      List<CollectionElement> elements,
-      Token rightBracket});
-
-  /**
-   * Returns a newly created set or map literal. The [constKeyword] can be
-   * `null` if the literal is not a constant. The [typeArguments] can be `null`
-   * if no type arguments were declared. The list of [elements] can be `null` if
-   * the set or map is empty.
-   */
+  /// Returns a newly created set or map literal. The [constKeyword] can be
+  /// `null` if the literal is not a constant. The [typeArguments] can be `null`
+  /// if no type arguments were declared. The list of [elements] can be `null`
+  /// if the set or map is empty.
   SetOrMapLiteral setOrMapLiteral(
       {Token constKeyword,
       TypeArgumentList typeArguments,
@@ -1018,20 +795,16 @@
       List<CollectionElement> elements,
       Token rightBracket});
 
-  /**
-   * Returns a newly created import show combinator.
-   */
+  /// Returns a newly created import show combinator.
   ShowCombinator showCombinator(
       Token keyword, List<SimpleIdentifier> shownNames);
 
-  /**
-   * Returns 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. The [keyword] can be `null` if a type was
-   * specified. The [type] must be `null` if the keyword is 'var'.
-   *
-   * Use [simpleFormalParameter2] instead.
-   */
+  /// Returns 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. The [keyword] can be `null` if a type was
+  /// specified. The [type] must be `null` if the keyword is 'var'.
+  ///
+  /// Use [simpleFormalParameter2] instead.
   @deprecated
   SimpleFormalParameter simpleFormalParameter(
       Comment comment,
@@ -1040,75 +813,56 @@
       TypeAnnotation type,
       SimpleIdentifier identifier);
 
-  /**
-   * Returns 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. The [keyword] can be `null` if a type was
-   * specified. The [type] must be `null` if the keyword is 'var'.
-   */
+  /// Returns 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. The [keyword] can be `null` if a type was
+  /// specified. The [type] must be `null` if the keyword is 'var'.
   SimpleFormalParameter simpleFormalParameter2(
       {Comment comment,
       List<Annotation> metadata,
       Token covariantKeyword,
+      Token requiredKeyword,
       Token keyword,
       TypeAnnotation type,
       @required SimpleIdentifier identifier});
 
-  /**
-   * Returns a newly created identifier.
-   */
+  /// Returns a newly created identifier.
   SimpleIdentifier simpleIdentifier(Token token, {bool isDeclaration: false});
 
-  /**
-   * Returns a newly created simple string literal.
-   */
+  /// Returns a newly created simple string literal.
   SimpleStringLiteral simpleStringLiteral(Token literal, String value);
 
-  /**
-   * Returns a newly created spread element.
-   */
+  /// Returns a newly created spread element.
   SpreadElement spreadElement({Token spreadOperator, Expression expression});
 
-  /**
-   * Returns a newly created string interpolation expression.
-   */
+  /// Returns a newly created string interpolation expression.
   StringInterpolation stringInterpolation(List<InterpolationElement> elements);
 
-  /**
-   * Returns a newly created super invocation to invoke the inherited
-   * constructor with the given name with the given arguments. The [period] and
-   * [constructorName] can be `null` if the constructor being invoked is the
-   * unnamed constructor.
-   */
+  /// Returns a newly created super invocation to invoke the inherited
+  /// constructor with the given name with the given arguments. The [period] and
+  /// [constructorName] can be `null` if the constructor being invoked is the
+  /// unnamed constructor.
   SuperConstructorInvocation superConstructorInvocation(
       Token superKeyword,
       Token period,
       SimpleIdentifier constructorName,
       ArgumentList argumentList);
 
-  /**
-   * Returns a newly created super expression.
-   */
+  /// Returns a newly created super expression.
   SuperExpression superExpression(Token superKeyword);
 
-  /**
-   * Returns a newly created switch case. The list of [labels] can be `null`
-   * if there are no labels.
-   */
+  /// Returns a newly created switch case. The list of [labels] can be `null`
+  /// if there are no labels.
   SwitchCase switchCase(List<Label> labels, Token keyword,
       Expression expression, Token colon, List<Statement> statements);
 
-  /**
-   * Returns a newly created switch default. The list of [labels] can be
-   * `null` if there are no labels.
-   */
+  /// Returns a newly created switch default. The list of [labels] can be
+  /// `null` if there are no labels.
   SwitchDefault switchDefault(List<Label> labels, Token keyword, Token colon,
       List<Statement> statements);
 
-  /**
-   * Returns a newly created switch statement. The list of [members] can be
-   * `null` if there are no switch members.
-   */
+  /// Returns a newly created switch statement. The list of [members] can be
+  /// `null` if there are no switch members.
   SwitchStatement switchStatement(
       Token switchKeyword,
       Token leftParenthesis,
@@ -1118,82 +872,62 @@
       List<SwitchMember> members,
       Token rightBracket);
 
-  /**
-   * Returns a newly created symbol literal.
-   */
+  /// Returns a newly created symbol literal.
   SymbolLiteral symbolLiteral(Token poundSign, List<Token> components);
 
-  /**
-   * Returns a newly created this expression.
-   */
+  /// Returns a newly created this expression.
   ThisExpression thisExpression(Token thisKeyword);
 
-  /**
-   * Returns a newly created throw expression.
-   */
+  /// Returns a newly created throw expression.
   ThrowExpression throwExpression(Token throwKeyword, Expression expression);
 
-  /**
-   * Returns a newly created top-level variable declaration. Either or both
-   * of the [comment] and [metadata] can be `null` if the variable does not have
-   * the corresponding attribute.
-   */
+  /// Returns a newly created top-level variable declaration. Either or both
+  /// of the [comment] and [metadata] can be `null` if the variable does not
+  /// have the corresponding attribute.
   TopLevelVariableDeclaration topLevelVariableDeclaration(
       Comment comment,
       List<Annotation> metadata,
       VariableDeclarationList variableList,
       Token semicolon);
 
-  /**
-   * Returns a newly created try statement. The list of [catchClauses] can be
-   * `null` if there are no catch clauses. The [finallyKeyword] and
-   * [finallyBlock] can be `null` if there is no finally clause.
-   */
+  /// Returns a newly created try statement. The list of [catchClauses] can be
+  /// `null` if there are no catch clauses. The [finallyKeyword] and
+  /// [finallyBlock] can be `null` if there is no finally clause.
   TryStatement tryStatement(Token tryKeyword, Block body,
       List<CatchClause> catchClauses, Token finallyKeyword, Block finallyBlock);
 
-  /**
-   * Returns a newly created list of type arguments.
-   */
+  /// Returns a newly created list of type arguments.
   TypeArgumentList typeArgumentList(
       Token leftBracket, List<TypeAnnotation> arguments, Token rightBracket);
 
-  /**
-   * Returns a newly created type name. The [typeArguments] can be `null` if
-   * there are no type arguments. The [question] can be `null` if there is no
-   * question mark.
-   */
+  /// Returns a newly created type name. The [typeArguments] can be `null` if
+  /// there are no type arguments. The [question] can be `null` if there is no
+  /// question mark.
   TypeName typeName(Identifier name, TypeArgumentList typeArguments,
       {Token question});
 
-  /**
-   * Returns a newly created type parameter. Either or both of the [comment]
-   * and [metadata] can be `null` if the parameter does not have the
-   * corresponding attribute. The [extendsKeyword] and [bound] can be `null` if
-   * the parameter does not have an upper bound.
-   */
+  /// Returns a newly created type parameter. Either or both of the [comment]
+  /// and [metadata] can be `null` if the parameter does not have the
+  /// corresponding attribute. The [extendsKeyword] and [bound] can be `null` if
+  /// the parameter does not have an upper bound.
   TypeParameter typeParameter(Comment comment, List<Annotation> metadata,
       SimpleIdentifier name, Token extendsKeyword, TypeAnnotation bound);
 
-  /**
-   * Returns a newly created list of type parameters.
-   */
+  /// Returns a newly created list of type parameters.
   TypeParameterList typeParameterList(Token leftBracket,
       List<TypeParameter> typeParameters, Token rightBracket);
 
-  /**
-   * Returns a newly created variable declaration. The [equals] and
-   * [initializer] can be `null` if there is no initializer.
-   */
+  /// Returns a newly created variable declaration. The [equals] and
+  /// [initializer] can be `null` if there is no initializer.
   VariableDeclaration variableDeclaration(
       SimpleIdentifier name, Token equals, Expression initializer);
 
-  /**
-   * Returns a newly created variable declaration list. Either or both of the
-   * [comment] and [metadata] can be `null` if the variable list does not have
-   * the corresponding attribute. The [keyword] can be `null` if a type was
-   * specified. The [type] must be `null` if the keyword is 'var'.
-   */
+  /// Returns a newly created variable declaration list. Either or both of the
+  /// [comment] and [metadata] can be `null` if the variable list does not have
+  /// the corresponding attribute. The [keyword] can be `null` if a type was
+  /// specified. The [type] must be `null` if the keyword is 'var'.
+  ///
+  /// Use [variableDeclarationList2] instead.
   VariableDeclarationList variableDeclarationList(
       Comment comment,
       List<Annotation> metadata,
@@ -1201,27 +935,31 @@
       TypeAnnotation type,
       List<VariableDeclaration> variables);
 
-  /**
-   * Returns a newly created variable declaration statement.
-   */
+  /// Returns a newly created variable declaration list. Either or both of the
+  /// [comment] and [metadata] can be `null` if the variable list does not have
+  /// the corresponding attribute. The [keyword] can be `null` if a type was
+  /// specified. The [type] must be `null` if the keyword is 'var'.
+  VariableDeclarationList variableDeclarationList2(
+      {Comment comment,
+      List<Annotation> metadata,
+      Token lateKeyword,
+      Token keyword,
+      TypeAnnotation type,
+      List<VariableDeclaration> variables});
+
+  /// Returns a newly created variable declaration statement.
   VariableDeclarationStatement variableDeclarationStatement(
       VariableDeclarationList variableList, Token semicolon);
 
-  /**
-   * Returns a newly created while statement.
-   */
+  /// Returns a newly created while statement.
   WhileStatement whileStatement(Token whileKeyword, Token leftParenthesis,
       Expression condition, Token rightParenthesis, Statement body);
 
-  /**
-   * Returns a newly created with clause.
-   */
+  /// Returns a newly created with clause.
   WithClause withClause(Token withKeyword, List<TypeName> mixinTypes);
 
-  /**
-   * Returns a newly created yield expression. The [star] can be `null` if no
-   * star was provided.
-   */
+  /// Returns a newly created yield expression. The [star] can be `null` if no
+  /// star was provided.
   YieldStatement yieldStatement(
       Token yieldKeyword, Token star, Expression expression, Token semicolon);
 }
diff --git a/analyzer/lib/dart/ast/precedence.dart b/analyzer/lib/dart/ast/precedence.dart
index a5480d5..aaed019 100644
--- a/analyzer/lib/dart/ast/precedence.dart
+++ b/analyzer/lib/dart/ast/precedence.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2019, 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/analyzer/lib/dart/ast/resolution_map.dart b/analyzer/lib/dart/ast/resolution_map.dart
index 3762587..a0cc7e4 100644
--- a/analyzer/lib/dart/ast/resolution_map.dart
+++ b/analyzer/lib/dart/ast/resolution_map.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,333 +6,261 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 
-/**
- * A collection of methods which may be used to map from nodes in a resolved AST
- * to elements and types in the element model.
- *
- * Clients should not extend, implement or mix-in this class.
- */
+/// A collection of methods which may be used to map from nodes in a resolved
+/// AST to elements and types in the element model.
+///
+/// Clients should not extend, implement or mix-in this class.
+// TODO(brianwilkerson) This was added for unifying with the front_end, and is
+//  no longer needed. It should be removed.
 abstract class ResolutionMap {
-  /**
-   * Return the best element available for the function being invoked at [node].
-   * If resolution was able to find a better element based on type propagation,
-   * that element will be returned. Otherwise, the element found using the
-   * result of static analysis will be returned. If resolution has not been
-   * performed, then `null` will be returned.
-   *
-   * Deprecated: The analyzer no longer computes propagated type information.
-   * Use [staticElementForFunctionExpressionInvocation] instead.
-   */
+  /// Return the best element available for the function being invoked at
+  /// [node]. If resolution was able to find a better element based on type
+  /// propagation, that element will be returned. Otherwise, the element found
+  /// using the result of static analysis will be returned. If resolution has
+  /// not been performed, then `null` will be returned.
+  ///
+  /// Deprecated: The analyzer no longer computes propagated type information.
+  /// Use [staticElementForFunctionExpressionInvocation] instead.
   @deprecated
   ExecutableElement bestElementForFunctionExpressionInvocation(
       FunctionExpressionInvocation node);
 
-  /**
-   * Return the best element available for the identifier [node]. If resolution
-   * was able to find a better element based on type propagation, that element
-   * will be returned. Otherwise, the element found using the result of static
-   * analysis will be returned. If resolution has not been performed, then
-   * `null` will be returned.
-   *
-   * Deprecated: The analyzer no longer computes propagated type information.
-   * Use [staticElementForIdentifier] instead.
-   */
+  /// Return the best element available for the identifier [node]. If resolution
+  /// was able to find a better element based on type propagation, that element
+  /// will be returned. Otherwise, the element found using the result of static
+  /// analysis will be returned. If resolution has not been performed, then
+  /// `null` will be returned.
+  ///
+  /// Deprecated: The analyzer no longer computes propagated type information.
+  /// Use [staticElementForIdentifier] instead.
   @deprecated
   Element bestElementForIdentifier(Identifier node);
 
-  /**
-   * Return the best element available for the expression [node]. If resolution
-   * was able to find a better element based on type propagation, that element
-   * will be returned. Otherwise, the element found using the result of static
-   * analysis will be returned. If resolution has not been performed, then
-   * `null` will be returned.
-   *
-   * Deprecated: The analyzer no longer computes propagated type information.
-   * Use [staticElementForMethodReference] instead.
-   */
+  /// Return the best element available for the expression [node]. If resolution
+  /// was able to find a better element based on type propagation, that element
+  /// will be returned. Otherwise, the element found using the result of static
+  /// analysis will be returned. If resolution has not been performed, then
+  /// `null` will be returned.
+  ///
+  /// Deprecated: The analyzer no longer computes propagated type information.
+  /// Use [staticElementForMethodReference] instead.
   @deprecated
   MethodElement bestElementForMethodReference(MethodReferenceExpression node);
 
-  /**
-   * Return the best parameter element information available for the expression
-   * [node]. If type propagation was able to find a better parameter element
-   * than static analysis, that type will be returned. Otherwise, the result of
-   * static analysis will be returned.
-   *
-   * Deprecated: The analyzer no longer computes propagated type information.
-   * Use [staticParameterElementForExpression] instead.
-   */
+  /// Return the best parameter element information available for the expression
+  /// [node]. If type propagation was able to find a better parameter element
+  /// than static analysis, that type will be returned. Otherwise, the result of
+  /// static analysis will be returned.
+  ///
+  /// Deprecated: The analyzer no longer computes propagated type information.
+  /// Use [staticParameterElementForExpression] instead.
   @deprecated
   ParameterElement bestParameterElementForExpression(Expression node);
 
-  /**
-   * Return the best type information available for the expression [node]. If
-   * type propagation was able to find a better type than static analysis, that
-   * type will be returned. Otherwise, the result of static analysis will be
-   * returned. If no type analysis has been performed, then the type 'dynamic'
-   * will be returned.
-   *
-   * Deprecated: The analyzer no longer computes propagated type information.
-   * Use [staticTypeForExpression] instead.
-   */
+  /// Return the best type information available for the expression [node]. If
+  /// type propagation was able to find a better type than static analysis, that
+  /// type will be returned. Otherwise, the result of static analysis will be
+  /// returned. If no type analysis has been performed, then the type 'dynamic'
+  /// will be returned.
+  ///
+  /// Deprecated: The analyzer no longer computes propagated type information.
+  /// Use [staticTypeForExpression] instead.
   @deprecated
   DartType bestTypeForExpression(Expression node);
 
-  /**
-   * Return the element annotation representing the annotation [node] in the
-   * element model.
-   */
+  /// Return the element annotation representing the annotation [node] in the
+  /// element model.
   ElementAnnotation elementAnnotationForAnnotation(Annotation node);
 
-  /**
-   * Return the element associated with the declaration [node], or `null` if
-   * either this node corresponds to a list of declarations or if the AST
-   * structure has not been resolved.
-   */
+  /// Return the element associated with the declaration [node], or `null` if
+  /// either this node corresponds to a list of declarations or if the AST
+  /// structure has not been resolved.
   ClassElement elementDeclaredByClassDeclaration(ClassDeclaration node);
 
-  /**
-   * Return the element associated with the compilation unit [node], or `null`
-   * if the AST structure has not been resolved.
-   */
+  /// Return the element associated with the compilation unit [node], or `null`
+  /// if the AST structure has not been resolved.
   CompilationUnitElement elementDeclaredByCompilationUnit(CompilationUnit node);
 
-  /**
-   * Return the element associated with the declaration [node], or `null` if
-   * either this node corresponds to a list of declarations or if the AST
-   * structure has not been resolved.
-   */
+  /// Return the element associated with the declaration [node], or `null` if
+  /// either this node corresponds to a list of declarations or if the AST
+  /// structure has not been resolved.
   ConstructorElement elementDeclaredByConstructorDeclaration(
       ConstructorDeclaration node);
 
-  /**
-   * Return the element associated with the declaration [node], or `null` if
-   * either this node corresponds to a list of declarations or if the AST
-   * structure has not been resolved.
-   */
+  /// Return the element associated with the declaration [node], or `null` if
+  /// either this node corresponds to a list of declarations or if the AST
+  /// structure has not been resolved.
   Element elementDeclaredByDeclaration(Declaration node);
 
-  /**
-   * Return the element associated with the declaration [node], or `null` if
-   * either this node corresponds to a list of declarations or if the AST
-   * structure has not been resolved.
-   */
+  /// Return the element associated with the declaration [node], or `null` if
+  /// either this node corresponds to a list of declarations or if the AST
+  /// structure has not been resolved.
   LocalVariableElement elementDeclaredByDeclaredIdentifier(
       DeclaredIdentifier node);
 
-  /**
-   * Return the element associated with the directive [node], or `null` if the
-   * AST structure has not been resolved or if this directive could not be
-   * resolved.
-   */
+  /// Return the element associated with the directive [node], or `null` if the
+  /// AST structure has not been resolved or if this directive could not be
+  /// resolved.
   Element elementDeclaredByDirective(Directive node);
 
-  /**
-   * Return the element associated with the declaration [node], or `null` if
-   * either this node corresponds to a list of declarations or if the AST
-   * structure has not been resolved.
-   */
+  /// Return the element associated with the declaration [node], or `null` if
+  /// either this node corresponds to a list of declarations or if the AST
+  /// structure has not been resolved.
   ClassElement elementDeclaredByEnumDeclaration(EnumDeclaration node);
 
-  /**
-   * Return the element representing the parameter [node], or `null` if this
-   * parameter has not been resolved.
-   */
+  /// Return the element representing the parameter [node], or `null` if this
+  /// parameter has not been resolved.
   ParameterElement elementDeclaredByFormalParameter(FormalParameter node);
 
-  /**
-   * Return the element associated with the declaration [node], or `null` if
-   * either this node corresponds to a list of declarations or if the AST
-   * structure has not been resolved.
-   */
+  /// Return the element associated with the declaration [node], or `null` if
+  /// either this node corresponds to a list of declarations or if the AST
+  /// structure has not been resolved.
   ExecutableElement elementDeclaredByFunctionDeclaration(
       FunctionDeclaration node);
 
-  /**
-   * Return the element associated with the function expression [node], or
-   * `null` if the AST structure has not been resolved.
-   */
+  /// Return the element associated with the function expression [node], or
+  /// `null` if the AST structure has not been resolved.
   ExecutableElement elementDeclaredByFunctionExpression(
       FunctionExpression node);
 
-  /**
-   * Return the element associated with the declaration [node], or `null` if
-   * either this node corresponds to a list of declarations or if the AST
-   * structure has not been resolved.
-   */
+  /// Return the element associated with the declaration [node], or `null` if
+  /// either this node corresponds to a list of declarations or if the AST
+  /// structure has not been resolved.
   ExecutableElement elementDeclaredByMethodDeclaration(MethodDeclaration node);
 
-  /**
-   * Return the element associated with the declaration [node], or `null` if
-   * either this node corresponds to a list of declarations or if the AST
-   * structure has not been resolved.
-   */
+  /// Return the element associated with the declaration [node], or `null` if
+  /// either this node corresponds to a list of declarations or if the AST
+  /// structure has not been resolved.
   ClassElement elementDeclaredByMixinDeclaration(MixinDeclaration node);
 
-  /**
-   * Return the element associated with the declaration [node], or `null` if
-   * either this node corresponds to a list of declarations or if the AST
-   * structure has not been resolved.
-   */
+  /// Return the element associated with the declaration [node], or `null` if
+  /// either this node corresponds to a list of declarations or if the AST
+  /// structure has not been resolved.
   VariableElement elementDeclaredByVariableDeclaration(
       VariableDeclaration node);
 
-  /**
-   * Return the element associated with the annotation [node], or `null` if the
-   * AST structure has not been resolved or if this annotation could not be
-   * resolved.
-   */
+  /// Return the element associated with the annotation [node], or `null` if the
+  /// AST structure has not been resolved or if this annotation could not be
+  /// resolved.
   Element elementForAnnotation(Annotation node);
 
-  /**
-   * Return the element representing the parameter being named by the
-   * expression [node], or `null` if the AST structure has not been resolved or
-   * if there is no parameter with the same name as this expression.
-   */
+  /// Return the element representing the parameter being named by the
+  /// expression [node], or `null` if the AST structure has not been resolved or
+  /// if there is no parameter with the same name as this expression.
   ParameterElement elementForNamedExpression(NamedExpression node);
 
-  /**
-   * Return a list containing the elements representing the parameters in the
-   * list [node]. The list will contain `null`s if the parameters in this list
-   * have not been resolved.
-   */
+  /// Return a list containing the elements representing the parameters in the
+  /// list [node]. The list will contain `null`s if the parameters in this list
+  /// have not been resolved.
   List<ParameterElement> parameterElementsForFormalParameterList(
       FormalParameterList node);
 
-  /**
-   * Return the element associated with the function being invoked at [node]
-   * based on propagated type information, or `null` if the AST structure has
-   * not been resolved or the function could not be resolved.
-   *
-   * Deprecated: The analyzer no longer computes propagated type information.
-   * Use [staticElementForFunctionExpressionInvocation] instead.
-   */
+  /// Return the element associated with the function being invoked at [node]
+  /// based on propagated type information, or `null` if the AST structure has
+  /// not been resolved or the function could not be resolved.
+  ///
+  /// Deprecated: The analyzer no longer computes propagated type information.
+  /// Use [staticElementForFunctionExpressionInvocation] instead.
   @deprecated
   ExecutableElement propagatedElementForFunctionExpressionInvocation(
       FunctionExpressionInvocation node);
 
-  /**
-   * Return the element associated with the identifier [node] based on
-   * propagated type information, or `null` if the AST structure has not been
-   * resolved or if this identifier could not be resolved. One example of the
-   * latter case is an identifier that is not defined within the scope in which
-   * it appears.
-   *
-   * Deprecated: The analyzer no longer computes propagated type information.
-   * Use [staticElementForIdentifier] instead.
-   */
+  /// Return the element associated with the identifier [node] based on
+  /// propagated type information, or `null` if the AST structure has not been
+  /// resolved or if this identifier could not be resolved. One example of the
+  /// latter case is an identifier that is not defined within the scope in which
+  /// it appears.
+  ///
+  /// Deprecated: The analyzer no longer computes propagated type information.
+  /// Use [staticElementForIdentifier] instead.
   @deprecated
   Element propagatedElementForIdentifier(Identifier node);
 
-  /**
-   * Return the element associated with the expression [node] based on
-   * propagated types, or `null` if the AST structure has not been resolved, or
-   * there is no meaningful propagated element to return (e.g. because this is a
-   * non-compound assignment expression, or because the method referred to could
-   * not be resolved).
-   *
-   * Deprecated: The analyzer no longer computes propagated type information.
-   * Use [staticElementForMethodReference] instead.
-   */
+  /// Return the element associated with the expression [node] based on
+  /// propagated types, or `null` if the AST structure has not been resolved, or
+  /// there is no meaningful propagated element to return (e.g. because this is
+  /// a non-compound assignment expression, or because the method referred to
+  /// could not be resolved).
+  ///
+  /// Deprecated: The analyzer no longer computes propagated type information.
+  /// Use [staticElementForMethodReference] instead.
   @deprecated
   MethodElement propagatedElementForMethodReference(
       MethodReferenceExpression node);
 
-  /**
-   * If the expression [node] is an argument to an invocation, and the AST
-   * structure has been resolved, and the function being invoked is known based
-   * on propagated type information, and [node] corresponds to one of the
-   * parameters of the function being invoked, then return the parameter element
-   * representing the parameter to which the value of [node] will be
-   * bound. Otherwise, return `null`.
-   *
-   * Deprecated: The analyzer no longer computes propagated type information.
-   * Use [staticParameterElementForExpression] instead.
-   */
+  /// If the expression [node] is an argument to an invocation, and the AST
+  /// structure has been resolved, and the function being invoked is known based
+  /// on propagated type information, and [node] corresponds to one of the
+  /// parameters of the function being invoked, then return the parameter
+  /// element representing the parameter to which the value of [node] will be
+  /// bound. Otherwise, return `null`.
+  ///
+  /// Deprecated: The analyzer no longer computes propagated type information.
+  /// Use [staticParameterElementForExpression] instead.
   @deprecated
   ParameterElement propagatedParameterElementForExpression(Expression node);
 
-  /**
-   * Return the propagated type of the expression [node], or `null` if type
-   * propagation has not been performed on the AST structure.
-   *
-   * Deprecated: The analyzer no longer computes propagated type information.
-   * Use [staticTypeForExpression] instead.
-   */
+  /// Return the propagated type of the expression [node], or `null` if type
+  /// propagation has not been performed on the AST structure.
+  ///
+  /// Deprecated: The analyzer no longer computes propagated type information.
+  /// Use [staticTypeForExpression] instead.
   @deprecated
   DartType propagatedTypeForExpression(Expression node);
 
-  /**
-   * Return the element associated with the constructor referenced by [node]
-   * based on static type information, or `null` if the AST structure has not
-   * been resolved or if the constructor could not be resolved.
-   */
+  /// Return the element associated with the constructor referenced by [node]
+  /// based on static type information, or `null` if the AST structure has not
+  /// been resolved or if the constructor could not be resolved.
   ConstructorElement staticElementForConstructorReference(
       ConstructorReferenceNode node);
 
-  /**
-   * Return the element associated with the function being invoked at [node]
-   * based on static type information, or `null` if the AST structure has not
-   * been resolved or the function could not be resolved.
-   */
+  /// Return the element associated with the function being invoked at [node]
+  /// based on static type information, or `null` if the AST structure has not
+  /// been resolved or the function could not be resolved.
   ExecutableElement staticElementForFunctionExpressionInvocation(
       FunctionExpressionInvocation node);
 
-  /**
-   * Return the element associated with the identifier [node] based on static
-   * type information, or `null` if the AST structure has not been resolved or
-   * if this identifier could not be resolved. One example of the latter case is
-   * an identifier that is not defined within the scope in which it appears
-   */
+  /// Return the element associated with the identifier [node] based on static
+  /// type information, or `null` if the AST structure has not been resolved or
+  /// if this identifier could not be resolved. One example of the latter case
+  /// is an identifier that is not defined within the scope in which it appears.
   Element staticElementForIdentifier(Identifier node);
 
-  /**
-   * Return the element associated with the expression [node] based on the
-   * static types, or `null` if the AST structure has not been resolved, or
-   * there is no meaningful static element to return (e.g. because this is a
-   * non-compound assignment expression, or because the method referred to could
-   * not be resolved).
-   */
+  /// Return the element associated with the expression [node] based on the
+  /// static types, or `null` if the AST structure has not been resolved, or
+  /// there is no meaningful static element to return (e.g. because this is a
+  /// non-compound assignment expression, or because the method referred to
+  /// could not be resolved).
   MethodElement staticElementForMethodReference(MethodReferenceExpression node);
 
-  /**
-   * Return the function type of the invocation [node] based on the static type
-   * information, or `null` if the AST structure has not been resolved, or if
-   * the invoke could not be resolved.
-   *
-   * This will usually be a [FunctionType], but it can also be an
-   * [InterfaceType] with a `call` method, `dynamic`, `Function`, or a `@proxy`
-   * interface type that implements `Function`.
-   */
+  /// Return the function type of the invocation [node] based on the static type
+  /// information, or `null` if the AST structure has not been resolved, or if
+  /// the invoke could not be resolved.
+  ///
+  /// This will usually be a [FunctionType], but it can also be an
+  /// [InterfaceType] with a `call` method, `dynamic`, `Function`, or a `@proxy`
+  /// interface type that implements `Function`.
   DartType staticInvokeTypeForInvocationExpression(InvocationExpression node);
 
-  /**
-   * If the expression [node] is an argument to an invocation, and the AST
-   * structure has been resolved, and the function being invoked is known based
-   * on static type information, and [node] corresponds to one of the parameters
-   * of the function being invoked, then return the parameter element
-   * representing the parameter to which the value of [node] will be
-   * bound. Otherwise, return `null`.
-   */
+  /// If the expression [node] is an argument to an invocation, and the AST
+  /// structure has been resolved, and the function being invoked is known based
+  /// on static type information, and [node] corresponds to one of the
+  /// parameters of the function being invoked, then return the parameter
+  /// element representing the parameter to which the value of [node] will be
+  /// bound. Otherwise, return `null`.
   ParameterElement staticParameterElementForExpression(Expression node);
 
-  /**
-   * Return the static type of the expression [node], or `null` if the AST
-   * structure has not been resolved.
-   */
+  /// Return the static type of the expression [node], or `null` if the AST
+  /// structure has not been resolved.
   DartType staticTypeForExpression(Expression node);
 
-  /**
-   * Return the type being named by [node], or `null` if the AST structure has
-   * not been resolved.
-   */
+  /// Return the type being named by [node], or `null` if the AST structure has
+  /// not been resolved.
   DartType typeForTypeName(TypeAnnotation node);
 
-  /**
-   * Return the element associated with the uri of the directive [node], or
-   * `null` if the AST structure has not been resolved or if the URI could not
-   * be resolved. Examples of the latter case include a directive that contains
-   * an invalid URL or a URL that does not exist.
-   */
+  /// Return the element associated with the uri of the directive [node], or
+  /// `null` if the AST structure has not been resolved or if the URI could not
+  /// be resolved. Examples of the latter case include a directive that contains
+  /// an invalid URL or a URL that does not exist.
   Element uriElementForDirective(UriBasedDirective node);
 }
diff --git a/analyzer/lib/dart/ast/standard_ast_factory.dart b/analyzer/lib/dart/ast/standard_ast_factory.dart
index 9333242..acb1366 100644
--- a/analyzer/lib/dart/ast/standard_ast_factory.dart
+++ b/analyzer/lib/dart/ast/standard_ast_factory.dart
@@ -1,11 +1,9 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/dart/ast/ast_factory.dart';
 
-/**
- * Gets an instance of [AstFactory] based on the standard AST implementation.
- */
+/// Gets an instance of [AstFactory] based on the standard AST implementation.
 final AstFactory astFactory = new AstFactoryImpl();
diff --git a/analyzer/lib/dart/ast/standard_resolution_map.dart b/analyzer/lib/dart/ast/standard_resolution_map.dart
index c778063..3353e19 100644
--- a/analyzer/lib/dart/ast/standard_resolution_map.dart
+++ b/analyzer/lib/dart/ast/standard_resolution_map.dart
@@ -1,11 +1,10 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/resolution_map.dart';
 import 'package:analyzer/src/dart/ast/resolution_map.dart';
 
-/**
- * Gets an instance of [ResolutionMap] based on the standard AST implementation.
- */
+/// Gets an instance of [ResolutionMap] based on the standard AST
+/// implementation.
 final ResolutionMap resolutionMap = new ResolutionMapImpl();
diff --git a/analyzer/lib/dart/ast/token.dart b/analyzer/lib/dart/ast/token.dart
index 55874de..4262a60 100644
--- a/analyzer/lib/dart/ast/token.dart
+++ b/analyzer/lib/dart/ast/token.dart
@@ -2,30 +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.
 
-/**
- * Defines the tokens that are produced by the scanner, used by the parser, and
- * referenced from the [AST structure](ast.dart).
- */
+/// Defines the tokens that are produced by the scanner, used by the parser, and
+/// referenced from the [AST structure](ast.dart).
 export 'package:front_end/src/scanner/token.dart'
-    show
-        Keyword,
-        Token,
-        TokenType,
-        NO_PRECEDENCE,
-        ASSIGNMENT_PRECEDENCE,
-        CASCADE_PRECEDENCE,
-        CONDITIONAL_PRECEDENCE,
-        IF_NULL_PRECEDENCE,
-        LOGICAL_OR_PRECEDENCE,
-        LOGICAL_AND_PRECEDENCE,
-        EQUALITY_PRECEDENCE,
-        RELATIONAL_PRECEDENCE,
-        BITWISE_OR_PRECEDENCE,
-        BITWISE_XOR_PRECEDENCE,
-        BITWISE_AND_PRECEDENCE,
-        SHIFT_PRECEDENCE,
-        ADDITIVE_PRECEDENCE,
-        MULTIPLICATIVE_PRECEDENCE,
-        PREFIX_PRECEDENCE,
-        POSTFIX_PRECEDENCE,
-        SELECTOR_PRECEDENCE;
+    show Keyword, Token, TokenType;
diff --git a/analyzer/lib/dart/ast/visitor.dart b/analyzer/lib/dart/ast/visitor.dart
index ac55621..6646631 100644
--- a/analyzer/lib/dart/ast/visitor.dart
+++ b/analyzer/lib/dart/ast/visitor.dart
@@ -2,79 +2,67 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Defines AST visitors that support useful patterns for visiting the nodes in
- * an [AST structure](ast.dart).
- *
- * Dart is an evolving language, and the AST structure must evolved with it.
- * When the AST structure changes, the visitor interface will sometimes change
- * as well. If it is desirable to get a compilation error when the structure of
- * the AST has been modified, then you should consider implementing the
- * interface [AstVisitor] directly. Doing so will ensure that changes that
- * introduce new classes of nodes will be flagged. (Of course, not all changes
- * to the AST structure require the addition of a new class of node, and hence
- * cannot be caught this way.)
- *
- * But if automatic detection of these kinds of changes is not necessary then
- * you will probably want to extend one of the classes in this library because
- * doing so will simplify the task of writing your visitor and guard against
- * future changes to the AST structure. For example, the [RecursiveAstVisitor]
- * automates the process of visiting all of the descendants of a node.
- */
+/// Defines AST visitors that support useful patterns for visiting the nodes in
+/// an [AST structure](ast.dart).
+///
+/// Dart is an evolving language, and the AST structure must evolved with it.
+/// When the AST structure changes, the visitor interface will sometimes change
+/// as well. If it is desirable to get a compilation error when the structure of
+/// the AST has been modified, then you should consider implementing the
+/// interface [AstVisitor] directly. Doing so will ensure that changes that
+/// introduce new classes of nodes will be flagged. (Of course, not all changes
+/// to the AST structure require the addition of a new class of node, and hence
+/// cannot be caught this way.)
+///
+/// But if automatic detection of these kinds of changes is not necessary then
+/// you will probably want to extend one of the classes in this library because
+/// doing so will simplify the task of writing your visitor and guard against
+/// future changes to the AST structure. For example, the [RecursiveAstVisitor]
+/// automates the process of visiting all of the descendants of a node.
 import 'dart:collection';
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart' show UIAsCodeVisitorMixin;
 
-/**
- * An AST visitor that will recursively visit all of the nodes in an AST
- * structure, similar to [GeneralizingAstVisitor]. This visitor uses a
- * breadth-first ordering rather than the depth-first ordering of
- * [GeneralizingAstVisitor].
- *
- * Subclasses that override a visit method must either invoke the overridden
- * visit method or explicitly invoke the more general visit method. Failure to
- * do so will cause the visit methods for superclasses of the node to not be
- * invoked and will cause the children of the visited node to not be visited.
- *
- * In addition, subclasses should <b>not</b> explicitly visit the children of a
- * node, but should ensure that the method [visitNode] is used to visit the
- * children (either directly or indirectly). Failure to do will break the order
- * in which nodes are visited.
- *
- * Note that, unlike other visitors that begin to visit a structure of nodes by
- * asking the root node in the structure to accept the visitor, this visitor
- * requires that clients start the visit by invoking the method [visitAllNodes]
- * defined on the visitor with the root node as the argument:
- *
- *     visitor.visitAllNodes(rootNode);
- *
- * Clients may extend this class.
- */
+/// An AST visitor that will recursively visit all of the nodes in an AST
+/// structure, similar to [GeneralizingAstVisitor]. This visitor uses a
+/// breadth-first ordering rather than the depth-first ordering of
+/// [GeneralizingAstVisitor].
+///
+/// Subclasses that override a visit method must either invoke the overridden
+/// visit method or explicitly invoke the more general visit method. Failure to
+/// do so will cause the visit methods for superclasses of the node to not be
+/// invoked and will cause the children of the visited node to not be visited.
+///
+/// In addition, subclasses should <b>not</b> explicitly visit the children of a
+/// node, but should ensure that the method [visitNode] is used to visit the
+/// children (either directly or indirectly). Failure to do will break the order
+/// in which nodes are visited.
+///
+/// Note that, unlike other visitors that begin to visit a structure of nodes by
+/// asking the root node in the structure to accept the visitor, this visitor
+/// requires that clients start the visit by invoking the method [visitAllNodes]
+/// defined on the visitor with the root node as the argument:
+///
+///     visitor.visitAllNodes(rootNode);
+///
+/// Clients may extend this class.
 class BreadthFirstVisitor<R> extends GeneralizingAstVisitor<R> {
-  /**
-   * A queue holding the nodes that have not yet been visited in the order in
-   * which they ought to be visited.
-   */
+  /// A queue holding the nodes that have not yet been visited in the order in
+  /// which they ought to be visited.
   Queue<AstNode> _queue = new Queue<AstNode>();
 
-  /**
-   * A visitor, used to visit the children of the current node, that will add
-   * the nodes it visits to the [_queue].
-   */
+  /// A visitor, used to visit the children of the current node, that will add
+  /// the nodes it visits to the [_queue].
   _BreadthFirstChildVisitor _childVisitor;
 
-  /**
-   * Initialize a newly created visitor.
-   */
+  /// Initialize a newly created visitor.
   BreadthFirstVisitor() {
     _childVisitor = new _BreadthFirstChildVisitor(this);
   }
 
-  /**
-   * Visit all nodes in the tree starting at the given [root] node, in
-   * breadth-first order.
-   */
+  /// Visit all nodes in the tree starting at the given [root] node, in
+  /// breadth-first order.
   void visitAllNodes(AstNode root) {
     _queue.add(root);
     while (!_queue.isEmpty) {
@@ -90,33 +78,27 @@
   }
 }
 
-/**
- * An AST visitor that will recursively visit all of the nodes in an AST
- * structure. For each node that is visited, the corresponding visit method on
- * one or more other visitors (the 'delegates') will be invoked.
- *
- * For example, if an instance of this class is created with two delegates V1
- * and V2, and that instance is used to visit the expression 'x + 1', then the
- * following visit methods will be invoked:
- * 1. V1.visitBinaryExpression
- * 2. V2.visitBinaryExpression
- * 3. V1.visitSimpleIdentifier
- * 4. V2.visitSimpleIdentifier
- * 5. V1.visitIntegerLiteral
- * 6. V2.visitIntegerLiteral
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An AST visitor that will recursively visit all of the nodes in an AST
+/// structure. For each node that is visited, the corresponding visit method on
+/// one or more other visitors (the 'delegates') will be invoked.
+///
+/// For example, if an instance of this class is created with two delegates V1
+/// and V2, and that instance is used to visit the expression 'x + 1', then the
+/// following visit methods will be invoked:
+/// 1. V1.visitBinaryExpression
+/// 2. V2.visitBinaryExpression
+/// 3. V1.visitSimpleIdentifier
+/// 4. V2.visitSimpleIdentifier
+/// 5. V1.visitIntegerLiteral
+/// 6. V2.visitIntegerLiteral
+///
+/// Clients may not extend, implement or mix-in this class.
 class DelegatingAstVisitor<T> extends UnifyingAstVisitor<T> {
-  /**
-   * The delegates whose visit methods will be invoked.
-   */
+  /// The delegates whose visit methods will be invoked.
   final Iterable<AstVisitor<T>> delegates;
 
-  /**
-   * Initialize a newly created visitor to use each of the given delegate
-   * visitors to visit the nodes of an AST structure.
-   */
+  /// Initialize a newly created visitor to use each of the given delegate
+  /// visitors to visit the nodes of an AST structure.
   DelegatingAstVisitor(this.delegates);
 
   @override
@@ -129,25 +111,23 @@
   }
 }
 
-/**
- * An AST visitor that will recursively visit all of the nodes in an AST
- * structure (like instances of the class [RecursiveAstVisitor]). In addition,
- * when a node of a specific type is visited not only will the visit method for
- * that specific type of node be invoked, but additional methods for the
- * superclasses of that node will also be invoked. For example, using an
- * instance of this class to visit a [Block] will cause the method [visitBlock]
- * to be invoked but will also cause the methods [visitStatement] and
- * [visitNode] to be subsequently invoked. This allows visitors to be written
- * that visit all statements without needing to override the visit method for
- * each of the specific subclasses of [Statement].
- *
- * Subclasses that override a visit method must either invoke the overridden
- * visit method or explicitly invoke the more general visit method. Failure to
- * do so will cause the visit methods for superclasses of the node to not be
- * invoked and will cause the children of the visited node to not be visited.
- *
- * Clients may extend this class.
- */
+/// An AST visitor that will recursively visit all of the nodes in an AST
+/// structure (like instances of the class [RecursiveAstVisitor]). In addition,
+/// when a node of a specific type is visited not only will the visit method for
+/// that specific type of node be invoked, but additional methods for the
+/// superclasses of that node will also be invoked. For example, using an
+/// instance of this class to visit a [Block] will cause the method [visitBlock]
+/// to be invoked but will also cause the methods [visitStatement] and
+/// [visitNode] to be subsequently invoked. This allows visitors to be written
+/// that visit all statements without needing to override the visit method for
+/// each of the specific subclasses of [Statement].
+///
+/// Subclasses that override a visit method must either invoke the overridden
+/// visit method or explicitly invoke the more general visit method. Failure to
+/// do so will cause the visit methods for superclasses of the node to not be
+/// invoked and will cause the children of the visited node to not be visited.
+///
+/// Clients may extend this class.
 class GeneralizingAstVisitor<R>
     with UIAsCodeVisitorMixin<R>
     implements AstVisitor<R> {
@@ -332,7 +312,7 @@
       visitForParts(node);
 
   @override
-  R visitForStatement2(ForStatement2 node) => visitStatement(node);
+  R visitForStatement(ForStatement node) => visitStatement(node);
 
   R visitFunctionBody(FunctionBody node) => visitNode(node);
 
@@ -423,16 +403,8 @@
   @override
   R visitListLiteral(ListLiteral node) => visitTypedLiteral(node);
 
-  @deprecated
-  @override
-  R visitListLiteral2(ListLiteral2 node) => visitTypedLiteral(node);
-
   R visitLiteral(Literal node) => visitExpression(node);
 
-  @deprecated
-  @override
-  R visitMapLiteral2(MapLiteral2 node) => visitTypedLiteral(node);
-
   @override
   R visitMapLiteralEntry(MapLiteralEntry node) => visitCollectionElement(node);
 
@@ -512,10 +484,6 @@
   @override
   R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
-  @deprecated
-  @override
-  R visitSetLiteral2(SetLiteral2 node) => visitTypedLiteral(node);
-
   @override
   R visitSetOrMapLiteral(SetOrMapLiteral node) => visitTypedLiteral(node);
 
@@ -623,18 +591,16 @@
   R visitYieldStatement(YieldStatement node) => visitStatement(node);
 }
 
-/**
- * An AST visitor that will recursively visit all of the nodes in an AST
- * structure. For example, using an instance of this class to visit a [Block]
- * will also cause all of the statements in the block to be visited.
- *
- * Subclasses that override a visit method must either invoke the overridden
- * visit method or must explicitly ask the visited node to visit its children.
- * Failure to do so will cause the children of the visited node to not be
- * visited.
- *
- * Clients may extend this class.
- */
+/// An AST visitor that will recursively visit all of the nodes in an AST
+/// structure. For example, using an instance of this class to visit a [Block]
+/// will also cause all of the statements in the block to be visited.
+///
+/// Subclasses that override a visit method must either invoke the overridden
+/// visit method or must explicitly ask the visited node to visit its children.
+/// Failure to do so will cause the children of the visited node to not be
+/// visited.
+///
+/// Clients may extend this class.
 class RecursiveAstVisitor<R>
     with UIAsCodeVisitorMixin<R>
     implements AstVisitor<R> {
@@ -921,7 +887,7 @@
   }
 
   @override
-  R visitForStatement2(ForStatement2 node) {
+  R visitForStatement(ForStatement node) {
     node.visitChildren(this);
     return null;
   }
@@ -1070,20 +1036,6 @@
     return null;
   }
 
-  @deprecated
-  @override
-  R visitListLiteral2(ListLiteral2 node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  @deprecated
-  @override
-  R visitMapLiteral2(MapLiteral2 node) {
-    node.visitChildren(this);
-    return null;
-  }
-
   @override
   R visitMapLiteralEntry(MapLiteralEntry node) {
     node.visitChildren(this);
@@ -1205,13 +1157,6 @@
     return null;
   }
 
-  @deprecated
-  @override
-  R visitSetLiteral2(SetLiteral2 node) {
-    node.visitChildren(this);
-    return null;
-  }
-
   @override
   R visitSetOrMapLiteral(SetOrMapLiteral node) {
     node.visitChildren(this);
@@ -1375,14 +1320,12 @@
   }
 }
 
-/**
- * An AST visitor that will do nothing when visiting an AST node. It is intended
- * to be a superclass for classes that use the visitor pattern primarily as a
- * dispatch mechanism (and hence don't need to recursively visit a whole
- * structure) and that only need to visit a small number of node types.
- *
- * Clients may extend this class.
- */
+/// An AST visitor that will do nothing when visiting an AST node. It is
+/// intended to be a superclass for classes that use the visitor pattern
+/// primarily as a dispatch mechanism (and hence don't need to recursively visit
+/// a whole structure) and that only need to visit a small number of node types.
+///
+/// Clients may extend this class.
 class SimpleAstVisitor<R>
     with UIAsCodeVisitorMixin<R>
     implements AstVisitor<R> {
@@ -1528,7 +1471,7 @@
   R visitForPartsWithExpression(ForPartsWithExpression node) => null;
 
   @override
-  R visitForStatement2(ForStatement2 node) => null;
+  R visitForStatement(ForStatement node) => null;
 
   @override
   R visitFunctionDeclaration(FunctionDeclaration node) => null;
@@ -1605,14 +1548,6 @@
   @override
   R visitListLiteral(ListLiteral node) => null;
 
-  @deprecated
-  @override
-  R visitListLiteral2(ListLiteral2 node) => null;
-
-  @deprecated
-  @override
-  R visitMapLiteral2(MapLiteral2 node) => null;
-
   @override
   R visitMapLiteralEntry(MapLiteralEntry node) => null;
 
@@ -1675,10 +1610,6 @@
   @override
   R visitScriptTag(ScriptTag node) => null;
 
-  @deprecated
-  @override
-  R visitSetLiteral2(SetLiteral2 node) => null;
-
   @override
   R visitSetOrMapLiteral(SetOrMapLiteral node) => null;
 
@@ -1762,15 +1693,13 @@
   R visitYieldStatement(YieldStatement node) => null;
 }
 
-/**
- * An AST visitor that will throw an exception if any of the visit methods that
- * are invoked have not been overridden. It is intended to be a superclass for
- * classes that implement the visitor pattern and need to (a) override all of
- * the visit methods or (b) need to override a subset of the visit method and
- * want to catch when any other visit methods have been invoked.
- *
- * Clients may extend this class.
- */
+/// An AST visitor that will throw an exception if any of the visit methods that
+/// are invoked have not been overridden. It is intended to be a superclass for
+/// classes that implement the visitor pattern and need to (a) override all of
+/// the visit methods or (b) need to override a subset of the visit method and
+/// want to catch when any other visit methods have been invoked.
+///
+/// Clients may extend this class.
 class ThrowingAstVisitor<R>
     with UIAsCodeVisitorMixin<R>
     implements AstVisitor<R> {
@@ -1920,7 +1849,7 @@
   R visitForPartsWithExpression(ForPartsWithExpression node) => _throw(node);
 
   @override
-  R visitForStatement2(ForStatement2 node) => _throw(node);
+  R visitForStatement(ForStatement node) => _throw(node);
 
   @override
   R visitFunctionDeclaration(FunctionDeclaration node) => _throw(node);
@@ -1998,14 +1927,6 @@
   @override
   R visitListLiteral(ListLiteral node) => _throw(node);
 
-  @deprecated
-  @override
-  R visitListLiteral2(ListLiteral2 node) => _throw(node);
-
-  @deprecated
-  @override
-  R visitMapLiteral2(MapLiteral2 node) => _throw(node);
-
   @override
   R visitMapLiteralEntry(MapLiteralEntry node) => _throw(node);
 
@@ -2068,10 +1989,6 @@
   @override
   R visitScriptTag(ScriptTag node) => _throw(node);
 
-  @deprecated
-  @override
-  R visitSetLiteral2(SetLiteral2 node) => _throw(node);
-
   @override
   R visitSetOrMapLiteral(SetOrMapLiteral node) => _throw(node);
 
@@ -2161,26 +2078,18 @@
   }
 }
 
-/**
- * An AST visitor that captures visit call timings.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An AST visitor that captures visit call timings.
+///
+/// Clients may not extend, implement or mix-in this class.
 class TimedAstVisitor<T> with UIAsCodeVisitorMixin<T> implements AstVisitor<T> {
-  /**
-   * The base visitor whose visit methods will be timed.
-   */
+  /// The base visitor whose visit methods will be timed.
   final AstVisitor<T> _baseVisitor;
 
-  /**
-   * Collects elapsed time for visit calls.
-   */
+  /// Collects elapsed time for visit calls.
   final Stopwatch stopwatch;
 
-  /**
-   * Initialize a newly created visitor to time calls to the given base
-   * visitor's visits.
-   */
+  /// Initialize a newly created visitor to time calls to the given base
+  /// visitor's visits.
   TimedAstVisitor(this._baseVisitor, [Stopwatch watch])
       : stopwatch = watch ?? new Stopwatch();
 
@@ -2561,9 +2470,9 @@
   }
 
   @override
-  T visitForStatement2(ForStatement2 node) {
+  T visitForStatement(ForStatement node) {
     stopwatch.start();
-    T result = _baseVisitor.visitForStatement2(node);
+    T result = _baseVisitor.visitForStatement(node);
     stopwatch.stop();
     return result;
   }
@@ -2760,24 +2669,6 @@
     return result;
   }
 
-  @deprecated
-  @override
-  T visitListLiteral2(ListLiteral2 node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitListLiteral2(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @deprecated
-  @override
-  T visitMapLiteral2(MapLiteral2 node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitMapLiteral2(node);
-    stopwatch.stop();
-    return result;
-  }
-
   @override
   T visitMapLiteralEntry(MapLiteralEntry node) {
     stopwatch.start();
@@ -2939,15 +2830,6 @@
     return result;
   }
 
-  @deprecated
-  @override
-  T visitSetLiteral2(SetLiteral2 node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitSetLiteral2(node);
-    stopwatch.stop();
-    return result;
-  }
-
   @override
   T visitSetOrMapLiteral(SetOrMapLiteral node) {
     stopwatch.start();
@@ -3165,18 +3047,17 @@
   }
 }
 
-/**
- * An AST visitor that will recursively visit all of the nodes in an AST
- * structure (like instances of the class [RecursiveAstVisitor]). In addition,
- * every node will also be visited by using a single unified [visitNode] method.
- *
- * Subclasses that override a visit method must either invoke the overridden
- * visit method or explicitly invoke the more general [visitNode] method.
- * Failure to do so will cause the children of the visited node to not be
- * visited.
- *
- * Clients may extend this class.
- */
+/// An AST visitor that will recursively visit all of the nodes in an AST
+/// structure (like instances of the class [RecursiveAstVisitor]). In addition,
+/// every node will also be visited by using a single unified [visitNode]
+/// method.
+///
+/// Subclasses that override a visit method must either invoke the overridden
+/// visit method or explicitly invoke the more general [visitNode] method.
+/// Failure to do so will cause the children of the visited node to not be
+/// visited.
+///
+/// Clients may extend this class.
 class UnifyingAstVisitor<R>
     with UIAsCodeVisitorMixin<R>
     implements AstVisitor<R> {
@@ -3327,7 +3208,7 @@
   R visitForPartsWithExpression(ForPartsWithExpression node) => visitNode(node);
 
   @override
-  R visitForStatement2(ForStatement2 node) => visitNode(node);
+  R visitForStatement(ForStatement node) => visitNode(node);
 
   @override
   R visitFunctionDeclaration(FunctionDeclaration node) => visitNode(node);
@@ -3406,14 +3287,6 @@
   @override
   R visitListLiteral(ListLiteral node) => visitNode(node);
 
-  @deprecated
-  @override
-  R visitListLiteral2(ListLiteral2 node) => visitNode(node);
-
-  @deprecated
-  @override
-  R visitMapLiteral2(MapLiteral2 node) => visitNode(node);
-
   @override
   R visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
 
@@ -3482,10 +3355,6 @@
   @override
   R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
-  @deprecated
-  @override
-  R visitSetLiteral2(SetLiteral2 node) => visitNode(node);
-
   @override
   R visitSetOrMapLiteral(SetOrMapLiteral node) => visitNode(node);
 
@@ -3572,19 +3441,13 @@
   R visitYieldStatement(YieldStatement node) => visitNode(node);
 }
 
-/**
- * A helper class used to implement the correct order of visits for a
- * [BreadthFirstVisitor].
- */
+/// A helper class used to implement the correct order of visits for a
+/// [BreadthFirstVisitor].
 class _BreadthFirstChildVisitor extends UnifyingAstVisitor<void> {
-  /**
-   * The [BreadthFirstVisitor] being helped by this visitor.
-   */
+  /// The [BreadthFirstVisitor] being helped by this visitor.
   final BreadthFirstVisitor outerVisitor;
 
-  /**
-   * Initialize a newly created visitor to help the [outerVisitor].
-   */
+  /// Initialize a newly created visitor to help the [outerVisitor].
   _BreadthFirstChildVisitor(this.outerVisitor);
 
   @override
diff --git a/analyzer/lib/dart/constant/value.dart b/analyzer/lib/dart/constant/value.dart
index 64a29c6..7799cc5 100644
--- a/analyzer/lib/dart/constant/value.dart
+++ b/analyzer/lib/dart/constant/value.dart
@@ -2,164 +2,134 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * The interface used to access the result of constant evaluation.
- *
- * Because the analyzer does not have any of the code under analysis loaded, it
- * does not do real evaluation. Instead it performs a symbolic computation and
- * presents those results through this interface.
- *
- * Instances of these constant values are accessed through the
- * [element model](../element/element.dart).
- */
+/// The interface used to access the result of constant evaluation.
+///
+/// Because the analyzer does not have any of the code under analysis loaded, it
+/// does not do real evaluation. Instead it performs a symbolic computation and
+/// presents those results through this interface.
+///
+/// Instances of these constant values are accessed through the
+/// [element model](../element/element.dart).
 import 'package:analyzer/dart/element/type.dart';
 
-/**
- * A representation of the value of a compile-time constant expression.
- *
- * Note that, unlike the mirrors system, the object being represented does *not*
- * exist. This interface allows static analysis tools to determine something
- * about the state of the object that would exist if the code that creates the
- * object were executed, but none of the code being analyzed is actually
- * executed.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A representation of the value of a compile-time constant expression.
+///
+/// Note that, unlike the mirrors system, the object being represented does *not*
+/// exist. This interface allows static analysis tools to determine something
+/// about the state of the object that would exist if the code that creates the
+/// object were executed, but none of the code being analyzed is actually
+/// executed.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class DartObject {
-  /**
-   * Return `true` if the value of the object being represented is known.
-   *
-   * This method will return `false` if
-   * * the value being represented is the value of a declared variable (a
-   *   variable whose value is provided at run-time using a `-D` command-line
-   *   option), or
-   * * the value is a function.
-   *
-   * The result of this method does not imply anything about the state of
-   * object representations returned by the method [getField], those that are
-   * elements of the list returned by [toListValue], or the keys or values in
-   * the map returned by [toMapValue]. For example, a representation of a list
-   * can return `true` even if one or more of the elements of that list would
-   * return `false`.
-   */
+  /// Return `true` if the value of the object being represented is known.
+  ///
+  /// This method will return `false` if
+  /// * the value being represented is the value of a declared variable (a
+  ///   variable whose value is provided at run-time using a `-D` command-line
+  ///   option), or
+  /// * the value is a function.
+  ///
+  /// The result of this method does not imply anything about the state of
+  /// object representations returned by the method [getField], those that are
+  /// elements of the list returned by [toListValue], or the keys or values in
+  /// the map returned by [toMapValue]. For example, a representation of a list
+  /// can return `true` even if one or more of the elements of that list would
+  /// return `false`.
   bool get hasKnownValue;
 
-  /**
-   * Return `true` if the object being represented represents the value 'null'.
-   */
+  /// Return `true` if the object being represented represents the value 'null'.
   bool get isNull;
 
-  /**
-   * Return a representation of the type of the object being represented.
-   *
-   * For values resulting from the invocation of a 'const' constructor, this
-   * will be a representation of the run-time type of the object.
-   *
-   * For values resulting from a literal expression, this will be a
-   * representation of the static type of the value -- `int` for integer
-   * literals, `List` for list literals, etc. -- even when the static type is an
-   * abstract type (such as `List`) and hence will never be the run-time type of
-   * the represented object.
-   *
-   * For values resulting from any other kind of expression, this will be a
-   * representation of the result of evaluating the expression.
-   *
-   * Return `null` if the expression cannot be evaluated, either because it is
-   * not a valid constant expression or because one or more of the values used
-   * in the expression does not have a known value.
-   *
-   * This method can return a representation of the type, even if this object
-   * would return `false` from [hasKnownValue].
-   */
+  /// Return a representation of the type of the object being represented.
+  ///
+  /// For values resulting from the invocation of a 'const' constructor, this
+  /// will be a representation of the run-time type of the object.
+  ///
+  /// For values resulting from a literal expression, this will be a
+  /// representation of the static type of the value -- `int` for integer
+  /// literals, `List` for list literals, etc. -- even when the static type is an
+  /// abstract type (such as `List`) and hence will never be the run-time type of
+  /// the represented object.
+  ///
+  /// For values resulting from any other kind of expression, this will be a
+  /// representation of the result of evaluating the expression.
+  ///
+  /// Return `null` if the expression cannot be evaluated, either because it is
+  /// not a valid constant expression or because one or more of the values used
+  /// in the expression does not have a known value.
+  ///
+  /// This method can return a representation of the type, even if this object
+  /// would return `false` from [hasKnownValue].
   ParameterizedType get type;
 
-  /**
-   * Return a representation of the value of the field with the given [name].
-   *
-   * Return `null` if either the object being represented does not have a field
-   * with the given name or if the implementation of the class of the object is
-   * invalid, making it impossible to determine that value of the field.
-   *
-   * Note that, unlike the mirrors API, this method does *not* invoke a getter;
-   * it simply returns a representation of the known state of a field.
-   */
+  /// Return a representation of the value of the field with the given [name].
+  ///
+  /// Return `null` if either the object being represented does not have a field
+  /// with the given name or if the implementation of the class of the object is
+  /// invalid, making it impossible to determine that value of the field.
+  ///
+  /// Note that, unlike the mirrors API, this method does *not* invoke a getter;
+  /// it simply returns a representation of the known state of a field.
   DartObject getField(String name);
 
-  /**
-   * Return a boolean corresponding to the value of the object being
-   * represented, or `null` if
-   * * this object is not of type 'bool',
-   * * the value of the object being represented is not known, or
-   * * the value of the object being represented is `null`.
-   */
+  /// Return a boolean corresponding to the value of the object being
+  /// represented, or `null` if
+  /// * this object is not of type 'bool',
+  /// * the value of the object being represented is not known, or
+  /// * the value of the object being represented is `null`.
   bool toBoolValue();
 
-  /**
-   * Return a double corresponding to the value of the object being represented,
-   * or `null`
-   * if
-   * * this object is not of type 'double',
-   * * the value of the object being represented is not known, or
-   * * the value of the object being represented is `null`.
-   */
+  /// Return a double corresponding to the value of the object being represented,
+  /// or `null`
+  /// if
+  /// * this object is not of type 'double',
+  /// * the value of the object being represented is not known, or
+  /// * the value of the object being represented is `null`.
   double toDoubleValue();
 
-  /**
-   * Return an integer corresponding to the value of the object being
-   * represented, or `null` if
-   * * this object is not of type 'int',
-   * * the value of the object being represented is not known, or
-   * * the value of the object being represented is `null`.
-   */
+  /// Return an integer corresponding to the value of the object being
+  /// represented, or `null` if
+  /// * this object is not of type 'int',
+  /// * the value of the object being represented is not known, or
+  /// * the value of the object being represented is `null`.
   int toIntValue();
 
-  /**
-   * Return a list corresponding to the value of the object being represented,
-   * or `null` if
-   * * this object is not of type 'List', or
-   * * the value of the object being represented is `null`.
-   */
+  /// Return a list corresponding to the value of the object being represented,
+  /// or `null` if
+  /// * this object is not of type 'List', or
+  /// * the value of the object being represented is `null`.
   List<DartObject> toListValue();
 
-  /**
-   * Return a map corresponding to the value of the object being represented, or
-   * `null` if
-   * * this object is not of type 'Map', or
-   * * the value of the object being represented is `null`.
-   */
+  /// Return a map corresponding to the value of the object being represented, or
+  /// `null` if
+  /// * this object is not of type 'Map', or
+  /// * the value of the object being represented is `null`.
   Map<DartObject, DartObject> toMapValue();
 
-  /**
-   * Return a set corresponding to the value of the object being represented,
-   * or `null` if
-   * * this object is not of type 'Set', or
-   * * the value of the object being represented is `null`.
-   */
+  /// Return a set corresponding to the value of the object being represented,
+  /// or `null` if
+  /// * this object is not of type 'Set', or
+  /// * the value of the object being represented is `null`.
   Set<DartObject> toSetValue();
 
-  /**
-   * Return a string corresponding to the value of the object being represented,
-   * or `null` if
-   * * this object is not of type 'String',
-   * * the value of the object being represented is not known, or
-   * * the value of the object being represented is `null`.
-   */
+  /// Return a string corresponding to the value of the object being represented,
+  /// or `null` if
+  /// * this object is not of type 'String',
+  /// * the value of the object being represented is not known, or
+  /// * the value of the object being represented is `null`.
   String toStringValue();
 
-  /**
-   * Return a string corresponding to the value of the object being represented,
-   * or `null` if
-   * * this object is not of type 'Symbol', or
-   * * the value of the object being represented is `null`.
-   * (We return the string
-   */
+  /// Return a string corresponding to the value of the object being represented,
+  /// or `null` if
+  /// * this object is not of type 'Symbol', or
+  /// * the value of the object being represented is `null`.
+  /// (We return the string
   String toSymbolValue();
 
-  /**
-   * Return the representation of the type corresponding to the value of the
-   * object being represented, or `null` if
-   * * this object is not of type 'Type', or
-   * * the value of the object being represented is `null`.
-   */
+  /// Return the representation of the type corresponding to the value of the
+  /// object being represented, or `null` if
+  /// * this object is not of type 'Type', or
+  /// * the value of the object being represented is `null`.
   DartType toTypeValue();
 }
diff --git a/analyzer/lib/dart/element/element.dart b/analyzer/lib/dart/element/element.dart
index 156688d..7b42b5e 100644
--- a/analyzer/lib/dart/element/element.dart
+++ b/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
@@ -520,19 +521,26 @@
   /// Return `true` if this element has an annotation of the form `@JS(..)`.
   bool get hasJS;
 
-  /// Return `true` if this element has an annotation of the form '@literal'.
+  /// Return `true` if this element has an annotation of the form `@literal`.
   bool get hasLiteral;
 
+  /// Return  `true` if this element has an annotation of the form `@mustCallSuper`.
+  bool get hasMustCallSuper;
+
+  /// Return `true` if this element has an annotation of the form
+  /// `@optionalTypeArgs`.
+  bool get hasOptionalTypeArgs;
+
   /// Return `true` if this element has an annotation of the form `@override`.
   bool get hasOverride;
 
   /// Return `true` if this element has an annotation of the form `@protected`.
   bool get hasProtected;
 
-  /// Return `true` if this element has an annotation of the form '@required'.
+  /// Return `true` if this element has an annotation of the form `@required`.
   bool get hasRequired;
 
-  /// Return `true` if this element has an annotation of the form '@sealed'.
+  /// Return `true` if this element has an annotation of the form `@sealed`.
   bool get hasSealed;
 
   /// Return `true` if this element has an annotation of the form
@@ -747,6 +755,10 @@
   /// overriding methods to call super.
   bool get isMustCallSuper;
 
+  /// Return `true` if this annotation marks the associated type as
+  /// having "optional" type arguments.
+  bool get isOptionalTypeArgs;
+
   /// Return `true` if this annotation marks the associated method as being
   /// expected to override an inherited method.
   bool get isOverride;
@@ -831,25 +843,27 @@
 
   static const ElementKind NAME = const ElementKind('NAME', 15, "<name>");
 
+  static const ElementKind NEVER = const ElementKind('NEVER', 16, "<never>");
+
   static const ElementKind PARAMETER =
-      const ElementKind('PARAMETER', 16, "parameter");
+      const ElementKind('PARAMETER', 17, "parameter");
 
   static const ElementKind PREFIX =
-      const ElementKind('PREFIX', 17, "import prefix");
+      const ElementKind('PREFIX', 18, "import prefix");
 
-  static const ElementKind SETTER = const ElementKind('SETTER', 18, "setter");
+  static const ElementKind SETTER = const ElementKind('SETTER', 19, "setter");
 
   static const ElementKind TOP_LEVEL_VARIABLE =
-      const ElementKind('TOP_LEVEL_VARIABLE', 19, "top level variable");
+      const ElementKind('TOP_LEVEL_VARIABLE', 20, "top level variable");
 
   static const ElementKind FUNCTION_TYPE_ALIAS =
-      const ElementKind('FUNCTION_TYPE_ALIAS', 20, "function type alias");
+      const ElementKind('FUNCTION_TYPE_ALIAS', 21, "function type alias");
 
   static const ElementKind TYPE_PARAMETER =
-      const ElementKind('TYPE_PARAMETER', 21, "type parameter");
+      const ElementKind('TYPE_PARAMETER', 22, "type parameter");
 
   static const ElementKind UNIVERSE =
-      const ElementKind('UNIVERSE', 22, "<universe>");
+      const ElementKind('UNIVERSE', 23, "<universe>");
 
   static const List<ElementKind> values = const [
     CLASS,
@@ -868,6 +882,7 @@
     LOCAL_VARIABLE,
     METHOD,
     NAME,
+    NEVER,
     PARAMETER,
     PREFIX,
     SETTER,
@@ -1039,7 +1054,7 @@
   /// 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;
 
   /// Returns `true` if this field can be overridden in strong mode.
@@ -1316,7 +1331,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 late evaluation semantics.
+  ///
+  /// This will always return `false` unless the experiment 'non-nullable' is
+  /// enabled.
+  @experimental
+  bool get isLate;
+}
 
 /// An element that represents a method defined within a type.
 ///
@@ -1381,23 +1403,35 @@
   /// Return `true` if this parameter is an initializing formal parameter.
   bool get isInitializingFormal;
 
-  /// Return `true` if this parameter is a named parameter. Named parameters are
-  /// always optional, even when they are annotated with the `@required`
-  /// annotation.
+  /// Return `true` if this parameter is a named parameter. Named parameters
+  /// that are annotated with the `@required` annotation are considered
+  /// optional.  Named parameters that are annotated with the `required` syntax
+  /// are considered required.
   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;
 
   /// Return `true` if this parameter is an optional parameter. Optional
-  /// parameters can either be positional or named.
+  /// parameters can either be positional or named.  Named parameters that are
+  /// annotated with the `@required` annotation are considered optional.  Named
+  /// parameters that are annotated with the `required` syntax are considered
+  /// required.
   bool get isOptional;
 
+  /// Return `true` if this parameter is both an optional and named parameter.
+  /// Named parameters that are annotated with the `@required` annotation are
+  /// considered optional.  Named parameters that are annotated with the
+  /// `required` syntax are considered required.
+  bool get isOptionalNamed;
+
   /// Return `true` if this parameter is both an optional and positional
   /// parameter.
   bool get isOptionalPositional;
@@ -1406,6 +1440,16 @@
   /// parameters can either be required or optional.
   bool get isPositional;
 
+  /// Return `true` if this parameter is both a required and named parameter.
+  /// Named parameters that are annotated with the `@required` annotation are
+  /// considered optional.  Named parameters that are annotated with the
+  /// `required` syntax are considered required.
+  bool get isRequiredNamed;
+
+  /// Return `true` if this parameter is both a required and positional
+  /// parameter.
+  bool get isRequiredPositional;
+
   /// Return the kind of this parameter.
   @deprecated
   ParameterKind get parameterKind;
@@ -1504,6 +1548,13 @@
   /// will be synthetic.
   PropertyAccessorElement get getter;
 
+  /// Return `true` if this variable uses late evaluation semantics.
+  ///
+  /// This will always return `false` unless the experiment 'non-nullable' is
+  /// enabled.
+  @experimental
+  bool get isLate;
+
   /// Return the propagated type of this variable, or `null` if type propagation
   /// has not been performed, for example because the variable is not final.
   @deprecated
diff --git a/analyzer/lib/dart/element/type.dart b/analyzer/lib/dart/element/type.dart
index c4beb80..ce67ab7 100644
--- a/analyzer/lib/dart/element/type.dart
+++ b/analyzer/lib/dart/element/type.dart
@@ -1,141 +1,109 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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.
 
-/**
- * Defines the type model. The type model is part of the
- * [element model](../dart_element_element/dart_element_element-library.html)
- * in that most types are defined by Dart code (the types `dynamic` and `void`
- * being the notable exceptions). All types are represented by an instance of a
- * subclass of [DartType].
- *
- * Other than `dynamic` and `void`, all of the types define either the interface
- * defined by a class (an instance of [InterfaceType]) or the type of a function
- * (an instance of [FunctionType]).
- *
- * We make a distinction between the declaration of a class (a [ClassElement])
- * and the type defined by that class (an [InterfaceType]). The biggest reason
- * for the distinction is to allow us to more cleanly represent the distinction
- * between type parameters and type arguments. For example, if we define a class
- * as `class Pair<K, V> {}`, the declarations of `K` and `V` represent type
- * parameters. But if we declare a variable as `Pair<String, int> pair;` the
- * references to `String` and `int` are type arguments.
- */
+/// Defines the type model. The type model is part of the
+/// [element model](../dart_element_element/dart_element_element-library.html)
+/// in that most types are defined by Dart code (the types `dynamic` and `void`
+/// being the notable exceptions). All types are represented by an instance of a
+/// subclass of [DartType].
+///
+/// Other than `dynamic` and `void`, all of the types define either the
+/// interface defined by a class (an instance of [InterfaceType]) or the type of
+/// a function (an instance of [FunctionType]).
+///
+/// We make a distinction between the declaration of a class (a [ClassElement])
+/// and the type defined by that class (an [InterfaceType]). The biggest reason
+/// for the distinction is to allow us to more cleanly represent the distinction
+/// between type parameters and type arguments. For example, if we define a
+/// class as `class Pair<K, V> {}`, the declarations of `K` and `V` represent
+/// type parameters. But if we declare a variable as `Pair<String, int> pair;`
+/// the references to `String` and `int` are type arguments.
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart' show InterfaceTypeImpl;
 import 'package:analyzer/src/generated/type_system.dart' show TypeSystem;
 
-/**
- * The type associated with elements in the element model.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The type associated with elements in the element model.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class DartType {
-  /**
-   * Return the name of this type as it should appear when presented to users in
-   * contexts such as error messages.
-   */
+  /// Return the name of this type as it should appear when presented to users
+  /// in contexts such as error messages.
   String get displayName;
 
-  /**
-   * Return the element representing the declaration of this type, or `null` if
-   * the type has not, or cannot, be associated with an element. The former case
-   * will occur if the element model is not yet complete; the latter case will
-   * occur if this object represents an undefined type.
-   */
+  /// Return the element representing the declaration of this type, or `null` if
+  /// the type has not, or cannot, be associated with an element. The former
+  /// case will occur if the element model is not yet complete; the latter case
+  /// will occur if this object represents an undefined type.
   Element get element;
 
-  /**
-   * Return `true` if this type represents the bottom type.
-   */
+  /// Return `true` if this type represents the bottom type.
   bool get isBottom;
 
-  /**
-   * Return `true` if this type represents the type 'Future' defined in the
-   * dart:async library.
-   */
+  /// Return `true` if this type represents the type 'Future' defined in the
+  /// dart:async library.
   bool get isDartAsyncFuture;
 
-  /**
-   * Return `true` if this type represents the type 'FutureOr<T>' defined in the
-   * dart:async library.
-   */
+  /// Return `true` if this type represents the type 'FutureOr<T>' defined in
+  /// the dart:async library.
   bool get isDartAsyncFutureOr;
 
-  /**
-   * Return `true` if this type represents the type 'bool' defined in the
-   * dart:core library.
-   */
+  /// Return `true` if this type represents the type 'bool' defined in the
+  /// dart:core library.
   bool get isDartCoreBool;
 
-  /**
-   * Return `true` if this type represents the type 'double' defined in the
-   * dart:core library.
-   */
+  /// Return `true` if this type represents the type 'double' defined in the
+  /// dart:core library.
   bool get isDartCoreDouble;
 
-  /**
-   * Return `true` if this type represents the type 'Function' defined in the
-   * dart:core library.
-   */
+  /// Return `true` if this type represents the type 'Function' defined in the
+  /// dart:core library.
   bool get isDartCoreFunction;
 
-  /**
-   * Return `true` if this type represents the type 'int' defined in the
-   * dart:core library.
-   */
+  /// Return `true` if this type represents the type 'int' defined in the
+  /// dart:core library.
   bool get isDartCoreInt;
 
-  /**
-   * Return `true` if this type represents the type 'Null' defined in the
-   * dart:core library.
-   */
+  /// Return `true` if this type represents the type 'Null' defined in the
+  /// dart:core library.
   bool get isDartCoreNull;
 
-  /**
-   * Return `true` if this type represents the type 'dynamic'.
-   */
+  /// Return `true` if this type represents the type 'String' defined in the
+  /// dart:core library.
+  bool get isDartCoreString;
+
+  /// Return `true` if this type represents the type 'dynamic'.
   bool get isDynamic;
 
-  /**
-   * Return `true` if this type represents the type 'Object'.
-   */
+  /// Return `true` if this type represents the type 'Object'.
   bool get isObject;
 
-  /**
-   * Return `true` if this type represents a typename that couldn't be resolved.
-   */
+  /// Return `true` if this type represents a typename that couldn't be
+  /// resolved.
+  @deprecated
   bool get isUndefined;
 
-  /**
-   * Return `true` if this type represents the type 'void'.
-   */
+  /// Return `true` if this type represents the type 'void'.
   bool get isVoid;
 
-  /**
-   * Return the name of this type, or `null` if the type does not have a name,
-   * such as when the type represents the type of an unnamed function.
-   */
+  /// Return the name of this type, or `null` if the type does not have a name,
+  /// such as when the type represents the type of an unnamed function.
   String get name;
 
-  /**
-   * Implements the function "flatten" defined in the spec, where T is this
-   * type:
-   *
-   *     If T = Future<S> then flatten(T) = flatten(S).
-   *
-   *     Otherwise if T <: Future then let S be a type such that T << Future<S>
-   *     and for all R, if T << Future<R> then S << R.  Then flatten(T) = S.
-   *
-   *     In any other circumstance, flatten(T) = T.
-   */
+  /// Implements the function "flatten" defined in the spec, where T is this
+  /// type:
+  ///
+  ///     If T = Future<S> then flatten(T) = flatten(S).
+  ///
+  ///     Otherwise if T <: Future then let S be a type such that T << Future<S>
+  ///     and for all R, if T << Future<R> then S << R.  Then flatten(T) = S.
+  ///
+  ///     In any other circumstance, flatten(T) = T.
   DartType flattenFutures(TypeSystem typeSystem);
 
-  /**
-   * Return `true` if this type is assignable to the given [type]. A type
-   * <i>T</i> may be assigned to a type <i>S</i>, written <i>T</i> &hArr;
-   * <i>S</i>, iff either <i>T</i> <: <i>S</i> or <i>S</i> <: <i>T</i>.
-   */
+  /// Return `true` if this type is assignable to the given [type]. A type
+  /// <i>T</i> may be assigned to a type <i>S</i>, written <i>T</i> &hArr;
+  /// <i>S</i>, iff either <i>T</i> <: <i>S</i> or <i>S</i> <: <i>T</i>.
   bool isAssignableTo(DartType type);
 
   /// Indicates whether `this` represents a type that is equivalent to `dest`.
@@ -148,196 +116,165 @@
   /// `isEquivalentTo` considers them to be equivalent.
   bool isEquivalentTo(DartType dest);
 
-  /**
-   * Return `true` if this type is more specific than the given [type].
-   */
+  /// Return `true` if this type is more specific than the given [type].
   bool isMoreSpecificThan(DartType type);
 
-  /**
-   * Return `true` if this type is a subtype of the given [type].
-   */
+  /// Return `true` if this type is a subtype of the given [type].
   bool isSubtypeOf(DartType type);
 
-  /**
-   * Return `true` if this type is a supertype of the given [type]. A type
-   * <i>S</i> is a supertype of <i>T</i>, written <i>S</i> :> <i>T</i>, iff
-   * <i>T</i> is a subtype of <i>S</i>.
-   */
+  /// Return `true` if this type is a supertype of the given [type]. A type
+  /// <i>S</i> is a supertype of <i>T</i>, written <i>S</i> :> <i>T</i>, iff
+  /// <i>T</i> is a subtype of <i>S</i>.
   bool isSupertypeOf(DartType type);
 
-  /**
-   * If this type is a [TypeParameterType], returns its bound if it has one, or
-   * [objectType] otherwise.
-   *
-   * For any other type, returns `this`. Applies recursively -- if the bound is
-   * itself a type parameter, that is resolved too.
-   */
+  /// If this type is a [TypeParameterType], returns its bound if it has one, or
+  /// [objectType] otherwise.
+  ///
+  /// For any other type, returns `this`. Applies recursively -- if the bound is
+  /// itself a type parameter, that is resolved too.
   DartType resolveToBound(DartType objectType);
 
-  /**
-   * Return the type resulting from substituting the given [argumentTypes] for
-   * the given [parameterTypes] in this type. The specification defines this
-   * operation in section 2:
-   * <blockquote>
-   * The notation <i>[x<sub>1</sub>, ..., x<sub>n</sub>/y<sub>1</sub>, ...,
-   * y<sub>n</sub>]E</i> denotes a copy of <i>E</i> in which all occurrences of
-   * <i>y<sub>i</sub>, 1 <= i <= n</i> have been replaced with
-   * <i>x<sub>i</sub></i>.
-   * </blockquote>
-   * Note that, contrary to the specification, this method will not create a
-   * copy of this type if no substitutions were required, but will return this
-   * type directly.
-   *
-   * Note too that the current implementation of this method is only guaranteed
-   * to work when the parameter types are type variables.
-   */
+  /// Return the type resulting from substituting the given [argumentTypes] for
+  /// the given [parameterTypes] in this type. The specification defines this
+  /// operation in section 2:
+  /// <blockquote>
+  /// The notation <i>[x<sub>1</sub>, ..., x<sub>n</sub>/y<sub>1</sub>, ...,
+  /// y<sub>n</sub>]E</i> denotes a copy of <i>E</i> in which all occurrences of
+  /// <i>y<sub>i</sub>, 1 <= i <= n</i> have been replaced with
+  /// <i>x<sub>i</sub></i>.
+  /// </blockquote>
+  /// Note that, contrary to the specification, this method will not create a
+  /// copy of this type if no substitutions were required, but will return this
+  /// type directly.
+  ///
+  /// Note too that the current implementation of this method is only guaranteed
+  /// to work when the parameter types are type variables.
   DartType substitute2(
       List<DartType> argumentTypes, List<DartType> parameterTypes);
 }
 
-/**
- * The type of a function, method, constructor, getter, or setter. Function
- * types come in three variations:
- *
- * * The types of functions that only have required parameters. These have the
- *   general form <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i>.
- * * The types of functions with optional positional parameters. These have the
- *   general form <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>
- *   &hellip;, T<sub>n+k</sub>]) &rarr; T</i>.
- * * The types of functions with named parameters. These have the general form
- *   <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;,
- *   T<sub>xk</sub> xk}) &rarr; T</i>.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The type of a function, method, constructor, getter, or setter. Function
+/// types come in three variations:
+///
+/// * The types of functions that only have required parameters. These have the
+///   general form <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i>.
+/// * The types of functions with optional positional parameters. These have the
+///   general form <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>
+///   &hellip;, T<sub>n+k</sub>]) &rarr; T</i>.
+/// * The types of functions with named parameters. These have the general form
+///   <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;,
+///   T<sub>xk</sub> xk}) &rarr; T</i>.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class FunctionType implements ParameterizedType {
-  /**
-   * Deprecated: use [typeFormals].
-   */
+  /// Deprecated: use [typeFormals].
   @deprecated
   List<TypeParameterElement> get boundTypeParameters;
 
-  /**
-   * Return a map from the names of named parameters to the types of the named
-   * parameters of this type of function. The entries in the map will be
-   * iterated in the same order as the order in which the named parameters were
-   * defined. If there were no named parameters declared then the map will be
-   * empty.
-   */
+  /// Return a map from the names of named parameters to the types of the named
+  /// parameters of this type of function. The entries in the map will be
+  /// iterated in the same order as the order in which the named parameters were
+  /// defined. If there were no named parameters declared then the map will be
+  /// empty.
   Map<String, DartType> get namedParameterTypes;
 
-  /**
-   * The names of the required positional parameters of this type of function,
-   * in the order that the parameters appear.
-   */
+  /// The names of the required positional parameters of this type of function,
+  /// in the order that the parameters appear.
   List<String> get normalParameterNames;
 
-  /**
-   * Return a list containing the types of the normal parameters of this type of
-   * function. The parameter types are in the same order as they appear in the
-   * declaration of the function.
-   */
+  /// Return a list containing the types of the normal parameters of this type
+  /// of function. The parameter types are in the same order as they appear in
+  /// the declaration of the function.
   List<DartType> get normalParameterTypes;
 
-  /**
-   * The names of the optional positional parameters of this type of function,
-   * in the order that the parameters appear.
-   */
+  /// The names of the optional positional parameters of this type of function,
+  /// in the order that the parameters appear.
   List<String> get optionalParameterNames;
 
-  /**
-   * Return a map from the names of optional (positional) parameters to the
-   * types of the optional parameters of this type of function. The entries in
-   * the map will be iterated in the same order as the order in which the
-   * optional parameters were defined. If there were no optional parameters
-   * declared then the map will be empty.
-   */
+  /// Return a map from the names of optional (positional) parameters to the
+  /// types of the optional parameters of this type of function. The entries in
+  /// the map will be iterated in the same order as the order in which the
+  /// optional parameters were defined. If there were no optional parameters
+  /// declared then the map will be empty.
   List<DartType> get optionalParameterTypes;
 
-  /**
-   * Return a list containing the parameters elements of this type of function.
-   * The parameter types are in the same order as they appear in the declaration
-   * of the function.
-   */
+  /// Return a list containing the parameters elements of this type of function.
+  /// The parameter types are in the same order as they appear in the
+  /// declaration of the function.
   List<ParameterElement> get parameters;
 
-  /**
-   * Return the type of object returned by this type of function.
-   */
+  /// Return the type of object returned by this type of function.
   DartType get returnType;
 
-  /**
-   * The formal type parameters of this generic function.
-   * For example `<T> T -> T`.
-   *
-   * These are distinct from the [typeParameters] list, which contains type
-   * parameters from surrounding contexts, and thus are free type variables from
-   * the perspective of this function type.
-   */
+  /// The formal type parameters of this generic function.
+  /// For example `<T> T -> T`.
+  ///
+  /// These are distinct from the [typeParameters] list, which contains type
+  /// parameters from surrounding contexts, and thus are free type variables
+  /// from the perspective of this function type.
   List<TypeParameterElement> get typeFormals;
 
   @override
   FunctionType instantiate(List<DartType> argumentTypes);
 
-  /**
-   * Return `true` if this type is a subtype of the given [type].
-   *
-   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i> is
-   * a subtype of the function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>)
-   * &rarr; S</i>, if all of the following conditions are met:
-   *
-   * * Either
-   *   * <i>S</i> is void, or
-   *   * <i>T &hArr; S</i>.
-   *
-   * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr;
-   *   S<sub>i</sub></i>.
-   *
-   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>,
-   * [T<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>]) &rarr; T</i> is a subtype of
-   * the function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>,
-   * [S<sub>n+1</sub>, &hellip;, S<sub>n+m</sub>]) &rarr; S</i>, if all of the
-   * following conditions are met:
-   *
-   * * Either
-   *   * <i>S</i> is void, or
-   *   * <i>T &hArr; S</i>.
-   *
-   * * <i>k</i> >= <i>m</i> and for all <i>i</i>, 1 <= <i>i</i> <= <i>n+m</i>,
-   *   <i>T<sub>i</sub> &hArr; S<sub>i</sub></i>.
-   *
-   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>,
-   * {T<sub>x1</sub> x1, &hellip;, T<sub>xk</sub> xk}) &rarr; T</i> is a subtype
-   * of the function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>,
-   * {S<sub>y1</sub> y1, &hellip;, S<sub>ym</sub> ym}) &rarr; S</i>, if all of
-   * the following conditions are met:
-   * * Either
-   *   * <i>S</i> is void,
-   *   * or <i>T &hArr; S</i>.
-   *
-   * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr;
-   *   S<sub>i</sub></i>.
-   * * <i>k</i> >= <i>m</i> and <i>y<sub>i</sub></i> in <i>{x<sub>1</sub>,
-   *   &hellip;, x<sub>k</sub>}</i>, 1 <= <i>i</i> <= <i>m</i>.
-   * * For all <i>y<sub>i</sub></i> in <i>{y<sub>1</sub>, &hellip;,
-   *   y<sub>m</sub>}</i>, <i>y<sub>i</sub> = x<sub>j</sub> => Tj &hArr; Si</i>.
-   *
-   * In addition, the following subtype rules apply:
-   *
-   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, []) &rarr; T <: (T<sub>1</sub>,
-   * &hellip;, T<sub>n</sub>) &rarr; T.</i><br>
-   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>,
-   * &hellip;, T<sub>n</sub>, {}) &rarr; T.</i><br>
-   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {}) &rarr; T <: (T<sub>1</sub>,
-   * &hellip;, T<sub>n</sub>) &rarr; T.</i><br>
-   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>,
-   * &hellip;, T<sub>n</sub>, []) &rarr; T.</i>
-   *
-   * All functions implement the class `Function`. However not all function
-   * types are a subtype of `Function`. If an interface type <i>I</i> includes a
-   * method named `call()`, and the type of `call()` is the function type
-   * <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>.
-   */
+  /// Return `true` if this type is a subtype of the given [type].
+  ///
+  /// A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i>
+  /// is a subtype of the function type <i>(S<sub>1</sub>, &hellip;,
+  /// S<sub>n</sub>) &rarr; S</i>, if all of the following conditions are met:
+  ///
+  /// * Either
+  ///   * <i>S</i> is void, or
+  ///   * <i>T &hArr; S</i>.
+  ///
+  /// * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr;
+  ///   S<sub>i</sub></i>.
+  ///
+  /// A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>,
+  /// [T<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>]) &rarr; T</i> is a subtype of
+  /// the function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>,
+  /// [S<sub>n+1</sub>, &hellip;, S<sub>n+m</sub>]) &rarr; S</i>, if all of the
+  /// following conditions are met:
+  ///
+  /// * Either
+  ///   * <i>S</i> is void, or
+  ///   * <i>T &hArr; S</i>.
+  ///
+  /// * <i>k</i> >= <i>m</i> and for all <i>i</i>, 1 <= <i>i</i> <= <i>n+m</i>,
+  ///   <i>T<sub>i</sub> &hArr; S<sub>i</sub></i>.
+  ///
+  /// A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>,
+  /// {T<sub>x1</sub> x1, &hellip;, T<sub>xk</sub> xk}) &rarr; T</i> is a
+  /// subtype of the function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>,
+  /// {S<sub>y1</sub> y1, &hellip;, S<sub>ym</sub> ym}) &rarr; S</i>, if all of
+  /// the following conditions are met:
+  /// * Either
+  ///   * <i>S</i> is void,
+  ///   * or <i>T &hArr; S</i>.
+  ///
+  /// * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr;
+  ///   S<sub>i</sub></i>.
+  /// * <i>k</i> >= <i>m</i> and <i>y<sub>i</sub></i> in <i>{x<sub>1</sub>,
+  ///   &hellip;, x<sub>k</sub>}</i>, 1 <= <i>i</i> <= <i>m</i>.
+  /// * For all <i>y<sub>i</sub></i> in <i>{y<sub>1</sub>, &hellip;,
+  ///   y<sub>m</sub>}</i>, <i>y<sub>i</sub> = x<sub>j</sub> => Tj &hArr;
+  ///   Si</i>.
+  ///
+  /// In addition, the following subtype rules apply:
+  ///
+  /// <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, []) &rarr; T <:
+  /// (T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T.</i><br>
+  /// <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>,
+  /// &hellip;, T<sub>n</sub>, {}) &rarr; T.</i><br>
+  /// <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {}) &rarr; T <:
+  /// (T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T.</i><br>
+  /// <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>,
+  /// &hellip;, T<sub>n</sub>, []) &rarr; T.</i>
+  ///
+  /// All functions implement the class `Function`. However not all function
+  /// types are a subtype of `Function`. If an interface type <i>I</i> includes
+  /// a method named `call()`, and the type of `call()` is the function type
+  /// <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>.
   @override
   bool isSubtypeOf(DartType type);
 
@@ -345,318 +282,269 @@
   FunctionType substitute2(
       List<DartType> argumentTypes, List<DartType> parameterTypes);
 
-  /**
-   * Return the type resulting from substituting the given [argumentTypes] for
-   * this type's parameters. This is fully equivalent to
-   * `substitute(argumentTypes, getTypeArguments())`.
-   */
+  /// Return the type resulting from substituting the given [argumentTypes] for
+  /// this type's parameters. This is fully equivalent to
+  /// `substitute(argumentTypes, getTypeArguments())`.
   @deprecated // use instantiate
   FunctionType substitute3(List<DartType> argumentTypes);
 }
 
-/**
- * The type introduced by either a class or an interface, or a reference to such
- * a type.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The type introduced by either a class or an interface, or a reference to
+/// such a type.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class InterfaceType implements ParameterizedType {
-  /**
-   * Return a list containing all of the accessors (getters and setters)
-   * declared in this type.
-   */
+  /// Return a list containing all of the accessors (getters and setters)
+  /// declared in this type.
   List<PropertyAccessorElement> get accessors;
 
-  /**
-   * Return a list containing all of the constructors declared in this type.
-   */
+  /// Return a list containing all of the constructors declared in this type.
   List<ConstructorElement> get constructors;
 
   @override
   ClassElement get element;
 
-  /**
-   * Return a list containing all of the interfaces that are implemented by this
-   * interface. Note that this is <b>not</b>, in general, equivalent to getting
-   * the interfaces from this type's element because the types returned by this
-   * method will have had their type parameters replaced.
-   */
+  /// Return a list containing all of the interfaces that are implemented by
+  /// this interface. Note that this is <b>not</b>, in general, equivalent to
+  /// getting the interfaces from this type's element because the types returned
+  /// by this method will have had their type parameters replaced.
   List<InterfaceType> get interfaces;
 
-  /**
-   * Return a list containing all of the methods declared in this type.
-   */
+  /// Return a list containing all of the methods declared in this type.
   List<MethodElement> get methods;
 
-  /**
-   * Return a list containing all of the mixins that are applied to the class
-   * being extended in order to derive the superclass of this class. Note that
-   * this is <b>not</b>, in general, equivalent to getting the mixins from this
-   * type's element because the types returned by this method will have had
-   * their type parameters replaced.
-   */
+  /// Return a list containing all of the mixins that are applied to the class
+  /// being extended in order to derive the superclass of this class. Note that
+  /// this is <b>not</b>, in general, equivalent to getting the mixins from this
+  /// type's element because the types returned by this method will have had
+  /// their type parameters replaced.
   List<InterfaceType> get mixins;
 
-  /**
-   * Return the type representing the superclass of this type, or null if this
-   * type represents the class 'Object'. Note that this is <b>not</b>, in
-   * general, equivalent to getting the superclass from this type's element
-   * because the type returned by this method will have had it's type parameters
-   * replaced.
-   */
+  /// Return the type representing the superclass of this type, or null if this
+  /// type represents the class 'Object'. Note that this is <b>not</b>, in
+  /// general, equivalent to getting the superclass from this type's element
+  /// because the type returned by this method will have had it's type
+  /// parameters replaced.
   InterfaceType get superclass;
 
-  /**
-   * Return a list containing all of the super-class constraints that this
-   * mixin declaration declares. The list will be empty if this class does not
-   * represent a mixin declaration.
-   */
+  /// Return a list containing all of the super-class constraints that this
+  /// mixin declaration declares. The list will be empty if this class does not
+  /// represent a mixin declaration.
   List<InterfaceType> get superclassConstraints;
 
-  /**
-   * Return the element representing the getter with the given [name] that is
-   * declared in this class, or `null` if this class does not declare a getter
-   * with the given name.
-   */
+  /// Return the element representing the getter with the given [name] that is
+  /// declared in this class, or `null` if this class does not declare a getter
+  /// with the given name.
   PropertyAccessorElement getGetter(String name);
 
-  /**
-   * Return the element representing the method with the given [name] that is
-   * declared in this class, or `null` if this class does not declare a method
-   * with the given name.
-   */
+  /// Return the element representing the method with the given [name] that is
+  /// declared in this class, or `null` if this class does not declare a method
+  /// with the given name.
   MethodElement getMethod(String name);
 
-  /**
-   * Return the element representing the setter with the given [name] that is
-   * declared in this class, or `null` if this class does not declare a setter
-   * with the given name.
-   */
+  /// Return the element representing the setter with the given [name] that is
+  /// declared in this class, or `null` if this class does not declare a setter
+  /// with the given name.
   PropertyAccessorElement getSetter(String name);
 
   @override
   InterfaceType instantiate(List<DartType> argumentTypes);
 
-  /**
-   * Return `true` if this type is a direct supertype of the given [type]. The
-   * implicit interface of class <i>I</i> is a direct supertype of the implicit
-   * interface of class <i>J</i> iff:
-   *
-   * * <i>I</i> is Object, and <i>J</i> has no extends clause.
-   * * <i>I</i> is listed in the extends clause of <i>J</i>.
-   * * <i>I</i> is listed in the implements clause of <i>J</i>.
-   * * <i>I</i> is listed in the with clause of <i>J</i>.
-   * * <i>J</i> is a mixin application of the mixin of <i>I</i>.
-   */
+  /// Return `true` if this type is a direct supertype of the given [type]. The
+  /// implicit interface of class <i>I</i> is a direct supertype of the implicit
+  /// interface of class <i>J</i> iff:
+  ///
+  /// * <i>I</i> is Object, and <i>J</i> has no extends clause.
+  /// * <i>I</i> is listed in the extends clause of <i>J</i>.
+  /// * <i>I</i> is listed in the implements clause of <i>J</i>.
+  /// * <i>I</i> is listed in the with clause of <i>J</i>.
+  /// * <i>J</i> is a mixin application of the mixin of <i>I</i>.
   bool isDirectSupertypeOf(InterfaceType type);
 
-  /**
-   * Return `true` if this type is more specific than the given [type]. An
-   * interface type <i>T</i> is more specific than an interface type <i>S</i>,
-   * written <i>T &laquo; S</i>, if one of the following conditions is met:
-   *
-   * * Reflexivity: <i>T</i> is <i>S</i>.
-   * * <i>T</i> is bottom.
-   * * <i>S</i> is dynamic.
-   * * Direct supertype: <i>S</i> is a direct supertype of <i>T</i>.
-   * * <i>T</i> is a type parameter and <i>S</i> is the upper bound of <i>T</i>.
-   * * Covariance: <i>T</i> is of the form <i>I&lt;T<sub>1</sub>, &hellip;,
-   *   T<sub>n</sub>&gt;</i> and S</i> is of the form <i>I&lt;S<sub>1</sub>,
-   *   &hellip;, S<sub>n</sub>&gt;</i> and <i>T<sub>i</sub> &laquo;
-   *   S<sub>i</sub></i>, <i>1 <= i <= n</i>.
-   * * Transitivity: <i>T &laquo; U</i> and <i>U &laquo; S</i>.
-   */
+  /// Return `true` if this type is more specific than the given [type]. An
+  /// interface type <i>T</i> is more specific than an interface type <i>S</i>,
+  /// written <i>T &laquo; S</i>, if one of the following conditions is met:
+  ///
+  /// * Reflexivity: <i>T</i> is <i>S</i>.
+  /// * <i>T</i> is bottom.
+  /// * <i>S</i> is dynamic.
+  /// * Direct supertype: <i>S</i> is a direct supertype of <i>T</i>.
+  /// * <i>T</i> is a type parameter and <i>S</i> is the upper bound of
+  /// <i>T</i>.
+  /// * Covariance: <i>T</i> is of the form <i>I&lt;T<sub>1</sub>, &hellip;,
+  ///   T<sub>n</sub>&gt;</i> and S</i> is of the form <i>I&lt;S<sub>1</sub>,
+  ///   &hellip;, S<sub>n</sub>&gt;</i> and <i>T<sub>i</sub> &laquo;
+  ///   S<sub>i</sub></i>, <i>1 <= i <= n</i>.
+  /// * Transitivity: <i>T &laquo; U</i> and <i>U &laquo; S</i>.
   @override
   bool isMoreSpecificThan(DartType type);
 
-  /**
-   * Return `true` if this type is a subtype of the given [type]. An interface
-   * type <i>T</i> is a subtype of an interface type <i>S</i>, written <i>T</i>
-   * <: <i>S</i>, iff <i>[bottom/dynamic]T</i> &laquo; <i>S</i> (<i>T</i> is
-   * more specific than <i>S</i>). If an interface type <i>I</i> includes a
-   * method named <i>call()</i>, and the type of <i>call()</i> is the function
-   * type <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>.
-   */
+  /// Return `true` if this type is a subtype of the given [type]. An interface
+  /// type <i>T</i> is a subtype of an interface type <i>S</i>, written <i>T</i>
+  /// <: <i>S</i>, iff <i>[bottom/dynamic]T</i> &laquo; <i>S</i> (<i>T</i> is
+  /// more specific than <i>S</i>). If an interface type <i>I</i> includes a
+  /// method named <i>call()</i>, and the type of <i>call()</i> is the function
+  /// type <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>.
   @override
   bool isSubtypeOf(DartType type);
 
-  /**
-   * Return the element representing the constructor that results from looking
-   * up the constructor with the given [name] in this class with respect to the
-   * given [library], or `null` if the look up fails. The behavior of this
-   * method is defined by the Dart Language Specification in section 12.11.1:
-   * <blockquote>
-   * If <i>e</i> is of the form <b>new</b> <i>T.id()</i> then let <i>q<i> be the
-   * constructor <i>T.id</i>, otherwise let <i>q<i> be the constructor <i>T<i>.
-   * Otherwise, if <i>q</i> is not defined or not accessible, a
-   * NoSuchMethodException is thrown.
-   * </blockquote>
-   */
+  /// Return the element representing the constructor that results from looking
+  /// up the constructor with the given [name] in this class with respect to the
+  /// given [library], or `null` if the look up fails. The behavior of this
+  /// method is defined by the Dart Language Specification in section 12.11.1:
+  /// <blockquote>
+  /// If <i>e</i> is of the form <b>new</b> <i>T.id()</i> then let <i>q<i> be
+  /// the constructor <i>T.id</i>, otherwise let <i>q<i> be the constructor
+  /// <i>T<i>. Otherwise, if <i>q</i> is not defined or not accessible, a
+  /// NoSuchMethodException is thrown.
+  /// </blockquote>
   ConstructorElement lookUpConstructor(String name, LibraryElement library);
 
-  /**
-   * Return the element representing the getter that results from looking up the
-   * getter with the given [name] in this class with respect to the given
-   * [library], or `null` if the look up fails. The behavior of this method is
-   * defined by the Dart Language Specification in section 12.15.1:
-   * <blockquote>
-   * The result of looking up getter (respectively setter) <i>m</i> in class
-   * <i>C</i> with respect to library <i>L</i> is:
-   * * If <i>C</i> declares an instance getter (respectively setter) named
-   *   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
-   *   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
-   *   superclass <i>S</i>, then the result of the lookup is the result of
-   *   looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect
-   *   to <i>L</i>. Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   */
+  /// Return the element representing the getter that results from looking up
+  /// the getter with the given [name] in this class with respect to the given
+  /// [library], or `null` if the look up fails. The behavior of this method is
+  /// defined by the Dart Language Specification in section 12.15.1:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is:
+  /// * If <i>C</i> declares an instance getter (respectively setter) named
+  ///   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
+  ///   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
+  ///   superclass <i>S</i>, then the result of the lookup is the result of
+  ///   looking up getter (respectively setter) <i>m</i> in <i>S</i> with
+  ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
+  /// </blockquote>
   PropertyAccessorElement lookUpGetter(String name, LibraryElement library);
 
-  /**
-   * Return the element representing the getter that results from looking up the
-   * getter with the given [name] in the superclass of this class with respect
-   * to the given [library], or `null` if the look up fails. The behavior of
-   * this method is defined by the Dart Language Specification in section
-   * 12.15.1:
-   * <blockquote>
-   * The result of looking up getter (respectively setter) <i>m</i> in class
-   * <i>C</i> with respect to library <i>L</i> is:
-   * * If <i>C</i> declares an instance getter (respectively setter) named
-   *   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
-   *   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
-   *   superclass <i>S</i>, then the result of the lookup is the result of
-   *   looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect
-   *   to <i>L</i>. Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   */
+  /// Return the element representing the getter that results from looking up
+  /// the getter with the given [name] in the superclass of this class with
+  /// respect to the given [library], or `null` if the look up fails. The
+  /// behavior of this method is defined by the Dart Language Specification in
+  /// section 12.15.1:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is:
+  /// * If <i>C</i> declares an instance getter (respectively setter) named
+  ///   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
+  ///   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
+  ///   superclass <i>S</i>, then the result of the lookup is the result of
+  ///   looking up getter (respectively setter) <i>m</i> in <i>S</i> with
+  ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
+  /// </blockquote>
   PropertyAccessorElement lookUpGetterInSuperclass(
       String name, LibraryElement library);
 
-  /**
-   * Look up the member with the given [name] in this type and all extended
-   * and mixed in classes, and by default including [thisType]. If the search
-   * fails, this will then search interfaces.
-   *
-   * Return the element representing the member that was found, or `null` if
-   * there is no getter with the given name.
-   *
-   * The [library] determines if a private member name is visible, and does not
-   * need to be supplied for public names.
-   */
+  /// Look up the member with the given [name] in this type and all extended
+  /// and mixed in classes, and by default including [thisType]. If the search
+  /// fails, this will then search interfaces.
+  ///
+  /// Return the element representing the member that was found, or `null` if
+  /// there is no getter with the given name.
+  ///
+  /// The [library] determines if a private member name is visible, and does not
+  /// need to be supplied for public names.
   PropertyAccessorElement lookUpInheritedGetter(String name,
       {LibraryElement library, bool thisType: true});
 
-  /**
-   * Look up the member with the given [name] in this type and all extended
-   * and mixed in classes, starting from this type. If the search fails,
-   * search interfaces.
-   *
-   * Return the element representing the member that was found, or `null` if
-   * there is no getter with the given name.
-   *
-   * The [library] determines if a private member name is visible, and does not
-   * need to be supplied for public names.
-   */
+  /// Look up the member with the given [name] in this type and all extended
+  /// and mixed in classes, starting from this type. If the search fails,
+  /// search interfaces.
+  ///
+  /// Return the element representing the member that was found, or `null` if
+  /// there is no getter with the given name.
+  ///
+  /// The [library] determines if a private member name is visible, and does not
+  /// need to be supplied for public names.
   ExecutableElement lookUpInheritedGetterOrMethod(String name,
       {LibraryElement library});
 
-  /**
-   * Look up the member with the given [name] in this type and all extended
-   * and mixed in classes, and by default including [thisType]. If the search
-   * fails, this will then search interfaces.
-   *
-   * Return the element representing the member that was found, or `null` if
-   * there is no getter with the given name.
-   *
-   * The [library] determines if a private member name is visible, and does not
-   * need to be supplied for public names.
-   */
+  /// Look up the member with the given [name] in this type and all extended
+  /// and mixed in classes, and by default including [thisType]. If the search
+  /// fails, this will then search interfaces.
+  ///
+  /// Return the element representing the member that was found, or `null` if
+  /// there is no getter with the given name.
+  ///
+  /// The [library] determines if a private member name is visible, and does not
+  /// need to be supplied for public names.
   MethodElement lookUpInheritedMethod(String name,
       {LibraryElement library, bool thisType: true});
 
-  /**
-   * Look up the member with the given [name] in this type and all extended
-   * and mixed in classes, and by default including [thisType]. If the search
-   * fails, this will then search interfaces.
-   *
-   * Return the element representing the member that was found, or `null` if
-   * there is no getter with the given name.
-   *
-   * The [library] determines if a private member name is visible, and does not
-   * need to be supplied for public names.
-   */
+  /// Look up the member with the given [name] in this type and all extended
+  /// and mixed in classes, and by default including [thisType]. If the search
+  /// fails, this will then search interfaces.
+  ///
+  /// Return the element representing the member that was found, or `null` if
+  /// there is no getter with the given name.
+  ///
+  /// The [library] determines if a private member name is visible, and does not
+  /// need to be supplied for public names.
   PropertyAccessorElement lookUpInheritedSetter(String name,
       {LibraryElement library, bool thisType: true});
 
-  /**
-   * Return the element representing the method that results from looking up the
-   * method with the given [name] in this class with respect to the given
-   * [library], or `null` if the look up fails. The behavior of this method is
-   * defined by the Dart Language Specification in section 12.15.1:
-   * <blockquote>
-   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
-   * library <i>L</i> is:
-   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible
-   *   to <i>L</i>, then that method is the result of the lookup. Otherwise, if
-   *   <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the
-   *   result of looking up method <i>m</i> in <i>S</i> with respect to <i>L</i>
-   *   Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   */
+  /// Return the element representing the method that results from looking up
+  /// the method with the given [name] in this class with respect to the given
+  /// [library], or `null` if the look up fails. The behavior of this method is
+  /// defined by the Dart Language Specification in section 12.15.1:
+  /// <blockquote>
+  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
+  /// library <i>L</i> is:
+  /// * If <i>C</i> declares an instance method named <i>m</i> that is
+  ///   accessible to <i>L</i>, then that method is the result of the lookup.
+  ///   Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the
+  ///   lookup is the result of looking up method <i>m</i> in <i>S</i> with
+  ///   respect to <i>L</i> Otherwise, we say that the lookup has failed.
+  /// </blockquote>
   MethodElement lookUpMethod(String name, LibraryElement library);
 
-  /**
-   * Return the element representing the method that results from looking up the
-   * method with the given [name] in the superclass of this class with respect
-   * to the given [library], or `null` if the look up fails. The behavior of
-   * this method is defined by the Dart Language Specification in section
-   * 12.15.1:
-   * <blockquote>
-   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
-   * library <i>L</i> is:
-   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible
-   *   to <i>L</i>, then that method is the result of the lookup. Otherwise, if
-   * <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the
-   * result of looking up method <i>m</i> in <i>S</i> with respect to <i>L</i>.
-   * Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   */
+  /// Return the element representing the method that results from looking up
+  /// the method with the given [name] in the superclass of this class with
+  /// respect to the given [library], or `null` if the look up fails. The
+  /// behavior of this method is defined by the Dart Language Specification in
+  /// section 12.15.1:
+  /// <blockquote>
+  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
+  /// library <i>L</i> is:
+  /// * If <i>C</i> declares an instance method named <i>m</i> that is
+  ///   accessible to <i>L</i>, then that method is the result of the lookup.
+  ///   Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the
+  /// * lookup is the result of looking up method <i>m</i> in <i>S</i> with
+  ///   respect to <i>L</i>.
+  /// * Otherwise, we say that the lookup has failed.
+  /// </blockquote>
   MethodElement lookUpMethodInSuperclass(String name, LibraryElement library);
 
-  /**
-   * Return the element representing the setter that results from looking up the
-   * setter with the given [name] in this class with respect to the given
-   * [library], or `null` if the look up fails. The behavior of this method is
-   * defined by the Dart Language Specification in section 12.16:
-   * <blockquote>
-   * The result of looking up getter (respectively setter) <i>m</i> in class
-   * <i>C</i> with respect to library <i>L</i> is:
-   * * If <i>C</i> declares an instance getter (respectively setter) named
-   *   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
-   *   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
-   *   superclass <i>S</i>, then the result of the lookup is the result of
-   *   looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect
-   *   to <i>L</i>. Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   */
+  /// Return the element representing the setter that results from looking up
+  /// the setter with the given [name] in this class with respect to the given
+  /// [library], or `null` if the look up fails. The behavior of this method is
+  /// defined by the Dart Language Specification in section 12.16:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is:
+  /// * If <i>C</i> declares an instance getter (respectively setter) named
+  ///   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
+  ///   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
+  ///   superclass <i>S</i>, then the result of the lookup is the result of
+  ///   looking up getter (respectively setter) <i>m</i> in <i>S</i> with
+  ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
+  /// </blockquote>
   PropertyAccessorElement lookUpSetter(String name, LibraryElement library);
 
-  /**
-   * Return the element representing the setter that results from looking up the
-   * setter with the given [name] in the superclass of this class with respect
-   * to the given [library], or `null` if the look up fails. The behavior of
-   * this method is defined by the Dart Language Specification in section 12.16:
-   * <blockquote>
-   * The result of looking up getter (respectively setter) <i>m</i> in class
-   * <i>C</i> with respect to library <i>L</i> is:
-   * * If <i>C</i> declares an instance getter (respectively setter) named
-   *   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
-   *   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
-   *   superclass <i>S</i>, then the result of the lookup is the result of
-   *   looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect
-   *   to <i>L</i>. Otherwise, we say that the lookup has failed.
-   * </blockquote>
-   */
+  /// Return the element representing the setter that results from looking up
+  /// the setter with the given [name] in the superclass of this class with
+  /// respect to the given [library], or `null` if the look up fails. The
+  /// behavior of this method is defined by the Dart Language Specification in
+  /// section 12.16:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is:
+  /// * If <i>C</i> declares an instance getter (respectively setter) named
+  ///   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
+  ///   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
+  ///   superclass <i>S</i>, then the result of the lookup is the result of
+  ///   looking up getter (respectively setter) <i>m</i> in <i>S</i> with
+  ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
+  /// </blockquote>
   PropertyAccessorElement lookUpSetterInSuperclass(
       String name, LibraryElement library);
 
@@ -664,84 +552,67 @@
   InterfaceType substitute2(
       List<DartType> argumentTypes, List<DartType> parameterTypes);
 
-  /**
-   * Return the type resulting from substituting the given arguments for this
-   * type's parameters. This is fully equivalent to `substitute2(argumentTypes,
-   * getTypeArguments())`.
-   */
+  /// Return the type resulting from substituting the given arguments for this
+  /// type's parameters. This is fully equivalent to `substitute2(argumentTypes,
+  /// getTypeArguments())`.
   @deprecated // use instantiate
   InterfaceType substitute4(List<DartType> argumentTypes);
 
-  /**
-   * Returns a "smart" version of the "least upper bound" of the given types.
-   *
-   * If these types have the same element and differ only in terms of the type
-   * arguments, attempts to find a compatible set of type arguments.
-   *
-   * Otherwise, returns the same result as [DartType.getLeastUpperBound].
-   */
+  /// Returns a "smart" version of the "least upper bound" of the given types.
+  ///
+  /// If these types have the same element and differ only in terms of the type
+  /// arguments, attempts to find a compatible set of type arguments.
+  ///
+  /// Otherwise, returns the same result as [DartType.getLeastUpperBound].
   // TODO(brianwilkerson) This needs to be deprecated and moved to TypeSystem.
   static InterfaceType getSmartLeastUpperBound(
           InterfaceType first, InterfaceType second) =>
       InterfaceTypeImpl.getSmartLeastUpperBound(first, second);
 }
 
-/**
- * A type that can track substituted type parameters, either for itself after
- * instantiation, or from a surrounding context.
- *
- * For example, given a class `Foo<T>`, after instantiation with S for T, it
- * will track the substitution `{S/T}`.
- *
- * This substitution will be propagated to its members. For example, say our
- * `Foo<T>` class has a field `T bar;`. When we look up this field, we will get
- * back a [FieldElement] that tracks the substituted type as `{S/T}T`, so when
- * we ask for the field type we will get `S`.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A type that can track substituted type parameters, either for itself after
+/// instantiation, or from a surrounding context.
+///
+/// For example, given a class `Foo<T>`, after instantiation with S for T, it
+/// will track the substitution `{S/T}`.
+///
+/// This substitution will be propagated to its members. For example, say our
+/// `Foo<T>` class has a field `T bar;`. When we look up this field, we will get
+/// back a [FieldElement] that tracks the substituted type as `{S/T}T`, so when
+/// we ask for the field type we will get `S`.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ParameterizedType implements DartType {
-  /**
-   * Return a list containing the actual types of the type arguments. If this
-   * type's element does not have type parameters, then the array should be
-   * empty (although it is possible for type arguments to be erroneously
-   * declared). If the element has type parameters and the actual type does not
-   * explicitly include argument values, then the type "dynamic" will be
-   * automatically provided.
-   */
+  /// Return a list containing the actual types of the type arguments. If this
+  /// type's element does not have type parameters, then the array should be
+  /// empty (although it is possible for type arguments to be erroneously
+  /// declared). If the element has type parameters and the actual type does not
+  /// explicitly include argument values, then the type "dynamic" will be
+  /// automatically provided.
   List<DartType> get typeArguments;
 
-  /**
-   * Return a list containing all of the type parameters declared for this type.
-   */
+  /// Return a list containing all of the type parameters declared for this
+  /// type.
   List<TypeParameterElement> get typeParameters;
 
-  /**
-   * Return the type resulting from instantiating (replacing) the given
-   * [argumentTypes] for this type's bound type parameters.
-   */
+  /// Return the type resulting from instantiating (replacing) the given
+  /// [argumentTypes] for this type's bound type parameters.
   ParameterizedType instantiate(List<DartType> argumentTypes);
 }
 
-/**
- * The type introduced by a type parameter.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The type introduced by a type parameter.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class TypeParameterType implements DartType {
-  /**
-   * Return the type representing the bound associated with this parameter,
-   * or `dynamic` if there was no explicit bound.
-   */
+  /// Return the type representing the bound associated with this parameter,
+  /// or `dynamic` if there was no explicit bound.
   DartType get bound;
 
-  /**
-   * An object that can be used to identify this type parameter with `==`.
-   *
-   * Depending on the use, [bound] may also need to be taken into account.
-   * A given type parameter, it may have different bounds in different scopes.
-   * Always consult the bound if that could be relevant.
-   */
+  /// An object that can be used to identify this type parameter with `==`.
+  ///
+  /// Depending on the use, [bound] may also need to be taken into account.
+  /// A given type parameter, it may have different bounds in different scopes.
+  /// Always consult the bound if that could be relevant.
   ElementLocation get definition;
 
   @override
diff --git a/analyzer/lib/dart/element/type_system.dart b/analyzer/lib/dart/element/type_system.dart
index 769a5d9..df6cbe8 100644
--- a/analyzer/lib/dart/element/type_system.dart
+++ b/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/analyzer/lib/dart/element/visitor.dart b/analyzer/lib/dart/element/visitor.dart
index fa3fa79..fc6d4a6 100644
--- a/analyzer/lib/dart/element/visitor.dart
+++ b/analyzer/lib/dart/element/visitor.dart
@@ -2,86 +2,82 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Defines element visitors that support useful patterns for visiting the
- * elements in an [element model](element.dart).
- *
- * Dart is an evolving language, and the element model must evolved with it.
- * When the element model changes, the visitor interface will sometimes change
- * as well. If it is desirable to get a compilation error when the structure of
- * the element model has been modified, then you should consider implementing
- * the interface [ElementVisitor] directly. Doing so will ensure that changes
- * that introduce new classes of elements will be flagged. (Of course, not all
- * changes to the element model require the addition of a new class of element,
- * and hence cannot be caught this way.)
- *
- * But if automatic detection of these kinds of changes is not necessary then
- * you will probably want to extend one of the classes in this library because
- * doing so will simplify the task of writing your visitor and guard against
- * future changes to the element model. For example, the
- * [RecursiveElementVisitor] automates the process of visiting all of the
- * descendants of an element.
- */
+/// Defines element visitors that support useful patterns for visiting the
+/// elements in an [element model](element.dart).
+///
+/// Dart is an evolving language, and the element model must evolved with it.
+/// When the element model changes, the visitor interface will sometimes change
+/// as well. If it is desirable to get a compilation error when the structure of
+/// the element model has been modified, then you should consider implementing
+/// the interface [ElementVisitor] directly. Doing so will ensure that changes
+/// that introduce new classes of elements will be flagged. (Of course, not all
+/// changes to the element model require the addition of a new class of element,
+/// and hence cannot be caught this way.)
+///
+/// But if automatic detection of these kinds of changes is not necessary then
+/// you will probably want to extend one of the classes in this library because
+/// doing so will simplify the task of writing your visitor and guard against
+/// future changes to the element model. For example, the
+/// [RecursiveElementVisitor] automates the process of visiting all of the
+/// descendants of an element.
 import 'package:analyzer/dart/element/element.dart';
 
-/**
- * An element visitor that will recursively visit all of the elements in an
- * element model (like instances of the class [RecursiveElementVisitor]). In
- * addition, when an element of a specific type is visited not only will the
- * visit method for that specific type of element be invoked, but additional
- * methods for the supertypes of that element will also be invoked. For example,
- * using an instance of this class to visit a [MethodElement] will cause the
- * method [visitMethodElement] to be invoked but will also cause the methods
- * [visitExecutableElement] and [visitElement] to be subsequently invoked. This
- * allows visitors to be written that visit all executable elements without
- * needing to override the visit method for each of the specific subclasses of
- * [ExecutableElement].
- *
- * Note, however, that unlike many visitors, element visitors visit objects
- * based on the interfaces implemented by those elements. Because interfaces
- * form a graph structure rather than a tree structure the way classes do, and
- * because it is generally undesirable for an object to be visited more than
- * once, this class flattens the interface graph into a pseudo-tree. In
- * particular, this class treats elements as if the element types were
- * structured in the following way:
- *
- * <pre>
- * Element
- *   ClassElement
- *   CompilationUnitElement
- *   ExecutableElement
- *       ConstructorElement
- *       LocalElement
- *           FunctionElement
- *       MethodElement
- *       PropertyAccessorElement
- *   ExportElement
- *   HtmlElement
- *   ImportElement
- *   LabelElement
- *   LibraryElement
- *   MultiplyDefinedElement
- *   PrefixElement
- *   TypeAliasElement
- *   TypeParameterElement
- *   UndefinedElement
- *   VariableElement
- *       PropertyInducingElement
- *           FieldElement
- *           TopLevelVariableElement
- *       LocalElement
- *           LocalVariableElement
- *           ParameterElement
- *               FieldFormalParameterElement
- * </pre>
- *
- * Subclasses that override a visit method must either invoke the overridden
- * visit method or explicitly invoke the more general visit method. Failure to
- * do so will cause the visit methods for superclasses of the element to not be
- * invoked and will cause the children of the visited node to not be visited.
- *
- * Clients may extend this class.
- */
+/// An element visitor that will recursively visit all of the elements in an
+/// element model (like instances of the class [RecursiveElementVisitor]). In
+/// addition, when an element of a specific type is visited not only will the
+/// visit method for that specific type of element be invoked, but additional
+/// methods for the supertypes of that element will also be invoked. For
+/// example, using an instance of this class to visit a [MethodElement] will
+/// cause the method [visitMethodElement] to be invoked but will also cause the
+/// methods [visitExecutableElement] and [visitElement] to be subsequently
+/// invoked. This allows visitors to be written that visit all executable
+/// elements without needing to override the visit method for each of the
+/// specific subclasses of [ExecutableElement].
+///
+/// Note, however, that unlike many visitors, element visitors visit objects
+/// based on the interfaces implemented by those elements. Because interfaces
+/// form a graph structure rather than a tree structure the way classes do, and
+/// because it is generally undesirable for an object to be visited more than
+/// once, this class flattens the interface graph into a pseudo-tree. In
+/// particular, this class treats elements as if the element types were
+/// structured in the following way:
+///
+/// <pre>
+/// Element
+///   ClassElement
+///   CompilationUnitElement
+///   ExecutableElement
+///       ConstructorElement
+///       LocalElement
+///           FunctionElement
+///       MethodElement
+///       PropertyAccessorElement
+///   ExportElement
+///   HtmlElement
+///   ImportElement
+///   LabelElement
+///   LibraryElement
+///   MultiplyDefinedElement
+///   PrefixElement
+///   TypeAliasElement
+///   TypeParameterElement
+///   UndefinedElement
+///   VariableElement
+///       PropertyInducingElement
+///           FieldElement
+///           TopLevelVariableElement
+///       LocalElement
+///           LocalVariableElement
+///           ParameterElement
+///               FieldFormalParameterElement
+/// </pre>
+///
+/// Subclasses that override a visit method must either invoke the overridden
+/// visit method or explicitly invoke the more general visit method. Failure to
+/// do so will cause the visit methods for superclasses of the element to not be
+/// invoked and will cause the children of the visited node to not be visited.
+///
+/// Clients may extend this class.
 class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
   @override
   R visitClassElement(ClassElement element) => visitElement(element);
@@ -180,19 +176,17 @@
   R visitVariableElement(VariableElement element) => visitElement(element);
 }
 
-/**
- * A visitor that will recursively visit all of the element in an element model.
- * For example, using an instance of this class to visit a
- * [CompilationUnitElement] will also cause all of the types in the compilation
- * unit to be visited.
- *
- * Subclasses that override a visit method must either invoke the overridden
- * visit method or must explicitly ask the visited element to visit its
- * children. Failure to do so will cause the children of the visited element to
- * not be visited.
- *
- * Clients may extend this class.
- */
+/// A visitor that will recursively visit all of the element in an element
+/// model. For example, using an instance of this class to visit a
+/// [CompilationUnitElement] will also cause all of the types in the compilation
+/// unit to be visited.
+///
+/// Subclasses that override a visit method must either invoke the overridden
+/// visit method or must explicitly ask the visited element to visit its
+/// children. Failure to do so will cause the children of the visited element to
+/// not be visited.
+///
+/// Clients may extend this class.
 class RecursiveElementVisitor<R> implements ElementVisitor<R> {
   @override
   R visitClassElement(ClassElement element) {
@@ -315,14 +309,12 @@
   }
 }
 
-/**
- * A visitor that will do nothing when visiting an element. It is intended to be
- * a superclass for classes that use the visitor pattern primarily as a dispatch
- * mechanism (and hence don't need to recursively visit a whole structure) and
- * that only need to visit a small number of element types.
- *
- * Clients may extend this class.
- */
+/// A visitor that will do nothing when visiting an element. It is intended to
+/// be a superclass for classes that use the visitor pattern primarily as a
+/// dispatch mechanism (and hence don't need to recursively visit a whole
+/// structure) and that only need to visit a small number of element types.
+///
+/// Clients may extend this class.
 class SimpleElementVisitor<R> implements ElementVisitor<R> {
   @override
   R visitClassElement(ClassElement element) => null;
@@ -386,15 +378,13 @@
   R visitTypeParameterElement(TypeParameterElement element) => null;
 }
 
-/**
- * An AST visitor that will throw an exception if any of the visit methods that
- * are invoked have not been overridden. It is intended to be a superclass for
- * classes that implement the visitor pattern and need to (a) override all of
- * the visit methods or (b) need to override a subset of the visit method and
- * want to catch when any other visit methods have been invoked.
- *
- * Clients may extend this class.
- */
+/// An AST visitor that will throw an exception if any of the visit methods that
+/// are invoked have not been overridden. It is intended to be a superclass for
+/// classes that implement the visitor pattern and need to (a) override all of
+/// the visit methods or (b) need to override a subset of the visit method and
+/// want to catch when any other visit methods have been invoked.
+///
+/// Clients may extend this class.
 class ThrowingElementVisitor<R> implements ElementVisitor<R> {
   @override
   R visitClassElement(ClassElement element) => _throw(element);
diff --git a/analyzer/lib/diagnostic/diagnostic.dart b/analyzer/lib/diagnostic/diagnostic.dart
new file mode 100644
index 0000000..43b099a
--- /dev/null
+++ b/analyzer/lib/diagnostic/diagnostic.dart
@@ -0,0 +1,49 @@
+// 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.
+
+/// A diagnostic, as defined by the [Diagnostic Design Guidelines][guidelines]:
+///
+/// > An indication of a specific problem at a specific location within the
+/// > source code being processed by a development tool.
+///
+/// Clients may not extend, implement or mix-in this class.
+///
+/// [guidelines]: ../doc/diagnostics.md
+abstract class Diagnostic {
+  /// A list of messages that provide context for understanding the problem
+  /// being reported. The list will be empty if there are no such messages.
+  List<DiagnosticMessage> get contextMessages;
+
+  /// A description of how to fix the problem, or `null` if there is no such
+  /// description.
+  String get correctionMessage;
+
+  /// A message describing what is wrong and why.
+  DiagnosticMessage get problemMessage;
+
+  /// The severity associated with the diagnostic.
+  Severity get severity;
+}
+
+/// A single message associated with a [Diagnostic], consisting of the text of
+/// the message and the location associated with it.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class DiagnosticMessage {
+  /// The absolute and normalized path of the file associated with this message.
+  String get filePath;
+
+  /// The length of the source range associated with this message.
+  int get length;
+
+  /// The text of the message.
+  String get message;
+
+  /// The zero-based offset from the start of the file to the beginning of the
+  /// source range associated with this message.
+  int get offset;
+}
+
+/// An indication of the severity of a [Diagnostic].
+enum Severity { error, warning, info }
diff --git a/analyzer/lib/error/error.dart b/analyzer/lib/error/error.dart
index 459a7c0..59e0168 100644
--- a/analyzer/lib/error/error.dart
+++ b/analyzer/lib/error/error.dart
@@ -4,13 +4,16 @@
 
 import 'dart:collection';
 
+import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart' show ScannerErrorCode;
+import 'package:analyzer/src/diagnostic/diagnostic.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:analyzer/src/generated/resolver.dart' show ResolverErrorCode;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/manifest/manifest_warning_code.dart';
 import 'package:front_end/src/base/errors.dart';
 import 'package:front_end/src/scanner/errors.dart';
 
@@ -59,10 +62,6 @@
   CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
   CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
   CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
-  CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
-  CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
-  CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
-  CheckedModeCompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE,
   CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
   CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
   CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD,
@@ -71,7 +70,6 @@
   CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_EITHER,
   CompileTimeErrorCode.ANNOTATION_WITH_NON_CLASS,
   CompileTimeErrorCode.ANNOTATION_WITH_TYPE_ARGUMENTS,
-  CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_NON_PARAMETER,
   CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT,
   CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT,
   CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_PREFIX_NAME,
@@ -79,7 +77,6 @@
   CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME,
   CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME,
   CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME,
-  CompileTimeErrorCode.BUILT_IN_IDENTIFIER_IN_DECLARATION,
   CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
   CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD,
   CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD,
@@ -89,7 +86,6 @@
   CompileTimeErrorCode.CONFLICTING_STATIC_AND_INSTANCE,
   CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS,
   CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
-  CompileTimeErrorCode.CONST_CONSTRUCTOR_IN_SUBCLASS_OF_MIXIN_APPLICATION,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
   CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
@@ -121,14 +117,18 @@
   CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
   CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR,
   CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
+  CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH,
   CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER,
   CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS,
   CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
+  CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER,
   CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT,
   CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME,
   CompileTimeErrorCode.DUPLICATE_DEFINITION,
   CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT,
   CompileTimeErrorCode.DUPLICATE_PART,
+  CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP,
+  CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET,
   CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY,
   CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
   CompileTimeErrorCode.EXPRESSION_IN_MAP,
@@ -173,10 +173,10 @@
   CompileTimeErrorCode.INVALID_CONSTANT,
   CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME,
   CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS,
-  CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC,
   CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR,
   CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER,
   CompileTimeErrorCode.INVALID_INLINE_FUNCTION_TYPE,
+  CompileTimeErrorCode.INVALID_OPTIONAL_PARAMETER_TYPE,
   CompileTimeErrorCode.INVALID_OVERRIDE,
   CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
@@ -192,6 +192,8 @@
   CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL,
   CompileTimeErrorCode.MISSING_CONST_IN_SET_LITERAL,
   CompileTimeErrorCode.MISSING_DART_LIBRARY,
+  CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER,
+  CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT,
   CompileTimeErrorCode.MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE,
   CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
   CompileTimeErrorCode.MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
@@ -226,15 +228,25 @@
   CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT,
   CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY,
+  CompileTimeErrorCode.NON_CONSTANT_SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY,
+  CompileTimeErrorCode.NON_CONSTANT_IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY,
+  // ignore: deprecated_member_use_from_same_package
   CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER,
-  CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
   CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
   CompileTimeErrorCode.NON_SYNC_FACTORY,
   CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS,
+  CompileTimeErrorCode.NOT_ITERABLE_SPREAD,
+  CompileTimeErrorCode.NOT_MAP_SPREAD,
+  CompileTimeErrorCode.NOT_NULL_AWARE_NULL_SPREAD,
   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 +308,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,
@@ -331,6 +345,14 @@
   HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER,
   HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT,
   HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE,
+  HintCode.SDK_VERSION_AS_EXPRESSION_IN_CONST_CONTEXT,
+  HintCode.SDK_VERSION_BOOL_OPERATOR,
+  HintCode.SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT,
+  HintCode.SDK_VERSION_GT_GT_GT_OPERATOR,
+  HintCode.SDK_VERSION_IS_EXPRESSION_IN_CONST_CONTEXT,
+  HintCode.SDK_VERSION_NEVER,
+  HintCode.SDK_VERSION_SET_LITERAL,
+  HintCode.SDK_VERSION_UI_AS_CODE,
   HintCode.STRICT_RAW_TYPE,
   HintCode.SUBTYPE_OF_SEALED_CLASS,
   HintCode.TYPE_CHECK_IS_NOT_NULL,
@@ -350,9 +372,13 @@
   HintCode.UNUSED_LABEL,
   HintCode.UNUSED_LOCAL_VARIABLE,
   HintCode.UNUSED_SHOWN_NAME,
-  HtmlErrorCode.PARSE_ERROR,
-  HtmlWarningCode.INVALID_URI,
-  HtmlWarningCode.URI_DOES_NOT_EXIST,
+  ManifestWarningCode.CAMERA_PERMISSIONS_INCOMPATIBLE,
+  ManifestWarningCode.NON_RESIZABLE_ACTIVITY,
+  ManifestWarningCode.NO_TOUCHSCREEN_FEATURE,
+  ManifestWarningCode.PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE,
+  ManifestWarningCode.SETTING_ORIENTATION_ON_ACTIVITY,
+  ManifestWarningCode.UNSUPPORTED_CHROME_OS_FEATURE,
+  ManifestWarningCode.UNSUPPORTED_CHROME_OS_HARDWARE,
   ParserErrorCode.ABSTRACT_CLASS_MEMBER,
   ParserErrorCode.ABSTRACT_ENUM,
   ParserErrorCode.ABSTRACT_STATIC_METHOD,
@@ -365,6 +391,7 @@
   ParserErrorCode.CATCH_SYNTAX_EXTRA_PARAMETERS,
   ParserErrorCode.CLASS_IN_CLASS,
   ParserErrorCode.COLON_IN_PLACE_OF_IN,
+  ParserErrorCode.CONFLICTING_MODIFIERS,
   ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE,
   ParserErrorCode.CONST_AFTER_FACTORY,
   ParserErrorCode.CONST_AND_COVARIANT,
@@ -483,6 +510,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,
@@ -519,11 +547,14 @@
   ParserErrorCode.STATIC_OPERATOR,
   ParserErrorCode.STATIC_SETTER_WITHOUT_BODY,
   ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION,
+  ParserErrorCode.INVALID_SUPER_IN_INITIALIZER,
   ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE,
   ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES,
+  ParserErrorCode.INVALID_THIS_IN_INITIALIZER,
   ParserErrorCode.TOP_LEVEL_OPERATOR,
   ParserErrorCode.TYPEDEF_IN_CLASS,
   ParserErrorCode.TYPE_ARGUMENTS_ON_TYPE_VARIABLE,
+  ParserErrorCode.TYPE_BEFORE_FACTORY,
   ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP,
   ParserErrorCode.UNEXPECTED_TOKEN,
   ParserErrorCode.VAR_AND_TYPE,
@@ -537,7 +568,6 @@
   ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP,
   ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER,
   ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH,
-  ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART,
   ResolverErrorCode.PART_OF_UNNAMED_LIBRARY,
   ScannerErrorCode.EXPECTED_TOKEN,
   ScannerErrorCode.ILLEGAL_CHARACTER,
@@ -600,8 +630,6 @@
   StaticWarningCode.CAST_TO_NON_TYPE,
   StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
   StaticWarningCode.CONST_WITH_ABSTRACT_CLASS,
-  StaticWarningCode.EQUAL_KEYS_IN_MAP,
-  StaticWarningCode.EQUAL_VALUES_IN_CONST_SET,
   StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAMED,
   StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS,
   StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED,
@@ -613,15 +641,10 @@
   StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1,
   StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2,
   StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS,
-  StaticWarningCode.FUNCTION_WITHOUT_CALL,
   StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED,
   StaticWarningCode.IMPORT_OF_NON_LIBRARY,
   StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED,
   StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
-  StaticWarningCode.INVALID_OVERRIDE_NAMED,
-  StaticWarningCode.INVALID_OVERRIDE_POSITIONAL,
-  StaticWarningCode.INVALID_OVERRIDE_REQUIRED,
-  StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE,
   StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
   StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
   StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
@@ -692,10 +715,8 @@
   StrongModeCode.INVALID_CAST_NEW_EXPR,
   StrongModeCode.INVALID_CAST_METHOD,
   StrongModeCode.INVALID_CAST_FUNCTION,
-  StrongModeCode.INVALID_FIELD_OVERRIDE,
   StrongModeCode.INVALID_PARAMETER_DECLARATION,
   StrongModeCode.INVALID_SUPER_INVOCATION,
-  StrongModeCode.NO_DEFAULT_BOUNDS,
   StrongModeCode.NON_GROUND_TYPE_CHECK_INFO,
   StrongModeCode.NOT_INSTANTIATED_BOUND,
   StrongModeCode.TOP_LEVEL_CYCLE,
@@ -703,7 +724,6 @@
   StrongModeCode.TOP_LEVEL_IDENTIFIER_NO_TYPE,
   StrongModeCode.TOP_LEVEL_INSTANCE_GETTER,
   StrongModeCode.TOP_LEVEL_INSTANCE_METHOD,
-  StrongModeCode.TOP_LEVEL_UNSUPPORTED,
   TodoCode.TODO,
 ];
 
@@ -732,7 +752,7 @@
  *
  * See [AnalysisErrorListener].
  */
-class AnalysisError {
+class AnalysisError implements Diagnostic {
   /**
    * An empty array of errors used when no errors are expected.
    */
@@ -770,10 +790,9 @@
    */
   final ErrorCode errorCode;
 
-  /**
-   * The localized error message.
-   */
-  String _message;
+  DiagnosticMessage _problemMessage;
+
+  List<DiagnosticMessage> _contextMessages;
 
   /**
    * The correction to be displayed for this error, or `null` if there is no
@@ -787,43 +806,40 @@
   final Source source;
 
   /**
-   * The character offset from the beginning of the source (zero based) where
-   * the error occurred.
-   */
-  int offset = 0;
-
-  /**
-   * The number of characters from the offset to the end of the source which
-   * encompasses the compilation error.
-   */
-  int length = 0;
-
-  /**
-   * A flag indicating whether this error can be shown to be a non-issue because
-   * of the result of type propagation.
-   */
-  bool isStaticOnly = false;
-
-  /**
    * Initialize a newly created analysis error. The error is associated with the
    * given [source] and is located at the given [offset] with the given
    * [length]. The error will have the given [errorCode] and the list of
-   * [arguments] will be used to complete the message.
+   * [arguments] will be used to complete the message and correction. If any
+   * [contextMessages] are provided, they will be recorded with the error.
    */
-  AnalysisError(this.source, this.offset, this.length, this.errorCode,
-      [List<Object> arguments]) {
-    this._message = formatList(errorCode.message, arguments);
+  AnalysisError(this.source, int offset, int length, this.errorCode,
+      [List<Object> arguments, List<DiagnosticMessage> contextMessages]) {
+    String message = formatList(errorCode.message, arguments);
     String correctionTemplate = errorCode.correction;
     if (correctionTemplate != null) {
       this._correction = formatList(correctionTemplate, arguments);
     }
+    _problemMessage = new DiagnosticMessageImpl(
+        filePath: source?.fullName,
+        length: length,
+        message: message,
+        offset: offset);
+    _contextMessages = contextMessages;
   }
 
   /**
    * Initialize a newly created analysis error with given values.
    */
-  AnalysisError.forValues(this.source, this.offset, this.length, this.errorCode,
-      this._message, this._correction);
+  AnalysisError.forValues(this.source, int offset, int length, this.errorCode,
+      String message, this._correction) {
+    _problemMessage = new DiagnosticMessageImpl(
+        filePath: source?.fullName,
+        length: length,
+        message: message,
+        offset: offset);
+  }
+
+  List<DiagnosticMessage> get contextMessages => _contextMessages ?? const [];
 
   /**
    * Return the template used to create the correction to be displayed for this
@@ -833,18 +849,70 @@
   String get correction => _correction;
 
   @override
+  String get correctionMessage => _correction;
+
+  @override
   int get hashCode {
     int hashCode = offset;
-    hashCode ^= (_message != null) ? _message.hashCode : 0;
+    hashCode ^= (message != null) ? message.hashCode : 0;
     hashCode ^= (source != null) ? source.hashCode : 0;
     return hashCode;
   }
 
   /**
+   * Return `true` if this error can be shown to be a non-issue because of the
+   * result of type propagation.
+   */
+  @Deprecated(
+      'Type propagation is no longer performed, so this will never be true')
+  bool get isStaticOnly => false;
+
+  @Deprecated(
+      'Type propagation is no longer performed, so this can never be true')
+  void set isStaticOnly(bool value) {}
+
+  /**
+   * The number of characters from the offset to the end of the source which
+   * encompasses the compilation error.
+   */
+  int get length => _problemMessage.length;
+
+  /**
    * Return the message to be displayed for this error. The message should
    * indicate what is wrong and why it is wrong.
    */
-  String get message => _message;
+  String get message => _problemMessage.message;
+
+  /**
+   * The character offset from the beginning of the source (zero based) where
+   * the error occurred.
+   */
+  int get offset => _problemMessage.offset;
+
+  /**
+   * The character offset from the beginning of the source (zero based) where
+   * the error occurred.
+   */
+  @Deprecated('Set the offset when the error is created')
+  set offset(int offset) {}
+
+  @override
+  DiagnosticMessage get problemMessage => _problemMessage;
+
+  @override
+  Severity get severity {
+    switch (errorCode.errorSeverity) {
+      case ErrorSeverity.ERROR:
+        return Severity.error;
+      case ErrorSeverity.WARNING:
+        return Severity.warning;
+      case ErrorSeverity.INFO:
+        return Severity.info;
+      default:
+        throw new StateError(
+            'Invalid error severity: ${errorCode.errorSeverity}');
+    }
+  }
 
   @override
   bool operator ==(Object other) {
@@ -860,11 +928,8 @@
       if (offset != other.offset || length != other.length) {
         return false;
       }
-      if (isStaticOnly != other.isStaticOnly) {
-        return false;
-      }
       // Deep checks.
-      if (_message != other._message) {
+      if (message != other.message) {
         return false;
       }
       if (source != other.source) {
@@ -886,7 +951,7 @@
     buffer.write(offset + length - 1);
     buffer.write("): ");
     //buffer.write("(" + lineNumber + ":" + columnNumber + "): ");
-    buffer.write(_message);
+    buffer.write(message);
     return buffer.toString();
   }
 
diff --git a/analyzer/lib/error/listener.dart b/analyzer/lib/error/listener.dart
index 5f7e149..9cceca8 100644
--- a/analyzer/lib/error/listener.dart
+++ b/analyzer/lib/error/listener.dart
@@ -235,23 +235,28 @@
           }
         }
         for (_TypeToConvert typeToConvert in typeGroup) {
-          Element element = typeToConvert.type.element;
-          if (element == null) {
-            arguments[typeToConvert.index] = typeToConvert.displayName;
-          } else {
-            // TODO(brianwilkerson) When analyzer supports info or context
-            //  messages, expose the additional information that way (rather
-            //  than being poorly inserted into the problem message).
-            StringBuffer buffer = new StringBuffer();
-            for (Element element in typeToConvert.allElements()) {
-              String name = element.name;
-              if (nameToElementMap[name].length > 1) {
-                buffer.write(buffer.isEmpty ? 'where ' : ', ');
-                buffer.write('$name is defined in ${element.source.fullName}');
+          // TODO(brianwilkerson) When analyzer supports info or context
+          //  messages, expose the additional information that way (rather
+          //  than being poorly inserted into the problem message).
+          StringBuffer buffer;
+          for (Element element in typeToConvert.allElements()) {
+            String name = element.name;
+            if (nameToElementMap[name].length > 1) {
+              if (buffer == null) {
+                buffer = new StringBuffer();
+                buffer.write('where ');
+              } else {
+                buffer.write(', ');
               }
+              buffer.write('$name is defined in ${element.source.fullName}');
             }
+          }
+
+          if (buffer != null) {
             arguments[typeToConvert.index] =
                 '${typeToConvert.displayName} ($buffer)';
+          } else {
+            arguments[typeToConvert.index] = typeToConvert.displayName;
           }
         }
       }
@@ -321,20 +326,16 @@
       Set<Element> elements = new Set<Element>();
 
       void addElementsFrom(DartType type) {
-        Element element = type?.element;
-        if (element != null) {
-          if (type is InterfaceType && elements.add(element)) {
+        if (type is FunctionType) {
+          addElementsFrom(type.returnType);
+          for (ParameterElement parameter in type.parameters) {
+            addElementsFrom(parameter.type);
+          }
+        } else if (type is InterfaceType) {
+          if (elements.add(type.element)) {
             for (DartType typeArgument in type.typeArguments) {
               addElementsFrom(typeArgument);
             }
-          } else if (type is FunctionType && elements.add(element)) {
-            addElementsFrom(type.returnType);
-            for (DartType typeArgument in type.typeArguments) {
-              addElementsFrom(typeArgument);
-            }
-            for (ParameterElement parameter in type.parameters) {
-              addElementsFrom(parameter.type);
-            }
           }
         }
       }
diff --git a/analyzer/lib/instrumentation/instrumentation.dart b/analyzer/lib/instrumentation/instrumentation.dart
index dc04bf5..e593f13 100644
--- a/analyzer/lib/instrumentation/instrumentation.dart
+++ b/analyzer/lib/instrumentation/instrumentation.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/plugin/embedded_resolver_provider.dart b/analyzer/lib/plugin/embedded_resolver_provider.dart
index 217ab7f..e16bc00 100644
--- a/analyzer/lib/plugin/embedded_resolver_provider.dart
+++ b/analyzer/lib/plugin/embedded_resolver_provider.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/plugin/resolver_provider.dart b/analyzer/lib/plugin/resolver_provider.dart
index 3c22554..40567da 100644
--- a/analyzer/lib/plugin/resolver_provider.dart
+++ b/analyzer/lib/plugin/resolver_provider.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/source/analysis_options_provider.dart b/analyzer/lib/source/analysis_options_provider.dart
index 939f634..a35bfbc 100644
--- a/analyzer/lib/source/analysis_options_provider.dart
+++ b/analyzer/lib/source/analysis_options_provider.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/source/custom_resolver.dart b/analyzer/lib/source/custom_resolver.dart
index 8dfe9f9..2569313 100644
--- a/analyzer/lib/source/custom_resolver.dart
+++ b/analyzer/lib/source/custom_resolver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/source/embedder.dart b/analyzer/lib/source/embedder.dart
index dfd679f..a1af355 100644
--- a/analyzer/lib/source/embedder.dart
+++ b/analyzer/lib/source/embedder.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/source/error_processor.dart b/analyzer/lib/source/error_processor.dart
index 3391264..f2efaba 100644
--- a/analyzer/lib/source/error_processor.dart
+++ b/analyzer/lib/source/error_processor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/source/line_info.dart b/analyzer/lib/source/line_info.dart
index 5d5be56..5413ae4 100644
--- a/analyzer/lib/source/line_info.dart
+++ b/analyzer/lib/source/line_info.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/source/package_map_provider.dart b/analyzer/lib/source/package_map_provider.dart
index f3c2119..2c33ab5 100644
--- a/analyzer/lib/source/package_map_provider.dart
+++ b/analyzer/lib/source/package_map_provider.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/source/package_map_resolver.dart b/analyzer/lib/source/package_map_resolver.dart
index 6a1d230..cf65834 100644
--- a/analyzer/lib/source/package_map_resolver.dart
+++ b/analyzer/lib/source/package_map_resolver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/source/path_filter.dart b/analyzer/lib/source/path_filter.dart
index ba5454e..26ecec2 100644
--- a/analyzer/lib/source/path_filter.dart
+++ b/analyzer/lib/source/path_filter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/source/sdk_ext.dart b/analyzer/lib/source/sdk_ext.dart
index 7f5557b..425553e 100644
--- a/analyzer/lib/source/sdk_ext.dart
+++ b/analyzer/lib/source/sdk_ext.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/source/source_range.dart b/analyzer/lib/source/source_range.dart
index 338ad7a..b2d3069 100644
--- a/analyzer/lib/source/source_range.dart
+++ b/analyzer/lib/source/source_range.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/analysis_options/analysis_options_provider.dart b/analyzer/lib/src/analysis_options/analysis_options_provider.dart
index 550f3e3..5d3e616 100644
--- a/analyzer/lib/src/analysis_options/analysis_options_provider.dart
+++ b/analyzer/lib/src/analysis_options/analysis_options_provider.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/context/cache.dart b/analyzer/lib/src/context/cache.dart
index a1834e2..65349a0 100644
--- a/analyzer/lib/src/context/cache.dart
+++ b/analyzer/lib/src/context/cache.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/context/context.dart b/analyzer/lib/src/context/context.dart
index 10a548d..418bb41 100644
--- a/analyzer/lib/src/context/context.dart
+++ b/analyzer/lib/src/context/context.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -17,7 +17,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/task/api/model.dart';
-import 'package:analyzer/src/task/dart_work_manager.dart';
 import 'package:analyzer/src/task/driver.dart';
 
 /**
@@ -60,11 +59,6 @@
   final List<WorkManager> workManagers = <WorkManager>[];
 
   /**
-   * The [DartWorkManager] instance that performs Dart specific scheduling.
-   */
-  DartWorkManager dartWorkManager;
-
-  /**
    * The analysis driver used to perform analysis.
    */
   AnalysisDriver driver;
@@ -88,9 +82,6 @@
    */
   bool useSdkCachePartition = true;
 
-  @override
-  ResultProvider resultProvider;
-
   /**
    * The most recently incrementally resolved source, or `null` when it was
    * already validated, or the most recent change was not incrementally resolved.
@@ -599,24 +590,6 @@
 }
 
 /**
- * Provider for analysis results.
- */
-abstract class ResultProvider {
-  /**
-   * This method is invoked by an [InternalAnalysisContext] when the state of
-   * the [result] of the [entry] is [CacheState.INVALID], so it is about to be
-   * computed.
-   *
-   * If the provider knows how to provide the value, it sets the value into
-   * the [entry] with all required dependencies, and returns `true`.
-   *
-   * Otherwise, it returns `false` to indicate that the result should be
-   * computed as usually.
-   */
-  bool compute(CacheEntry entry, ResultDescriptor result);
-}
-
-/**
  * An [AnalysisContext] that only contains sources for a Dart SDK.
  */
 class SdkAnalysisContext extends AnalysisContextImpl {
diff --git a/analyzer/lib/src/context/context_root.dart b/analyzer/lib/src/context/context_root.dart
index 744f298..a7da43e 100644
--- a/analyzer/lib/src/context/context_root.dart
+++ b/analyzer/lib/src/context/context_root.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/context/source.dart b/analyzer/lib/src/context/source.dart
index 70abd3d..71abce1 100644
--- a/analyzer/lib/src/context/source.dart
+++ b/analyzer/lib/src/context/source.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/dart/analysis/byte_store.dart b/analyzer/lib/src/dart/analysis/byte_store.dart
index 80f7b32..6e7c301 100644
--- a/analyzer/lib/src/dart/analysis/byte_store.dart
+++ b/analyzer/lib/src/dart/analysis/byte_store.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/dart/analysis/cache.dart b/analyzer/lib/src/dart/analysis/cache.dart
index 47a32a3..58a7253 100644
--- a/analyzer/lib/src/dart/analysis/cache.dart
+++ b/analyzer/lib/src/dart/analysis/cache.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/dart/analysis/crc32.dart b/analyzer/lib/src/dart/analysis/crc32.dart
index 457712e..e571bfc 100644
--- a/analyzer/lib/src/dart/analysis/crc32.dart
+++ b/analyzer/lib/src/dart/analysis/crc32.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/dart/analysis/defined_names.dart b/analyzer/lib/src/dart/analysis/defined_names.dart
index 44baa00..4da5300 100644
--- a/analyzer/lib/src/dart/analysis/defined_names.dart
+++ b/analyzer/lib/src/dart/analysis/defined_names.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/dart/analysis/dependency/library_builder.dart b/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
index 4740d58..9b9a320 100644
--- a/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
+++ b/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -678,11 +678,13 @@
     if (parameters == null) return;
 
     for (var parameter in parameters.parameters) {
-      if (parameter.isRequired) {
+      if (parameter.isRequiredPositional) {
         signature.addInt(1);
+      } else if (parameter.isRequiredNamed) {
+        signature.addInt(4);
       } else if (parameter.isOptionalPositional) {
         signature.addInt(2);
-      } else {
+      } else if (parameter.isOptionalNamed) {
         signature.addInt(3);
       }
 
diff --git a/analyzer/lib/src/dart/analysis/dependency/node.dart b/analyzer/lib/src/dart/analysis/dependency/node.dart
index ef5022d..10baa3c 100644
--- a/analyzer/lib/src/dart/analysis/dependency/node.dart
+++ b/analyzer/lib/src/dart/analysis/dependency/node.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart b/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
index 482dc4b..01b5ac3 100644
--- a/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
+++ b/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -464,7 +464,7 @@
     }
   }
 
-  void _visitForStatement2(ForStatement2 node) {
+  void _visitForStatement(ForStatement node) {
     _localScopes.enter();
 
     _visitForLoopParts(node.forLoopParts);
@@ -535,7 +535,7 @@
 
   void _visitListLiteral(ListLiteral node) {
     _visitTypeArguments(node.typeArguments);
-    var elements = node.elements2;
+    var elements = node.elements;
     for (var i = 0; i < elements.length; i++) {
       var element = elements[i];
       _visitCollectionElement(element);
@@ -619,7 +619,7 @@
 
   void _visitSetOrMapLiteral(SetOrMapLiteral node) {
     _visitTypeArguments(node.typeArguments);
-    var elements = node.elements2;
+    var elements = node.elements;
     for (var i = 0; i < elements.length; i++) {
       var element = elements[i];
       _visitCollectionElement(element);
@@ -631,7 +631,10 @@
     if (node.isSynthetic) return;
 
     var name = node.name;
-    if (_localScopes.contains(name) || name == 'void' || name == 'dynamic') {
+    if (_localScopes.contains(name) ||
+        name == 'void' ||
+        name == 'dynamic' ||
+        name == 'Never') {
       return;
     }
 
@@ -662,8 +665,8 @@
       // nothing
     } else if (node is ExpressionStatement) {
       _visitExpression(node.expression);
-    } else if (node is ForStatement2) {
-      _visitForStatement2(node);
+    } else if (node is ForStatement) {
+      _visitForStatement(node);
     } else if (node is FunctionDeclarationStatement) {
       _visitFunctionDeclarationStatement(node);
     } else if (node is IfStatement) {
diff --git a/analyzer/lib/src/dart/analysis/driver.dart b/analyzer/lib/src/dart/analysis/driver.dart
index 3081077..2098c3f 100644
--- a/analyzer/lib/src/dart/analysis/driver.dart
+++ b/analyzer/lib/src/dart/analysis/driver.dart
@@ -94,7 +94,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 78;
+  static const int DATA_VERSION = 80;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
@@ -103,6 +103,11 @@
   static int allowedNumberOfContextsToWrite = 10;
 
   /**
+   * Whether summary2 should be used to resynthesize elements.
+   */
+  static final bool useSummary2 = false;
+
+  /**
    * The scheduler that schedules analysis work in this, and possibly other
    * analysis drivers.
    */
@@ -740,12 +745,18 @@
    * [uri], which is either resynthesized from the provided external summary
    * store, or built for a file to which the given [uri] is resolved.
    *
+   * Throw [ArgumentError] if the [uri] does not correspond to a file.
+   *
    * Throw [ArgumentError] if the [uri] corresponds to a part.
    */
   Future<LibraryElement> getLibraryByUri(String uri) async {
     var uriObj = Uri.parse(uri);
     var file = _fsState.getFileForUri(uriObj);
 
+    if (file.isUnresolved) {
+      throw ArgumentError('$uri cannot be resolved to a file.');
+    }
+
     if (file.isExternalLibrary) {
       return _createLibraryContext(file).getLibraryElement(file);
     }
@@ -1432,6 +1443,7 @@
             libraryContext.isLibraryUri,
             libraryContext.analysisContext,
             libraryContext.resynthesizer,
+            libraryContext.elementFactory,
             libraryContext.inheritanceManager,
             library,
             _resourceProvider);
@@ -1500,6 +1512,7 @@
           libraryContext.isLibraryUri,
           libraryContext.analysisContext,
           libraryContext.resynthesizer,
+          libraryContext.elementFactory,
           libraryContext.inheritanceManager,
           library,
           _resourceProvider);
@@ -1594,6 +1607,7 @@
       _unlinkedSalt,
       _linkedSalt,
       externalSummaries: _externalSummaries,
+      useSummary2: useSummary2,
     );
     _fileTracker = new FileTracker(_logger, _fsState, _changeHook);
   }
@@ -1608,7 +1622,7 @@
       }
     }
 
-    if (_libraryContext == null) {
+    if (_libraryContext == null || useSummary2) {
       _libraryContext = new LibraryContext(
         session: currentSession,
         logger: _logger,
@@ -1619,6 +1633,7 @@
         sourceFactory: _sourceFactory,
         externalSummaries: _externalSummaries,
         targetLibrary: library,
+        useSummary2: useSummary2,
       );
     } else {
       _libraryContext.load(library);
diff --git a/analyzer/lib/src/dart/analysis/experiments.dart b/analyzer/lib/src/dart/analysis/experiments.dart
index 5bf37c7..2cfdf21 100644
--- a/analyzer/lib/src/dart/analysis/experiments.dart
+++ b/analyzer/lib/src/dart/analysis/experiments.dart
@@ -2,21 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// Note: the plan is to generate this file from a YAML representation somewhere
-// in the SDK repo.  Please do not add any code to this file that can't be
-// easily code generated based on a knowledge of the current set of experimental
-// flags and their status.
-// TODO(paulberry,kmillikin): once code generation is implemented, replace this
-// notice with a notice that this file is generated and a pointer to the source
-// YAML file and the regeneration tool.
-
-// Note: to demonstrate how code is supposed to be generated for expired flags,
-// this file contains bogus expired flags called "bogus-enabled" and
-// "bogus-disabled".  They are not used and can be removed at the time that code
-// generation is implemented.
-
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/src/dart/analysis/experiments_impl.dart';
+import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:meta/meta.dart';
+import 'package:pub_semver/src/version.dart';
 
 export 'package:analyzer/src/dart/analysis/experiments_impl.dart'
     show
@@ -52,6 +42,9 @@
   /// String to enable the experiment "spread-collections"
   static const String spread_collections = 'spread-collections';
 
+  /// String to enable the experiment "triple-shift"
+  static const String triple_shift = 'triple-shift';
+
   /// String to enable the experiment "bogus-disabled"
   static const String bogus_disabled = 'bogus-disabled';
 
@@ -59,53 +52,83 @@
   static const String bogus_enabled = 'bogus-enabled';
 }
 
+class ExperimentalFeatures {
+  static const constant_update_2018 = const ExperimentalFeature(
+      0,
+      EnableString.constant_update_2018,
+      IsEnabledByDefault.constant_update_2018,
+      IsExpired.constant_update_2018,
+      'Q4 2018 Constant Update');
+
+  static const non_nullable = const ExperimentalFeature(
+      1,
+      EnableString.non_nullable,
+      IsEnabledByDefault.non_nullable,
+      IsExpired.non_nullable,
+      'Non Nullable');
+
+  static const control_flow_collections = const ExperimentalFeature(
+      2,
+      EnableString.control_flow_collections,
+      IsEnabledByDefault.control_flow_collections,
+      IsExpired.control_flow_collections,
+      'Control Flow Collections',
+      firstSupportedVersion: '2.2.2');
+
+  static const spread_collections = const ExperimentalFeature(
+      3,
+      EnableString.spread_collections,
+      IsEnabledByDefault.spread_collections,
+      IsExpired.spread_collections,
+      'Spread Collections',
+      firstSupportedVersion: '2.2.2');
+
+  static const set_literals = const ExperimentalFeature(
+      4,
+      EnableString.set_literals,
+      IsEnabledByDefault.set_literals,
+      IsExpired.set_literals,
+      'Set Literals',
+      firstSupportedVersion: '2.2.0');
+
+  static const triple_shift = const ExperimentalFeature(
+      5,
+      EnableString.triple_shift,
+      IsEnabledByDefault.triple_shift,
+      IsExpired.triple_shift,
+      'Triple-shift operator');
+
+  static const bogus_disabled = const ExperimentalFeature(
+      6,
+      EnableString.bogus_disabled,
+      IsEnabledByDefault.bogus_disabled,
+      IsExpired.bogus_disabled,
+      null);
+
+  static const bogus_enabled = const ExperimentalFeature(
+      7,
+      EnableString.bogus_enabled,
+      IsEnabledByDefault.bogus_enabled,
+      IsExpired.bogus_enabled,
+      null,
+      firstSupportedVersion: '1.0.0');
+}
+
 /// A representation of the set of experiments that are active and whether they
 /// are enabled.
-class ExperimentStatus {
+class ExperimentStatus implements FeatureSet {
   /// A map containing information about all known experimental flags.
   static const knownFeatures = <String, ExperimentalFeature>{
-    EnableString.constant_update_2018: const ExperimentalFeature(
-        0,
-        EnableString.constant_update_2018,
-        IsEnabledByDefault.constant_update_2018,
-        IsExpired.constant_update_2018,
-        'Q4 2018 Constant Update'),
-    EnableString.non_nullable: const ExperimentalFeature(
-        1,
-        EnableString.non_nullable,
-        IsEnabledByDefault.non_nullable,
-        IsExpired.non_nullable,
-        'Non Nullable'),
-    EnableString.control_flow_collections: const ExperimentalFeature(
-        2,
-        EnableString.control_flow_collections,
-        IsEnabledByDefault.control_flow_collections,
-        IsExpired.control_flow_collections,
-        'Control Flow Collections'),
-    EnableString.spread_collections: const ExperimentalFeature(
-        3,
-        EnableString.spread_collections,
-        IsEnabledByDefault.spread_collections,
-        IsExpired.spread_collections,
-        'Spread Collections'),
-    EnableString.set_literals: const ExperimentalFeature(
-        null,
-        EnableString.set_literals,
-        IsEnabledByDefault.set_literals,
-        IsExpired.set_literals,
-        'Set Literals'),
-    EnableString.bogus_disabled: const ExperimentalFeature(
-        null,
-        EnableString.bogus_disabled,
-        IsEnabledByDefault.bogus_disabled,
-        IsExpired.bogus_disabled,
-        null),
-    EnableString.bogus_enabled: const ExperimentalFeature(
-        null,
-        EnableString.bogus_enabled,
-        IsEnabledByDefault.bogus_enabled,
-        IsExpired.bogus_enabled,
-        null),
+    EnableString.constant_update_2018:
+        ExperimentalFeatures.constant_update_2018,
+    EnableString.non_nullable: ExperimentalFeatures.non_nullable,
+    EnableString.control_flow_collections:
+        ExperimentalFeatures.control_flow_collections,
+    EnableString.spread_collections: ExperimentalFeatures.spread_collections,
+    EnableString.set_literals: ExperimentalFeatures.set_literals,
+    EnableString.triple_shift: ExperimentalFeatures.triple_shift,
+    EnableString.bogus_disabled: ExperimentalFeatures.bogus_disabled,
+    EnableString.bogus_enabled: ExperimentalFeatures.bogus_enabled,
   };
 
   final List<bool> _enableFlags;
@@ -117,15 +140,30 @@
       bool control_flow_collections,
       bool non_nullable,
       bool set_literals,
-      bool spread_collections})
+      bool spread_collections,
+      bool triple_shift})
       : _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,
+          true, // control-flow-collections
+          true, // spread-collections
+          true, // set-literals
+          triple_shift ?? IsEnabledByDefault.triple_shift,
+          false, // bogus-disabled
+          true, // bogus-enabled
         ];
 
+  /// Computes a set of features for use in a unit test.  Computes the set of
+  /// features enabled in [sdkVersion], plus any specified [additionalFeatures].
+  ///
+  /// If [sdkVersion] is not supplied (or is `null`), then the current set of
+  /// enabled features is used as the starting point.
+  @visibleForTesting
+  ExperimentStatus.forTesting(
+      {String sdkVersion, List<Feature> additionalFeatures: const []})
+      : this._(enableFlagsForTesting(
+            sdkVersion: sdkVersion, additionalFeatures: additionalFeatures));
+
   /// Decodes the strings given in [flags] into a representation of the set of
   /// experiments that should be enabled.
   ///
@@ -136,31 +174,65 @@
 
   ExperimentStatus._(this._enableFlags);
 
-  /// Hardcoded state for the expired flag "bogus_disabled"
-  bool get bogus_disabled => false;
+  /// Current state for the flag "bogus_disabled"
+  bool get bogus_disabled => isEnabled(ExperimentalFeatures.bogus_disabled);
 
-  /// Hardcoded state for the expired flag "bogus_enabled"
-  bool get bogus_enabled => true;
+  /// Current state for the flag "bogus_enabled"
+  bool get bogus_enabled => isEnabled(ExperimentalFeatures.bogus_enabled);
 
   /// Current state for the flag "constant-update-2018"
-  bool get constant_update_2018 => _enableFlags[0];
+  bool get constant_update_2018 =>
+      isEnabled(ExperimentalFeatures.constant_update_2018);
 
   /// Current state for the flag "control_flow_collections"
-  bool get control_flow_collections => _enableFlags[2];
+  bool get control_flow_collections =>
+      isEnabled(ExperimentalFeatures.control_flow_collections);
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    for (var flag in _enableFlags) {
+      hash = JenkinsSmiHash.combine(hash, flag.hashCode);
+    }
+    return JenkinsSmiHash.finish(hash);
+  }
 
   /// Current state for the flag "non-nullable"
-  bool get non_nullable => _enableFlags[1];
+  bool get non_nullable => isEnabled(ExperimentalFeatures.non_nullable);
 
   /// Current state for the flag "set-literals"
-  bool get set_literals => true;
+  bool get set_literals => isEnabled(ExperimentalFeatures.set_literals);
 
   /// Current state for the flag "spread_collections"
-  bool get spread_collections => _enableFlags[3];
+  bool get spread_collections =>
+      isEnabled(ExperimentalFeatures.spread_collections);
+
+  /// Current state for the flag "triple_shift"
+  bool get triple_shift => isEnabled(ExperimentalFeatures.triple_shift);
+
+  @override
+  operator ==(Object other) {
+    if (other is ExperimentStatus) {
+      if (_enableFlags.length != other._enableFlags.length) return false;
+      for (int i = 0; i < _enableFlags.length; i++) {
+        if (_enableFlags[i] != other._enableFlags[i]) return false;
+      }
+      return true;
+    }
+    return false;
+  }
 
   /// Queries whether the given [feature] is enabled or disabled.
-  bool isEnabled(ExperimentalFeature feature) => feature.isExpired
-      ? feature.isEnabledByDefault
-      : _enableFlags[feature.index];
+  @override
+  bool isEnabled(covariant ExperimentalFeature feature) =>
+      _enableFlags[feature.index];
+
+  @override
+  FeatureSet restrictToVersion(Version version) =>
+      ExperimentStatus._(restrictEnableFlagsToVersion(_enableFlags, version));
+
+  @override
+  String toString() => experimentStatusToString(_enableFlags);
 
   /// Returns a list of strings suitable for passing to
   /// [ExperimentStatus.fromStrings].
@@ -174,7 +246,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;
@@ -183,7 +255,10 @@
   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;
 
   /// Default state of the experiment "bogus-disabled"
   static const bool bogus_disabled = false;
@@ -200,7 +275,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;
@@ -209,7 +284,10 @@
   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;
 
   /// Expiration status of the experiment "bogus-disabled"
   static const bool bogus_disabled = true;
diff --git a/analyzer/lib/src/dart/analysis/experiments_impl.dart b/analyzer/lib/src/dart/analysis/experiments_impl.dart
index 64d4b7e..81a437b 100644
--- a/analyzer/lib/src/dart/analysis/experiments_impl.dart
+++ b/analyzer/lib/src/dart/analysis/experiments_impl.dart
@@ -2,8 +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/analysis/features.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:meta/meta.dart';
+import 'package:pub_semver/pub_semver.dart';
 
 /// The same as [ExperimentStatus.knownFeatures], except when a call to
 /// [overrideKnownFeatures] is in progress.
@@ -17,14 +19,9 @@
 /// unrecognized flags are ignored, conflicting flags are resolved in favor of
 /// the flag appearing last.
 List<bool> decodeFlags(List<String> flags) {
-  var decodedFlags = <bool>[];
+  var decodedFlags = List<bool>.filled(_knownFeatures.length, false);
   for (var feature in _knownFeatures.values) {
-    if (feature.isExpired) continue;
-    var index = feature.index;
-    while (decodedFlags.length <= index) {
-      decodedFlags.add(false);
-    }
-    decodedFlags[index] = feature.isEnabledByDefault;
+    decodedFlags[feature.index] = feature.isEnabledByDefault;
   }
   for (var entry in _flagStringsToMap(flags).entries) {
     decodedFlags[entry.key] = entry.value;
@@ -32,6 +29,34 @@
   return decodedFlags;
 }
 
+/// Computes a set of features for use in a unit test.  Computes the set of
+/// features enabled in [sdkVersion], plus any specified [additionalFeatures].
+///
+/// If [sdkVersion] is not supplied (or is `null`), then the current set of
+/// enabled features is used as the starting point.
+List<bool> enableFlagsForTesting(
+    {String sdkVersion, List<Feature> additionalFeatures: const []}) {
+  var flags = decodeFlags([]);
+  if (sdkVersion != null) {
+    flags = restrictEnableFlagsToVersion(flags, Version.parse(sdkVersion));
+  }
+  for (ExperimentalFeature feature in additionalFeatures) {
+    flags[feature.index] = true;
+  }
+  return flags;
+}
+
+/// Pretty-prints the given set of enable flags as a set of feature names.
+String experimentStatusToString(List<bool> enableFlags) {
+  var featuresInSet = <String>[];
+  for (var feature in _knownFeatures.values) {
+    if (enableFlags[feature.index]) {
+      featuresInSet.add(feature.enableString);
+    }
+  }
+  return 'FeatureSet{${featuresInSet.join(', ')}}';
+}
+
 /// Converts the flags in [status] to a list of strings suitable for
 /// passing to [_decodeFlags].
 List<String> experimentStatusToStringList(ExperimentStatus status) {
@@ -64,6 +89,19 @@
   }
 }
 
+/// Computes a new set of enable flags based on [flags], but with any features
+/// that were not present in [version] set to `false`.
+List<bool> restrictEnableFlagsToVersion(List<bool> flags, Version version) {
+  flags = List.from(flags);
+  for (var feature in _knownFeatures.values) {
+    if (!feature.isEnabledByDefault ||
+        feature.firstSupportedVersion > version) {
+      flags[feature.index] = false;
+    }
+  }
+  return flags;
+}
+
 /// Validates whether there are any disagreements between the strings given in
 /// [flags1] and the strings given in [flags2].
 ///
@@ -205,13 +243,10 @@
 
 /// Information about a single experimental flag that the user might use to
 /// request that a feature be enabled (or disabled).
-class ExperimentalFeature {
+class ExperimentalFeature implements Feature {
   /// Index of the flag in the private data structure maintained by
   /// [ExperimentStatus].
   ///
-  /// For expired features, the index should be null, since no enable/disable
-  /// state needs to be stored.
-  ///
   /// This index should not be relied upon to be stable over time.  For instance
   /// it should not be used to serialize the state of experiments to long term
   /// storage if there is any expectation of compatibility between analyzer
@@ -231,13 +266,50 @@
   /// Documentation for the feature, if known.  `null` for expired flags.
   final String documentation;
 
+  final String _firstSupportedVersion;
+
   const ExperimentalFeature(this.index, this.enableString,
-      this.isEnabledByDefault, this.isExpired, this.documentation)
-      : assert(isExpired ? index == null : index != null);
+      this.isEnabledByDefault, this.isExpired, this.documentation,
+      {String firstSupportedVersion})
+      : _firstSupportedVersion = firstSupportedVersion,
+        assert(index != null),
+        assert(isEnabledByDefault
+            ? firstSupportedVersion != null
+            : firstSupportedVersion == null),
+        assert(enableString != null);
 
   /// The string to disable the feature.
   String get disableString => 'no-$enableString';
 
+  @override
+  String get experimentalFlag => isExpired ? null : enableString;
+
+  @override
+  Version get firstSupportedVersion {
+    if (_firstSupportedVersion == null) {
+      return null;
+    } else {
+      return Version.parse(_firstSupportedVersion);
+    }
+  }
+
+  @override
+  FeatureStatus get status {
+    if (isExpired) {
+      if (isEnabledByDefault) {
+        return FeatureStatus.current;
+      } else {
+        return FeatureStatus.abandoned;
+      }
+    } else {
+      if (isEnabledByDefault) {
+        return FeatureStatus.provisional;
+      } else {
+        return FeatureStatus.future;
+      }
+    }
+  }
+
   /// Retrieves the string to enable or disable the feature, depending on
   /// [value].
   String stringForValue(bool value) => value ? enableString : disableString;
diff --git a/analyzer/lib/src/dart/analysis/file_state.dart b/analyzer/lib/src/dart/analysis/file_state.dart
index 3e1a68a..cac4817 100644
--- a/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/analyzer/lib/src/dart/analysis/file_state.dart
@@ -1,10 +1,11 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:convert';
 import 'dart:typed_data';
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -12,7 +13,6 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/defined_names.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/analysis/library_graph.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/referenced_names.dart';
@@ -118,6 +118,7 @@
   String _unlinkedKey;
   AnalysisDriverUnlinkedUnit _driverUnlinkedUnit;
   UnlinkedUnit _unlinked;
+  UnlinkedUnit2 _unlinked2;
   List<int> _apiSignature;
 
   List<FileState> _importedFiles;
@@ -244,6 +245,9 @@
         _fsState.externalSummaries.unlinkedMap.containsKey(uriStr)) {
       return !_fsState.externalSummaries.linkedMap.containsKey(uriStr);
     }
+    if (_unlinked2 != null) {
+      return _unlinked2.isPartOf;
+    }
     return _unlinked.libraryNameOffset == 0 && _unlinked.isPartOf;
   }
 
@@ -434,7 +438,8 @@
         return _parse(errorListener);
       });
     } catch (_) {
-      return _createEmptyCompilationUnit();
+      AnalysisOptionsImpl analysisOptions = _fsState._analysisOptions;
+      return _createEmptyCompilationUnit(analysisOptions.contextFeatures);
     }
   }
 
@@ -449,6 +454,10 @@
    * Return `true` if the API signature changed since the last refresh.
    */
   bool refresh({bool allowCached: false}) {
+    if (_fsState.useSummary2) {
+      return _refresh2();
+    }
+
     _invalidateCurrentUnresolvedData();
 
     {
@@ -578,7 +587,7 @@
   }
 
   @override
-  String toString() => path;
+  String toString() => path ?? '<unresolved>';
 
   /**
    * Compute the full or partial map of exported declarations for this library.
@@ -643,9 +652,10 @@
     return new _ExportedDeclarations(firstCycleId, declarations);
   }
 
-  CompilationUnit _createEmptyCompilationUnit() {
+  CompilationUnit _createEmptyCompilationUnit(FeatureSet featureSet) {
     var token = new Token.eof(0);
-    return astFactory.compilationUnit(token, null, [], [], token)
+    return astFactory.compilationUnit2(
+        beginToken: token, endToken: token, featureSet: featureSet)
       ..lineInfo = new LineInfo(const <int>[0]);
   }
 
@@ -688,27 +698,29 @@
   }
 
   CompilationUnit _parse(AnalysisErrorListener errorListener) {
+    AnalysisOptionsImpl analysisOptions = _fsState._analysisOptions;
+    FeatureSet featureSet = analysisOptions.contextFeatures;
     if (source == null) {
-      return _createEmptyCompilationUnit();
+      return _createEmptyCompilationUnit(featureSet);
     }
 
-    AnalysisOptionsImpl analysisOptions = _fsState._analysisOptions;
-    ExperimentStatus experimentStatus = analysisOptions.experimentStatus;
+    // TODO(paulberry): adjust featureSet as appropriate if there is a "@dart"
+    // comment and/or an SDK constraint that restricts what features should be
+    // available.  Ideally we would like the parser to make this adjustment (at
+    // least in the case of "@dart") because it's the component that recognizes
+    // "@dart" comments.
     CharSequenceReader reader = new CharSequenceReader(content);
-    Scanner scanner = new Scanner(source, reader, errorListener);
-    scanner.enableGtGtGt = experimentStatus.constant_update_2018;
+    Scanner scanner = new Scanner(source, reader, errorListener)
+      ..configureFeatures(featureSet);
     Token token = PerformanceStatistics.scan.makeCurrentWhile(() {
       return scanner.tokenize();
     });
     LineInfo lineInfo = new LineInfo(scanner.lineStarts);
 
     bool useFasta = analysisOptions.useFastaParser;
-    Parser parser = new Parser(source, errorListener, useFasta: useFasta);
+    Parser parser = new Parser(source, errorListener,
+        featureSet: featureSet, useFasta: useFasta);
     parser.enableOptionalNewAndConst = true;
-    parser.enableNonNullable = experimentStatus.non_nullable;
-    parser.enableSpreadCollections = experimentStatus.spread_collections;
-    parser.enableControlFlowCollections =
-        experimentStatus.control_flow_collections;
     CompilationUnit unit = parser.parseCompilationUnit(token);
     unit.lineInfo = lineInfo;
 
@@ -719,6 +731,163 @@
     return unit;
   }
 
+  bool _refresh2() {
+    _invalidateCurrentUnresolvedData();
+
+    {
+      var rawFileState = _fsState._fileContentCache.get(path, false);
+      _content = rawFileState.content;
+      _exists = rawFileState.exists;
+      _contentHash = rawFileState.contentHash;
+    }
+
+    // Prepare the unlinked bundle key.
+    List<int> contentSignature;
+    {
+      var signature = new ApiSignature();
+      signature.addUint32List(_fsState._unlinkedSalt);
+      signature.addString(_contentHash);
+      contentSignature = signature.toByteList();
+      _unlinkedKey = '${hex.encode(contentSignature)}.unlinked2';
+    }
+
+    // Prepare bytes of the unlinked bundle - existing or new.
+    List<int> bytes;
+    {
+      bytes = _fsState._byteStore.get(_unlinkedKey);
+      if (bytes == null || bytes.isEmpty) {
+        CompilationUnit unit = parse();
+        _fsState._logger.run('Create unlinked for $path', () {
+          var unlinkedUnit = serializeAstUnlinked2(contentSignature, unit);
+          var definedNames = computeDefinedNames(unit);
+          var referencedNames = computeReferencedNames(unit).toList();
+          var subtypedNames = computeSubtypedNames(unit).toList();
+          bytes = new AnalysisDriverUnlinkedUnitBuilder(
+            unit2: unlinkedUnit,
+            definedTopLevelNames: definedNames.topLevelNames.toList(),
+            definedClassMemberNames: definedNames.classMemberNames.toList(),
+            referencedNames: referencedNames,
+            subtypedNames: subtypedNames,
+          ).toBuffer();
+          _fsState._byteStore.put(_unlinkedKey, bytes);
+        });
+      }
+    }
+
+    // Read the unlinked bundle.
+    _driverUnlinkedUnit = new AnalysisDriverUnlinkedUnit.fromBuffer(bytes);
+    _unlinked2 = _driverUnlinkedUnit.unit2;
+    _lineInfo = new LineInfo(_unlinked2.lineStarts);
+
+    // Prepare API signature.
+    var newApiSignature = new Uint8List.fromList(_unlinked2.apiSignature);
+    bool apiSignatureChanged = _apiSignature != null &&
+        !_equalByteLists(_apiSignature, newApiSignature);
+    _apiSignature = newApiSignature;
+
+    // The API signature changed.
+    //   Flush affected library cycles.
+    //   Flush exported top-level declarations of all files.
+    if (apiSignatureChanged) {
+      _libraryCycle?.invalidate();
+
+      // If this is a part, invalidate the libraries.
+      var libraries = _fsState._partToLibraries[this];
+      if (libraries != null) {
+        for (var library in libraries) {
+          library.libraryCycle?.invalidate();
+        }
+      }
+
+      for (FileState file in _fsState._uriToFile.values) {
+        file._exportedTopLevelDeclarations = null;
+      }
+    }
+
+    // This file is potentially not a library for its previous parts anymore.
+    if (_partedFiles != null) {
+      for (FileState part in _partedFiles) {
+        _fsState._partToLibraries[part]?.remove(this);
+      }
+    }
+
+    // Build the graph.
+    _importedFiles = <FileState>[];
+    _exportedFiles = <FileState>[];
+    _partedFiles = <FileState>[];
+    _exportFilters = <NameFilter>[];
+    for (var uri in _unlinked2.imports) {
+      var file = _fileForRelativeUri(uri);
+      _importedFiles.add(file);
+    }
+    for (var uri in _unlinked2.exports) {
+      var file = _fileForRelativeUri(uri);
+      _exportedFiles.add(file);
+      // TODO(scheglov) implement
+      _exportFilters.add(NameFilter.identity);
+    }
+    for (var uri in _unlinked2.parts) {
+      var file = _fileForRelativeUri(uri);
+      _partedFiles.add(file);
+      _fsState._partToLibraries
+          .putIfAbsent(file, () => <FileState>[])
+          .add(this);
+    }
+    _libraryFiles = [this]..addAll(_partedFiles);
+
+    // Compute referenced files.
+    _directReferencedFiles = new Set<FileState>()
+      ..addAll(_importedFiles)
+      ..addAll(_exportedFiles)
+      ..addAll(_partedFiles);
+    _directReferencedLibraries = Set<FileState>()
+      ..addAll(_importedFiles)
+      ..addAll(_exportedFiles);
+
+    // Update mapping from subtyped names to files.
+    for (var name in _driverUnlinkedUnit.subtypedNames) {
+      var files = _fsState._subtypedNameToFiles[name];
+      if (files == null) {
+        files = new Set<FileState>();
+        _fsState._subtypedNameToFiles[name] = files;
+      }
+      files.add(this);
+    }
+
+    // Return whether the API signature changed.
+    return apiSignatureChanged;
+  }
+
+  static UnlinkedUnit2Builder serializeAstUnlinked2(
+      List<int> contentSignature, CompilationUnit unit) {
+    var exports = <String>[];
+    var imports = <String>['dart:core'];
+    var parts = <String>[];
+    var isPartOf = false;
+    for (var directive in unit.directives) {
+      if (directive is ExportDirective) {
+        var uriStr = directive.uri.stringValue;
+        exports.add(uriStr ?? '');
+      } else if (directive is ImportDirective) {
+        var uriStr = directive.uri.stringValue;
+        imports.add(uriStr ?? '');
+      } else if (directive is PartDirective) {
+        var uriStr = directive.uri.stringValue;
+        parts.add(uriStr ?? '');
+      } else if (directive is PartOfDirective) {
+        isPartOf = true;
+      }
+    }
+    return UnlinkedUnit2Builder(
+      apiSignature: contentSignature,
+      exports: exports,
+      imports: imports,
+      parts: parts,
+      isPartOf: isPartOf,
+      lineStarts: unit.lineInfo.lineStarts,
+    );
+  }
+
   /**
    * Return `true` if the given byte lists are equal.
    */
@@ -761,6 +930,7 @@
   final AnalysisOptions _analysisOptions;
   final Uint32List _unlinkedSalt;
   final Uint32List _linkedSalt;
+  final bool useSummary2;
 
   /**
    * The optional store with externally provided unlinked and corresponding
@@ -841,6 +1011,7 @@
     this._unlinkedSalt,
     this._linkedSalt, {
     this.externalSummaries,
+    this.useSummary2 = false,
   }) {
     _fileContentCache = _FileContentCache.getInstance(
       _resourceProvider,
diff --git a/analyzer/lib/src/dart/analysis/file_tracker.dart b/analyzer/lib/src/dart/analysis/file_tracker.dart
index 1e34697..363b777 100644
--- a/analyzer/lib/src/dart/analysis/file_tracker.dart
+++ b/analyzer/lib/src/dart/analysis/file_tracker.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/dart/analysis/fletcher16.dart b/analyzer/lib/src/dart/analysis/fletcher16.dart
index 8eb3e2e..46f3ae6 100644
--- a/analyzer/lib/src/dart/analysis/fletcher16.dart
+++ b/analyzer/lib/src/dart/analysis/fletcher16.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/dart/analysis/index.dart b/analyzer/lib/src/dart/analysis/index.dart
index ac79c40..61b116e 100644
--- a/analyzer/lib/src/dart/analysis/index.dart
+++ b/analyzer/lib/src/dart/analysis/index.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/dart/analysis/library_analyzer.dart b/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 7a4b3d0..33e6df3 100644
--- a/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -32,6 +32,8 @@
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/linter_visitor.dart';
 import 'package:analyzer/src/services/lint.dart';
+import 'package:analyzer/src/summary2/declaration_splicer.dart';
+import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/task/strong/checker.dart';
 import 'package:pub_semver/pub_semver.dart';
 
@@ -53,6 +55,7 @@
   final bool Function(Uri) _isLibraryUri;
   final AnalysisContext _context;
   final ElementResynthesizer _resynthesizer;
+  final LinkedElementFactory _elementFactory;
   final TypeProvider _typeProvider;
 
   final TypeSystem _typeSystem;
@@ -85,6 +88,7 @@
       this._isLibraryUri,
       this._context,
       this._resynthesizer,
+      this._elementFactory,
       this._inheritance,
       this._library,
       this._resourceProvider)
@@ -119,8 +123,12 @@
       _resolveUriBasedDirectives(file, unit);
     });
 
-    _libraryElement = _resynthesizer
-        .getElement(new ElementLocationImpl.con3([_library.uriStr]));
+    if (_elementFactory != null) {
+      _libraryElement = _elementFactory.libraryOfUri(_library.uriStr);
+    } else {
+      _libraryElement = _resynthesizer
+          .getElement(new ElementLocationImpl.con3([_library.uriStr]));
+    }
     _libraryScope = new LibraryScope(_libraryElement);
 
     _resolveDirectives(units);
@@ -204,7 +212,7 @@
       ErrorReporter errorReporter, CompilationUnit unit) {
     ConstantVerifier constantVerifier = new ConstantVerifier(
         errorReporter, _libraryElement, _typeProvider, _declaredVariables,
-        forAnalysisDriver: true);
+        featureSet: unit.featureSet, forAnalysisDriver: true);
     unit.accept(constantVerifier);
   }
 
@@ -240,7 +248,7 @@
     }
 
     unit.accept(new BestPracticesVerifier(
-        errorReporter, _typeProvider, _libraryElement,
+        errorReporter, _typeProvider, _libraryElement, unit, file.content,
         typeSystem: _context.typeSystem,
         resourceProvider: _resourceProvider,
         analysisOptions: _context.analysisOptions));
@@ -345,6 +353,7 @@
     CodeChecker checker = new CodeChecker(
       _typeProvider,
       _context.typeSystem,
+      _inheritance,
       errorListener,
       _analysisOptions,
     );
@@ -622,7 +631,11 @@
       }
     }
 
-    new DeclarationResolver().resolve(unit, unitElement);
+    if (_elementFactory != null) {
+      new DeclarationSplicer(unitElement).splice(unit);
+    } else {
+      new DeclarationResolver().resolve(unit, unitElement);
+    }
 
     unit.accept(new AstRewriteVisitor(_context.typeSystem, _libraryElement,
         source, _typeProvider, errorListener,
@@ -643,15 +656,21 @@
         _libraryElement, source, _typeProvider, errorListener,
         nameScope: _libraryScope));
 
-    unit.accept(new PartialResolverVisitor(_inheritance, _libraryElement,
-        source, _typeProvider, AnalysisErrorListener.NULL_LISTENER));
+    unit.accept(new PartialResolverVisitor(
+        _inheritance,
+        _libraryElement,
+        source,
+        _typeProvider,
+        AnalysisErrorListener.NULL_LISTENER,
+        unit.featureSet));
 
     // Nothing for RESOLVED_UNIT8?
     // Nothing for RESOLVED_UNIT9?
     // Nothing for RESOLVED_UNIT10?
 
     unit.accept(new ResolverVisitor(
-        _inheritance, _libraryElement, source, _typeProvider, errorListener));
+        _inheritance, _libraryElement, source, _typeProvider, errorListener,
+        featureSet: unit.featureSet));
   }
 
   /**
diff --git a/analyzer/lib/src/dart/analysis/library_context.dart b/analyzer/lib/src/dart/analysis/library_context.dart
index 9c82bd8..62ba772 100644
--- a/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/analyzer/lib/src/dart/analysis/library_context.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,10 +6,10 @@
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/element/element.dart'
     show CompilationUnitElement, LibraryElement;
-import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/library_graph.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/restricted_analysis_context.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -23,6 +23,11 @@
 import 'package:analyzer/src/summary/link.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary/resynthesize.dart';
+import 'package:analyzer/src/summary/summary_sdk.dart';
+import 'package:analyzer/src/summary2/link.dart' as link2;
+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:meta/meta.dart';
 
 /**
@@ -36,6 +41,7 @@
 
   final PerformanceLog logger;
   final ByteStore byteStore;
+  final AnalysisSession analysisSession;
   final SummaryDataStore store = new SummaryDataStore([]);
 
   /// The size of the linked data that is loaded by this context.
@@ -43,8 +49,9 @@
   /// We use it as an approximation for the heap size of elements.
   int _linkedDataInBytes = 0;
 
-  AnalysisContextImpl analysisContext;
+  RestrictedAnalysisContext analysisContext;
   SummaryResynthesizer resynthesizer;
+  LinkedElementFactory elementFactory;
   InheritanceManager2 inheritanceManager;
 
   LibraryContext({
@@ -57,8 +64,10 @@
     @required SourceFactory sourceFactory,
     @required SummaryDataStore externalSummaries,
     @required FileState targetLibrary,
+    @required bool useSummary2,
   })  : this.logger = logger,
-        this.byteStore = byteStore {
+        this.byteStore = byteStore,
+        this.analysisSession = session {
     if (externalSummaries != null) {
       store.addStore(externalSummaries);
     }
@@ -69,12 +78,17 @@
       sourceFactory,
     );
 
-    // Fill the store with summaries required for the initial library.
-    load(targetLibrary);
+    if (useSummary2) {
+      load2(targetLibrary);
+    } else {
+      // Fill the store with summaries required for the initial library.
+      load(targetLibrary);
 
-    var provider = new InputPackagesResultProvider(analysisContext, store,
-        session: session);
-    resynthesizer = provider.resynthesizer;
+      resynthesizer = new StoreBasedSummaryResynthesizer(
+          analysisContext, session, sourceFactory, true, store);
+      analysisContext.typeProvider = resynthesizer.typeProvider;
+      resynthesizer.finishCoreAsyncLibraries();
+    }
 
     inheritanceManager = new InheritanceManager2(analysisContext.typeSystem);
   }
@@ -88,10 +102,18 @@
    * Computes a [CompilationUnitElement] for the given library/unit pair.
    */
   CompilationUnitElement computeUnitElement(FileState library, FileState unit) {
-    return resynthesizer.getElement(new ElementLocationImpl.con3(<String>[
-      library.uriStr,
-      unit.uriStr,
-    ]));
+    if (elementFactory != null) {
+      var reference = elementFactory.rootReference
+          .getChild(library.uriStr)
+          .getChild('@unit')
+          .getChild(unit.uriStr);
+      return elementFactory.elementOfReference(reference);
+    } else {
+      return resynthesizer.getElement(new ElementLocationImpl.con3(<String>[
+        library.uriStr,
+        unit.uriStr,
+      ]));
+    }
   }
 
   /**
@@ -106,7 +128,11 @@
    */
   bool isLibraryUri(Uri uri) {
     String uriStr = uri.toString();
-    return store.unlinkedMap[uriStr]?.isPartOf == false;
+    if (elementFactory != null) {
+      return elementFactory.isLibraryUri(uriStr);
+    } else {
+      return store.unlinkedMap[uriStr]?.isPartOf == false;
+    }
   }
 
   /// Load data required to access elements of the given [targetLibrary].
@@ -193,6 +219,102 @@
     }
   }
 
+  /// Load data required to access elements of the given [targetLibrary].
+  void load2(FileState targetLibrary) {
+    var loadedBundles = Set<LibraryCycle>.identity();
+    var inputBundles = <LinkedNodeBundle>[];
+
+    void loadBundle(LibraryCycle cycle) {
+      if (!loadedBundles.add(cycle)) return;
+
+      logger.run('Prepare linked bundle', () {
+        logger.writeln('Libraries: ${cycle.libraries}');
+        cycle.directDependencies.forEach(loadBundle);
+
+        var key = cycle.transitiveSignature + '.linked_bundle';
+        var bytes = byteStore.get(key);
+
+        if (bytes == null) {
+          var inputLibraries = <link2.LinkInputLibrary>[];
+          logger.run('Prepare input libraries', () {
+            for (var libraryFile in cycle.libraries) {
+              var librarySource = libraryFile.source;
+              if (librarySource == null) continue;
+
+              var inputUnits = <link2.LinkInputUnit>[];
+              for (var file in libraryFile.libraryFiles) {
+                var isSynthetic = !file.exists;
+                inputUnits.add(
+                  link2.LinkInputUnit(file.source, isSynthetic, file.parse()),
+                );
+              }
+
+              inputLibraries.add(
+                link2.LinkInputLibrary(librarySource, inputUnits),
+              );
+            }
+            logger.writeln('Prepared ${inputLibraries.length} libraries.');
+          });
+
+          link2.LinkResult linkResult;
+          logger.run('Link libraries', () {
+            linkResult = link2.link(
+              analysisContext.analysisOptions,
+              analysisContext.sourceFactory,
+              analysisContext.declaredVariables,
+              inputBundles,
+              inputLibraries,
+            );
+            logger.writeln('Linked ${inputLibraries.length} libraries.');
+          });
+
+          bytes = linkResult.bundle.toBuffer();
+          byteStore.put(key, bytes);
+          logger.writeln('Stored ${bytes.length} bytes.');
+        } else {
+          logger.writeln('Loaded ${bytes.length} bytes.');
+        }
+
+        inputBundles.add(
+          LinkedNodeBundle.fromBuffer(bytes),
+        );
+      });
+    }
+
+    logger.run('Prepare linked bundles', () {
+      var libraryCycle = targetLibrary.libraryCycle;
+      loadBundle(libraryCycle);
+    });
+
+    var rootReference = Reference.root();
+    rootReference.getChild('dart:core').getChild('dynamic').element =
+        DynamicElementImpl.instance;
+    rootReference.getChild('dart:core').getChild('Never').element =
+        NeverElementImpl.instance;
+
+    elementFactory = LinkedElementFactory(
+      analysisContext,
+      analysisSession,
+      rootReference,
+    );
+
+    for (var bundle in inputBundles) {
+      elementFactory.addBundle(
+        LinkedBundleContext(elementFactory, bundle),
+      );
+    }
+
+    var dartCore = elementFactory.libraryOfUri('dart:core');
+    var dartAsync = elementFactory.libraryOfUri('dart:async');
+    var typeProvider = SummaryTypeProvider()
+      ..initializeCore(dartCore)
+      ..initializeAsync(dartAsync);
+    analysisContext.typeProvider = typeProvider;
+
+    dartCore.createLoadLibraryFunction(typeProvider);
+    dartAsync.createLoadLibraryFunction(typeProvider);
+  }
+
   /// Return `true` if this context grew too large, and should be recreated.
   ///
   /// It might have been used to analyze libraries that we don't need anymore,
diff --git a/analyzer/lib/src/dart/analysis/library_graph.dart b/analyzer/lib/src/dart/analysis/library_graph.dart
index 74cb08c..3e79078 100644
--- a/analyzer/lib/src/dart/analysis/library_graph.dart
+++ b/analyzer/lib/src/dart/analysis/library_graph.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -8,7 +8,6 @@
 import 'package:analyzer/src/summary/api_signature.dart';
 import 'package:analyzer/src/summary/link.dart' as graph
     show DependencyWalker, Node;
-import 'package:meta/meta.dart';
 
 /// Ensure that the [FileState.libraryCycle] for the [file] and anything it
 /// depends on is computed.
@@ -23,7 +22,6 @@
   final List<FileState> libraries = [];
 
   /// The library cycles that this cycle references directly.
-  @visibleForTesting
   final Set<LibraryCycle> directDependencies = new Set<LibraryCycle>();
 
   /// The cycles that use this cycle, used to [invalidate] transitively.
@@ -35,11 +33,11 @@
   /// transitive signatures of the cycles that the [libraries] reference
   /// directly.  So, indirectly it is based on the transitive closure of all
   /// files that [libraries] reference (but we don't compute these files).
-  String _transitiveSignature;
+  String transitiveSignature;
 
   /// The map from a library in [libraries] to its transitive signature.
   ///
-  /// It is almost the same as [_transitiveSignature], but is also based on
+  /// It is almost the same as [transitiveSignature], but is also based on
   /// the URI of this specific library.  Currently we store each linked library
   /// with its own key, so we need unique keys.  However practically we never
   /// can use just *one* library of a cycle, we always use the whole cycle.
@@ -49,7 +47,7 @@
 
   LibraryCycle();
 
-  LibraryCycle.external() : _transitiveSignature = '<external>';
+  LibraryCycle.external() : transitiveSignature = '<external>';
 
   /// Invalidate this cycle and any cycles that directly or indirectly use it.
   ///
@@ -125,6 +123,8 @@
     for (var node in scc) {
       cycle.libraries.add(node.file);
 
+      signature.addString(node.file.uriStr);
+
       signature.addInt(node.file.libraryFiles.length);
       for (var file in node.file.libraryFiles) {
         signature.addBytes(file.apiSignature);
@@ -132,13 +132,13 @@
     }
 
     // Compute the general library cycle signature.
-    cycle._transitiveSignature = signature.toHex();
+    cycle.transitiveSignature = signature.toHex();
 
     // Compute library specific signatures.
     for (var node in scc) {
       var librarySignatureBuilder = new ApiSignature()
         ..addString(node.file.uriStr)
-        ..addString(cycle._transitiveSignature);
+        ..addString(cycle.transitiveSignature);
       var librarySignature = librarySignatureBuilder.toHex();
 
       node.file.internal_setLibraryCycle(
@@ -166,7 +166,7 @@
 
       if (cycle.directDependencies.add(referencedCycle)) {
         referencedCycle._directUsers.add(cycle);
-        signature.addString(referencedCycle._transitiveSignature);
+        signature.addString(referencedCycle.transitiveSignature);
       }
     }
   }
diff --git a/analyzer/lib/src/dart/analysis/performance_logger.dart b/analyzer/lib/src/dart/analysis/performance_logger.dart
index 47af4cd..6c265db 100644
--- a/analyzer/lib/src/dart/analysis/performance_logger.dart
+++ b/analyzer/lib/src/dart/analysis/performance_logger.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/dart/analysis/referenced_names.dart b/analyzer/lib/src/dart/analysis/referenced_names.dart
index 9148fef..ab09542 100644
--- a/analyzer/lib/src/dart/analysis/referenced_names.dart
+++ b/analyzer/lib/src/dart/analysis/referenced_names.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/dart/analysis/session.dart b/analyzer/lib/src/dart/analysis/session.dart
index 6ff7f8f..5c88736 100644
--- a/analyzer/lib/src/dart/analysis/session.dart
+++ b/analyzer/lib/src/dart/analysis/session.dart
@@ -17,38 +17,24 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 
-/**
- * A concrete implementation of an analysis session.
- */
+/// A concrete implementation of an analysis session.
 class AnalysisSessionImpl implements AnalysisSession {
-  /**
-   * The analysis driver performing analysis for this session.
-   */
+  /// The analysis driver performing analysis for this session.
   final driver.AnalysisDriver _driver;
 
-  /**
-   * The type provider being used by the analysis driver.
-   */
+  /// The type provider being used by the analysis driver.
   TypeProvider _typeProvider;
 
-  /**
-   * The type system being used by the analysis driver.
-   */
+  /// The type system being used by the analysis driver.
   TypeSystem _typeSystem;
 
-  /**
-   * The URI converter used to convert between URI's and file paths.
-   */
+  /// The URI converter used to convert between URI's and file paths.
   UriConverter _uriConverter;
 
-  /**
-   * The cache of libraries for URIs.
-   */
+  /// The cache of libraries for URIs.
   final Map<String, LibraryElement> _uriToLibraryCache = {};
 
-  /**
-   * Initialize a newly created analysis session.
-   */
+  /// Initialize a newly created analysis session.
   AnalysisSessionImpl(this._driver);
 
   @override
@@ -190,10 +176,8 @@
     return _driver.getUnitElementSignature(path);
   }
 
-  /**
-   * Check to see that results from this session will be consistent, and throw
-   * an [InconsistentAnalysisException] if they might not be.
-   */
+  /// Check to see that results from this session will be consistent, and throw
+  /// an [InconsistentAnalysisException] if they might not be.
   void _checkConsistency() {
     if (_driver.currentSession != this) {
       throw new InconsistentAnalysisException();
diff --git a/analyzer/lib/src/dart/analysis/top_level_declaration.dart b/analyzer/lib/src/dart/analysis/top_level_declaration.dart
index b32e636..1658aad 100644
--- a/analyzer/lib/src/dart/analysis/top_level_declaration.dart
+++ b/analyzer/lib/src/dart/analysis/top_level_declaration.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/dart/ast/ast.dart b/analyzer/lib/src/dart/ast/ast.dart
index 8dfa18b..bbc3d44 100644
--- a/analyzer/lib/src/dart/ast/ast.dart
+++ b/analyzer/lib/src/dart/ast/ast.dart
@@ -5,6 +5,7 @@
 import 'dart:collection';
 import 'dart:math' as math;
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/precedence.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
@@ -443,13 +444,8 @@
     _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => RELATIONAL_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.relational;
+  Precedence get precedence => Precedence.relational;
 
   @override
   TypeAnnotation get type => _type;
@@ -697,13 +693,8 @@
     _leftHandSide = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => ASSIGNMENT_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.assignment;
+  Precedence get precedence => Precedence.assignment;
 
   @deprecated
   @override
@@ -924,13 +915,8 @@
     _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => PREFIX_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.prefix;
+  Precedence get precedence => Precedence.prefix;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitAwaitExpression(this);
@@ -994,13 +980,8 @@
     _leftOperand = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => operator.type.precedence;
-
-  @override
-  Precedence get precedence2 => Precedence.forTokenType(operator.type);
+  Precedence get precedence => Precedence.forTokenType(operator.type);
 
   @deprecated
   @override
@@ -1283,13 +1264,8 @@
   @override
   Token get endToken => _cascadeSections.endToken;
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => CASCADE_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.cascade;
+  Precedence get precedence => Precedence.cascade;
 
   @override
   Expression get target => _target;
@@ -2082,7 +2058,10 @@
   LocalVariableInfo localVariableInfo = new LocalVariableInfo();
 
   /// Is `true` if this unit has been parsed as non-nullable.
-  bool isNonNullable = false;
+  final bool isNonNullable;
+
+  @override
+  final FeatureSet featureSet;
 
   /// Initialize a newly created compilation unit to have the given directives
   /// and declarations. The [scriptTag] can be `null` if there is no script tag
@@ -2094,7 +2073,10 @@
       ScriptTagImpl scriptTag,
       List<Directive> directives,
       List<CompilationUnitMember> declarations,
-      this.endToken) {
+      this.endToken,
+      this.featureSet)
+      : this.isNonNullable =
+            featureSet?.isEnabled(Feature.non_nullable) ?? false {
     _scriptTag = _becomeParentOf(scriptTag);
     _directives = new NodeListImpl<Directive>(this, directives);
     _declarations = new NodeListImpl<CompilationUnitMember>(this, declarations);
@@ -2283,13 +2265,8 @@
   @override
   Token get endToken => _elseExpression.endToken;
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => CONDITIONAL_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.conditional;
+  Precedence get precedence => Precedence.conditional;
 
   @override
   Expression get thenExpression => _thenExpression;
@@ -2438,7 +2415,6 @@
         case CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE:
         case CompileTimeErrorCode.CONST_WITH_NON_CONST:
         case CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT:
-        case CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER:
         case CompileTimeErrorCode
             .CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST:
         case CompileTimeErrorCode.INVALID_CONSTANT:
@@ -3042,9 +3018,6 @@
   }
 
   @override
-  ParameterElement get declaredElement => _parameter.declaredElement;
-
-  @override
   Token get beginToken => _parameter.beginToken;
 
   @override
@@ -3055,6 +3028,9 @@
   Token get covariantKeyword => null;
 
   @override
+  ParameterElement get declaredElement => _parameter.declaredElement;
+
+  @override
   Expression get defaultValue => _defaultValue;
 
   @override
@@ -3091,6 +3067,9 @@
   }
 
   @override
+  Token get requiredKeyword => null;
+
+  @override
   E accept<E>(AstVisitor<E> visitor) =>
       visitor.visitDefaultFormalParameter(this);
 
@@ -3514,6 +3493,7 @@
 
   @override
   Iterable<SyntacticEntity> get childEntities => super._childEntities
+    ..add(keyword)
     ..add(_uri)
     ..addAll(combinators)
     ..add(semicolon);
@@ -3699,6 +3679,10 @@
   @override
   bool get isAssignable => false;
 
+  @Deprecated('Use precedence')
+  @override
+  Precedence get precedence2 => precedence;
+
   @deprecated
   @override
   ParameterElement get propagatedParameterElement => null;
@@ -3967,6 +3951,7 @@
       CommentImpl comment,
       List<Annotation> metadata,
       Token covariantKeyword,
+      Token requiredKeyword,
       this.keyword,
       TypeAnnotationImpl type,
       this.thisKeyword,
@@ -3974,7 +3959,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);
@@ -4171,107 +4157,6 @@
   }
 }
 
-/// A for-each statement.
-///
-///    forEachStatement ::=
-///        'await'? 'for' '(' [DeclaredIdentifier] 'in' [Expression] ')' [Block]
-///      | 'await'? 'for' '(' [SimpleIdentifier] 'in' [Expression] ')' [Block]
-@Deprecated('Use ForStatement2Impl')
-class ForEachStatementImpl extends ForStatement2Impl
-    implements ForEachStatement {
-  /// Initialize a newly created for-each statement whose loop control variable
-  /// is declared internally (in the for-loop part). The [awaitKeyword] can be
-  /// `null` if this is not an asynchronous for loop.
-  ForEachStatementImpl.withDeclaration(
-      Token awaitKeyword,
-      Token forKeyword,
-      Token leftParenthesis,
-      DeclaredIdentifierImpl loopVariable,
-      Token inKeyword,
-      ExpressionImpl iterator,
-      Token rightParenthesis,
-      StatementImpl body)
-      : super(
-            awaitKeyword,
-            forKeyword,
-            leftParenthesis,
-            new ForEachPartsWithDeclarationImpl(
-                loopVariable, inKeyword, iterator),
-            rightParenthesis,
-            body);
-
-  /// Creates a for-each statement using a caller-provided "parts" data
-  /// structure.
-  ForEachStatementImpl.withParts(
-      Token awaitKeyword,
-      Token forKeyword,
-      Token leftParenthesis,
-      ForEachPartsImpl forLoopParts,
-      Token rightParenthesis,
-      Statement body)
-      : super(awaitKeyword, forKeyword, leftParenthesis, forLoopParts,
-            rightParenthesis, body);
-
-  /// Initialize a newly created for-each statement whose loop control variable
-  /// is declared outside the for loop. The [awaitKeyword] can be `null` if this
-  /// is not an asynchronous for loop.
-  ForEachStatementImpl.withReference(
-      Token awaitKeyword,
-      Token forKeyword,
-      Token leftParenthesis,
-      SimpleIdentifierImpl identifier,
-      Token inKeyword,
-      ExpressionImpl iterator,
-      Token rightParenthesis,
-      StatementImpl body)
-      : super(
-            awaitKeyword,
-            forKeyword,
-            leftParenthesis,
-            new ForEachPartsWithIdentifierImpl(identifier, inKeyword, iterator),
-            rightParenthesis,
-            body);
-
-  @override
-  SimpleIdentifier get identifier => forLoopParts is ForEachPartsWithIdentifier
-      ? (forLoopParts as ForEachPartsWithIdentifier).identifier
-      : null;
-
-  @override
-  void set identifier(SimpleIdentifier identifier) {
-    (forLoopParts as ForEachPartsWithIdentifierImpl).identifier = identifier;
-  }
-
-  @override
-  Token get inKeyword => (forLoopParts as ForEachParts).inKeyword;
-
-  @override
-  set inKeyword(Token keyword) =>
-      (forLoopParts as ForEachPartsImpl).inKeyword = keyword;
-
-  @override
-  Expression get iterable => (forLoopParts as ForEachParts).iterable;
-
-  @override
-  void set iterable(Expression expression) {
-    (forLoopParts as ForEachPartsImpl).iterable = expression;
-  }
-
-  @override
-  DeclaredIdentifier get loopVariable =>
-      forLoopParts is ForEachPartsWithDeclaration
-          ? (forLoopParts as ForEachPartsWithDeclaration).loopVariable
-          : null;
-
-  @override
-  void set loopVariable(DeclaredIdentifier variable) {
-    (forLoopParts as ForEachPartsWithDeclarationImpl).loopVariable = variable;
-  }
-
-  @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitForEachStatement(this);
-}
-
 class ForElementImpl extends CollectionElementImpl
     with ForMixin
     implements ForElement {
@@ -4342,13 +4227,17 @@
   ParameterElement get element => declaredElement;
 
   @override
-  bool get isNamed => kind == ParameterKind.NAMED;
+  bool get isNamed =>
+      kind == ParameterKind.NAMED || kind == ParameterKind.NAMED_REQUIRED;
 
   @override
   bool get isOptional =>
       kind == ParameterKind.NAMED || kind == ParameterKind.POSITIONAL;
 
   @override
+  bool get isOptionalNamed => kind == ParameterKind.NAMED;
+
+  @override
   bool get isOptionalPositional => kind == ParameterKind.POSITIONAL;
 
   @override
@@ -4356,7 +4245,14 @@
       kind == ParameterKind.POSITIONAL || kind == ParameterKind.REQUIRED;
 
   @override
-  bool get isRequired => kind == ParameterKind.REQUIRED;
+  bool get isRequired =>
+      kind == ParameterKind.REQUIRED || kind == ParameterKind.NAMED_REQUIRED;
+
+  @override
+  bool get isRequiredNamed => kind == ParameterKind.NAMED_REQUIRED;
+
+  @override
+  bool get isRequiredPositional => kind == ParameterKind.REQUIRED;
 
   @override
   // Overridden to remove the 'deprecated' annotation.
@@ -4641,20 +4537,12 @@
   }
 }
 
-abstract class ForStatement2Impl extends StatementImpl
-    with ForMixin
-    implements ForStatement2 {
-  /// The body of the loop.
-  StatementImpl _body;
-
+@Deprecated('Replaced by ForStatementImpl')
+class ForStatement2Impl extends ForStatementImpl implements ForStatement2 {
   /// Initialize a newly created for statement.
-  ForStatement2Impl(
-      Token awaitKeyword,
-      Token forKeyword,
-      Token leftParenthesis,
-      ForLoopPartsImpl forLoopParts,
-      Token rightParenthesis,
-      StatementImpl body) {
+  ForStatement2Impl(Token awaitKeyword, Token forKeyword, Token leftParenthesis,
+      ForLoopPartsImpl forLoopParts, Token rightParenthesis, StatementImpl body)
+      : super._() {
     this.awaitKeyword = awaitKeyword;
     this.forKeyword = forKeyword;
     this.leftParenthesis = leftParenthesis;
@@ -4663,6 +4551,28 @@
     _body = _becomeParentOf(body);
   }
 
+  @override
+  E accept<E>(AstVisitor<E> visitor) => visitor.visitForStatement2(this);
+}
+
+abstract class ForStatementImpl extends StatementImpl
+    with ForMixin
+    implements ForStatement {
+  /// The body of the loop.
+  StatementImpl _body;
+
+  /// Initialize a newly created for statement.
+  factory ForStatementImpl(
+      Token awaitKeyword,
+      Token forKeyword,
+      Token leftParenthesis,
+      ForLoopPartsImpl forLoopParts,
+      Token rightParenthesis,
+      // ignore: deprecated_member_use_from_same_package
+      StatementImpl body) = ForStatement2Impl;
+
+  ForStatementImpl._();
+
   Statement get body => _body;
 
   void set body(Statement statement) {
@@ -4678,7 +4588,7 @@
   Token get endToken => _body.endToken;
 
   @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitForStatement2(this);
+  E accept<E>(AstVisitor<E> visitor) => visitor.visitForStatement(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -4687,111 +4597,6 @@
   }
 }
 
-/// A for statement.
-///
-///    forStatement ::=
-///        'for' '(' forLoopParts ')' [Statement]
-///
-///    forLoopParts ::=
-///        forInitializerStatement ';' [Expression]? ';' [Expression]?
-///
-///    forInitializerStatement ::=
-///        [DefaultFormalParameter]
-///      | [Expression]?
-@Deprecated('Use ForStatement2Impl')
-class ForStatementImpl extends ForStatement2Impl implements ForStatement {
-  /// Initialize a newly created for statement. Either the [variableList] or the
-  /// [initialization] must be `null`. Either the [condition] and the list of
-  /// [updaters] can be `null` if the loop does not have the corresponding
-  /// attribute.
-  ForStatementImpl(
-      Token forKeyword,
-      Token leftParenthesis,
-      VariableDeclarationListImpl variableList,
-      ExpressionImpl initialization,
-      Token leftSeparator,
-      ExpressionImpl condition,
-      Token rightSeparator,
-      List<Expression> updaters,
-      Token rightParenthesis,
-      StatementImpl body)
-      : super(
-            null,
-            forKeyword,
-            leftParenthesis,
-            variableList == null
-                ? new ForPartsWithExpressionImpl(initialization, leftSeparator,
-                    condition, rightSeparator, updaters)
-                : new ForPartsWithDeclarationsImpl(variableList, leftSeparator,
-                    condition, rightSeparator, updaters),
-            rightParenthesis,
-            body);
-
-  /// Creates a for-each statement using a caller-provided "parts" data
-  /// structure.
-  ForStatementImpl.withParts(
-      Token awaitKeyword,
-      Token forKeyword,
-      Token leftParenthesis,
-      ForPartsImpl forLoopParts,
-      Token rightParenthesis,
-      Statement body)
-      : super(awaitKeyword, forKeyword, leftParenthesis, forLoopParts,
-            rightParenthesis, body);
-
-  @override
-  Expression get condition => (forLoopParts as ForParts).condition;
-
-  @override
-  void set condition(Expression expression) {
-    (forLoopParts as ForPartsImpl).condition = expression;
-  }
-
-  @override
-  Expression get initialization => forLoopParts is ForPartsWithExpression
-      ? (forLoopParts as ForPartsWithExpression).initialization
-      : null;
-
-  @override
-  void set initialization(Expression initialization) {
-    if (forLoopParts is ForPartsWithExpressionImpl) {
-      (forLoopParts as ForPartsWithExpressionImpl).initialization =
-          initialization;
-    }
-  }
-
-  @override
-  Token get leftSeparator => (forLoopParts as ForParts).leftSeparator;
-
-  @override
-  set leftSeparator(Token separator) =>
-      (forLoopParts as ForPartsImpl).leftSeparator = separator;
-
-  @override
-  Token get rightSeparator => (forLoopParts as ForParts).rightSeparator;
-
-  @override
-  set rightSeparator(Token separator) =>
-      (forLoopParts as ForPartsImpl).rightSeparator = separator;
-
-  @override
-  NodeList<Expression> get updaters => (forLoopParts as ForParts).updaters;
-
-  @override
-  VariableDeclarationList get variables =>
-      forLoopParts is ForPartsWithDeclarations
-          ? (forLoopParts as ForPartsWithDeclarations).variables
-          : null;
-
-  @override
-  void set variables(VariableDeclarationList variableList) {
-    (forLoopParts as ForPartsWithDeclarationsImpl).variables = variableList;
-  }
-
-  @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitForStatement(this);
-}
-
 /// A node representing the body of a function or method.
 ///
 ///    functionBody ::=
@@ -5080,13 +4885,8 @@
     _parameters = _becomeParentOf(parameters as FormalParameterListImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => SELECTOR_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.primary;
+  Precedence get precedence => Precedence.primary;
 
   @override
   TypeParameterList get typeParameters => _typeParameters;
@@ -5154,13 +4954,8 @@
     _function = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => POSTFIX_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.postfix;
+  Precedence get precedence => Precedence.postfix;
 
   @deprecated
   @override
@@ -5301,11 +5096,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);
@@ -5419,6 +5216,10 @@
   @override
   DartType type;
 
+  /// Return the element associated with the function type, or `null` if the
+  /// AST structure has not been resolved.
+  GenericFunctionTypeElement declaredElement;
+
   /// Initialize a newly created generic function type.
   GenericFunctionTypeImpl(TypeAnnotationImpl returnType, this.functionKeyword,
       TypeParameterListImpl typeParameters, FormalParameterListImpl parameters,
@@ -5878,6 +5679,7 @@
 
   @override
   Iterable<SyntacticEntity> get childEntities => super._childEntities
+    ..add(keyword)
     ..add(_uri)
     ..add(deferredKeyword)
     ..add(asKeyword)
@@ -6002,13 +5804,8 @@
   @override
   bool get isCascaded => period != null;
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => POSTFIX_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.postfix;
+  Precedence get precedence => Precedence.postfix;
 
   @deprecated
   @override
@@ -6178,13 +5975,8 @@
   /// Return `true` if this is an implicit constructor invocations.
   bool get isImplicit => keyword == null;
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => SELECTOR_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.primary;
+  Precedence get precedence => Precedence.primary;
 
   /// Return the type arguments associated with the constructor, rather than
   /// with the class in which the constructor is defined. It is always an error
@@ -6278,7 +6070,8 @@
       AnalysisContext context = library.context;
       ErrorReporter errorReporter = new ErrorReporter(listener, element.source);
       accept(new ConstantVerifier(errorReporter, library, context.typeProvider,
-          context.declaredVariables));
+          context.declaredVariables,
+          featureSet: FeatureSet.fromEnableFlags([])));
     } finally {
       keyword = oldKeyword;
     }
@@ -6611,13 +6404,8 @@
     _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => RELATIONAL_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.relational;
+  Precedence get precedence => Precedence.relational;
 
   @override
   TypeAnnotation get type => _type;
@@ -6843,13 +6631,8 @@
     return buffer.toString();
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => POSTFIX_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.postfix;
+  Precedence get precedence => Precedence.postfix;
 
   @deprecated
   @override
@@ -6867,72 +6650,6 @@
   }
 }
 
-/// A list literal.
-///
-///    listLiteral ::=
-///        'const'? ('<' [TypeAnnotation] '>')?
-///        '[' ([CollectionLiteralElement] ','?)? ']'
-///
-/// This is the class that is used to represent a list literal when either the
-/// 'control-flow-collections' or 'spread-collections' experiments are enabled.
-/// If neither of those experiments are enabled, then [ListLiteral] will be
-/// used.
-@Deprecated('Replaced by ListLiteralImpl')
-class ListLiteral2Impl extends TypedLiteralImpl implements ListLiteral2 {
-  @override
-  Token leftBracket;
-
-  /// The elements used to compute the elements of the list.
-  NodeList<CollectionElement> _elements;
-
-  @override
-  Token rightBracket;
-
-  /// Initialize a newly created list literal. The [constKeyword] can be `null`
-  /// if the literal is not a constant. The [typeArguments] can be `null` if no
-  /// type arguments were declared. The list of [elements] can be `null` if the
-  /// list is empty.
-  ListLiteral2Impl(Token constKeyword, TypeArgumentListImpl typeArguments,
-      this.leftBracket, List<CollectionElement> elements, this.rightBracket)
-      : super(constKeyword, typeArguments) {
-    _elements = new NodeListImpl<CollectionElement>(this, elements);
-  }
-
-  @override
-  Token get beginToken {
-    if (constKeyword != null) {
-      return constKeyword;
-    }
-    TypeArgumentList typeArguments = this.typeArguments;
-    if (typeArguments != null) {
-      return typeArguments.beginToken;
-    }
-    return leftBracket;
-  }
-
-  @override
-  // TODO(paulberry): add commas.
-  Iterable<SyntacticEntity> get childEntities => super._childEntities
-    ..add(leftBracket)
-    ..addAll(_elements)
-    ..add(rightBracket);
-
-  @override
-  NodeList<CollectionElement> get elements => _elements;
-
-  @override
-  Token get endToken => rightBracket;
-
-  @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitListLiteral2(this);
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-    super.visitChildren(visitor);
-    _elements.accept(visitor);
-  }
-}
-
 class ListLiteralImpl extends TypedLiteralImpl implements ListLiteral {
   /// The left square bracket.
   @override
@@ -6990,9 +6707,10 @@
     ..add(rightBracket);
 
   @override
-  NodeList<Expression> get elements => _elements;
+  NodeList<CollectionElement> get elements => _elements;
 
   @override
+  @Deprecated('Replaced by elements')
   NodeList<CollectionElement> get elements2 => _elements;
 
   @override
@@ -7019,13 +6737,8 @@
 ///      | [NullLiteral]
 ///      | [StringLiteral]
 abstract class LiteralImpl extends ExpressionImpl implements Literal {
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => SELECTOR_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.primary;
+  Precedence get precedence => Precedence.primary;
 }
 
 /// Additional information about local variables within a function or method
@@ -7043,32 +6756,6 @@
       new Set<VariableElement>();
 }
 
-/// A literal map.
-///
-///    mapLiteral ::=
-///        'const'? ('<' [TypeAnnotation] (',' [TypeAnnotation])* '>')?
-///        '{' ([MapElement] (',' [MapElement])* ','?)? '}'
-///
-/// This is the class that is used to represent a map literal when either the
-/// 'control-flow-collections' or 'spread-collections' experiments are enabled.
-/// If neither of those experiments are enabled, then [MapLiteral] will be used.
-@Deprecated('Replaced by SetOrMapLiteralImpl')
-class MapLiteral2Impl extends SetOrMapLiteralImpl implements MapLiteral2 {
-  /// Initialize a newly created map literal. The [constKeyword] can be `null`
-  /// if the literal is not a constant. The [typeArguments] can be `null` if no
-  /// type arguments were declared. The [entries] can be `null` if the map is
-  /// empty.
-  MapLiteral2Impl(Token constKeyword, TypeArgumentListImpl typeArguments,
-      Token leftBracket, List<CollectionElement> entries, Token rightBracket)
-      : super(constKeyword, typeArguments, leftBracket, entries, rightBracket);
-
-  @override
-  NodeList<CollectionElement> get entries => _elements;
-
-  @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitMapLiteral2(this);
-}
-
 /// A single key/value pair in a map literal.
 ///
 ///    mapLiteralEntry ::=
@@ -7128,24 +6815,6 @@
   }
 }
 
-@Deprecated('Use SetOrMapLiteral')
-class MapLiteralImpl extends SetOrMapLiteralImpl implements MapLiteral {
-  /// Initialize a newly created map literal. The [constKeyword] can be `null`
-  /// if the literal is not a constant. The [typeArguments] can be `null` if no
-  /// type arguments were declared. The [entries] can be `null` if the map is
-  /// empty.
-  MapLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
-      Token leftBracket, List<MapLiteralEntry> entries, Token rightBracket)
-      : super._map(
-            constKeyword, typeArguments, leftBracket, entries, rightBracket);
-
-  @override
-  NodeList<MapLiteralEntry> get entries => _elements;
-
-  @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitMapLiteral(this);
-}
-
 /// A method declaration.
 ///
 ///    methodDeclaration ::=
@@ -7434,13 +7103,8 @@
     _methodNameType = methodNameType;
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => POSTFIX_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.postfix;
+  Precedence get precedence => Precedence.postfix;
 
   @override
   Expression get realTarget {
@@ -7653,13 +7317,8 @@
     _name = _becomeParentOf(identifier as LabelImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => NO_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.none;
+  Precedence get precedence => Precedence.none;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitNamedExpression(this);
@@ -7999,14 +7658,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);
@@ -8210,13 +7876,8 @@
     _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => SELECTOR_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.primary;
+  Precedence get precedence => Precedence.primary;
 
   @override
   Expression get unParenthesized {
@@ -8410,13 +8071,8 @@
     _operand = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => POSTFIX_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.postfix;
+  Precedence get precedence => Precedence.postfix;
 
   @deprecated
   @override
@@ -8522,13 +8178,8 @@
   @override
   String get name => "${_prefix.name}.${_identifier.name}";
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => POSTFIX_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.postfix;
+  Precedence get precedence => Precedence.postfix;
 
   @override
   SimpleIdentifier get prefix => _prefix;
@@ -8603,13 +8254,8 @@
     _operand = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => PREFIX_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.prefix;
+  Precedence get precedence => Precedence.prefix;
 
   @deprecated
   @override
@@ -8690,13 +8336,8 @@
   bool get isCascaded =>
       operator != null && operator.type == TokenType.PERIOD_PERIOD;
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => POSTFIX_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.postfix;
+  Precedence get precedence => Precedence.postfix;
 
   @override
   SimpleIdentifier get propertyName => _propertyName;
@@ -8837,13 +8478,8 @@
   @override
   Token get endToken => rethrowKeyword;
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => ASSIGNMENT_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.assignment;
+  Precedence get precedence => Precedence.assignment;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitRethrowExpression(this);
@@ -8934,51 +8570,6 @@
   }
 }
 
-/// A literal set.
-///
-///    setLiteral ::=
-///        'const'? ('<' [TypeAnnotation] '>')?
-///        '{' [CollectionElement] (',' [Expression])* ','? '}'
-///      | 'const'? ('<' [TypeAnnotation] '>')? '{' '}'
-///
-/// This is the class that is used to represent a set literal when either the
-/// 'control-flow-collections' or 'spread-collections' experiments are enabled.
-/// If neither of those experiments are enabled, then [SetLiteral] will be used.
-@Deprecated('Replaced by SetOrMapLiteralImpl')
-class SetLiteral2Impl extends SetOrMapLiteralImpl implements SetLiteral2 {
-  /// Initialize a newly created set literal. The [constKeyword] can be `null`
-  /// if the literal is not a constant. The [typeArguments] can be `null` if no
-  /// type arguments were declared. The [elements] can be `null` if the set is
-  /// empty.
-  SetLiteral2Impl(Token constKeyword, TypeArgumentListImpl typeArguments,
-      Token leftBracket, List<CollectionElement> elements, Token rightBracket)
-      : super(constKeyword, typeArguments, leftBracket, elements, rightBracket);
-
-  @override
-  NodeList<CollectionElement> get elements => _elements;
-
-  @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitSetLiteral2(this);
-}
-
-@Deprecated('Use SetOrMapLiteralImpl')
-class SetLiteralImpl extends SetOrMapLiteralImpl implements SetLiteral {
-  /// Initialize a newly created set literal. The [constKeyword] can be `null`
-  /// if the literal is not a constant. The [typeArguments] can be `null` if no
-  /// type arguments were declared. The [elements] can be `null` if the set is
-  /// empty.
-  SetLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
-      Token leftBracket, List<Expression> elements, Token rightBracket)
-      : super._set(
-            constKeyword, typeArguments, leftBracket, elements, rightBracket);
-
-  @override
-  NodeList<Expression> get elements => _elements;
-
-  @override
-  E accept<E>(AstVisitor<E> visitor) => visitor.visitSetLiteral(this);
-}
-
 class SetOrMapLiteralImpl extends TypedLiteralImpl implements SetOrMapLiteral {
   @override
   Token leftBracket;
@@ -9017,30 +8608,6 @@
     _resolvedKind = _SetOrMapKind.unresolved;
   }
 
-  /// Temporary constructor to support MapLiteral2Impl.
-  SetOrMapLiteralImpl._map(
-      Token constKeyword,
-      TypeArgumentListImpl typeArguments,
-      this.leftBracket,
-      List<MapLiteralEntry> elements,
-      this.rightBracket)
-      : super(constKeyword, typeArguments) {
-    _elements = new NodeListImpl<MapLiteralEntry>(this, elements);
-    _resolvedKind = _SetOrMapKind.map;
-  }
-
-  /// Temporary constructor to support SetLiteral2Impl.
-  SetOrMapLiteralImpl._set(
-      Token constKeyword,
-      TypeArgumentListImpl typeArguments,
-      this.leftBracket,
-      List<Expression> elements,
-      this.rightBracket)
-      : super(constKeyword, typeArguments) {
-    _elements = new NodeListImpl<Expression>(this, elements);
-    _resolvedKind = _SetOrMapKind.set;
-  }
-
   @override
   Token get beginToken {
     if (constKeyword != null) {
@@ -9057,10 +8624,14 @@
   // TODO(paulberry): add commas.
   Iterable<SyntacticEntity> get childEntities => super._childEntities
     ..add(leftBracket)
-    ..addAll(elements2)
+    ..addAll(elements)
     ..add(rightBracket);
 
   @override
+  NodeList<CollectionElement> get elements => _elements;
+
+  @override
+  @Deprecated('Replaced by elements')
   NodeList<CollectionElement> get elements2 => _elements;
 
   @override
@@ -9159,10 +8730,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);
   }
 
@@ -9274,13 +8847,8 @@
   @override
   String get name => token.lexeme;
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => SELECTOR_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.primary;
+  Precedence get precedence => Precedence.primary;
 
   @deprecated
   @override
@@ -9344,12 +8912,6 @@
         return false;
       }
     }
-    // ignore: deprecated_member_use_from_same_package
-    if (parent is ForEachStatement) {
-      if (identical(parent.identifier, target)) {
-        return false;
-      }
-    }
     if (parent is FieldFormalParameter) {
       if (identical(parent.identifier, target)) {
         return false;
@@ -9393,9 +8955,6 @@
       return identical(parent.leftHandSide, target);
     } else if (parent is ForEachPartsWithIdentifier) {
       return identical(parent.identifier, target);
-      // ignore: deprecated_member_use_from_same_package
-    } else if (parent is ForEachStatement) {
-      return identical(parent.identifier, target);
     }
     return false;
   }
@@ -9842,13 +9401,8 @@
   @override
   Token get endToken => superKeyword;
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => SELECTOR_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.primary;
+  Precedence get precedence => Precedence.primary;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitSuperExpression(this);
@@ -10113,13 +9667,8 @@
   @override
   Token get endToken => thisKeyword;
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => SELECTOR_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.primary;
+  Precedence get precedence => Precedence.primary;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitThisExpression(this);
@@ -10169,13 +9718,8 @@
     _expression = _becomeParentOf(expression as ExpressionImpl);
   }
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => ASSIGNMENT_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.assignment;
+  Precedence get precedence => Precedence.assignment;
 
   @override
   E accept<E>(AstVisitor<E> visitor) => visitor.visitThrowExpression(this);
@@ -10857,6 +10401,12 @@
   }
 
   @override
+  bool get isLate {
+    AstNode parent = this.parent;
+    return parent is VariableDeclarationList && parent.isLate;
+  }
+
+  @override
   SimpleIdentifier get name => _name;
 
   @override
@@ -10882,16 +10432,20 @@
 ///        (',' [VariableDeclaration])*
 ///
 ///    finalConstVarOrType ::=
-///      | 'final' [TypeName]?
-///      | 'const' [TypeName]?
+///      'final' 'late'? [TypeAnnotation]?
+///      | 'const' [TypeAnnotation]?
 ///      | 'var'
-///      | [TypeName]
+///      | 'late'? [TypeAnnotation]
 class VariableDeclarationListImpl extends AnnotatedNodeImpl
     implements VariableDeclarationList {
   /// The token representing the 'final', 'const' or 'var' keyword, or `null` if
   /// no keyword was included.
   Token keyword;
 
+  /// The token representing the 'late' keyword, or `null` if the late modifier
+  /// was not included.
+  Token lateKeyword;
+
   /// The type of the variables being declared, or `null` if no type was
   /// provided.
   TypeAnnotationImpl _type;
@@ -10906,6 +10460,7 @@
   VariableDeclarationListImpl(
       CommentImpl comment,
       List<Annotation> metadata,
+      this.lateKeyword,
       this.keyword,
       TypeAnnotationImpl type,
       List<VariableDeclaration> variables)
@@ -10941,6 +10496,9 @@
   bool get isFinal => keyword?.keyword == Keyword.FINAL;
 
   @override
+  bool get isLate => lateKeyword != null;
+
+  @override
   TypeAnnotation get type => _type;
 
   @override
diff --git a/analyzer/lib/src/dart/ast/ast_factory.dart b/analyzer/lib/src/dart/ast/ast_factory.dart
index 3c4ba3e..95b5867 100644
--- a/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -1,7 +1,8 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
@@ -178,14 +179,27 @@
       new CommentReferenceImpl(newKeyword, identifier);
 
   @override
+  @deprecated
   CompilationUnit compilationUnit(
           Token beginToken,
           ScriptTag scriptTag,
           List<Directive> directives,
           List<CompilationUnitMember> declarations,
-          Token endToken) =>
-      new CompilationUnitImpl(
-          beginToken, scriptTag, directives, declarations, endToken);
+          Token endToken,
+          [FeatureSet featureSet]) =>
+      new CompilationUnitImpl(beginToken, scriptTag, directives, declarations,
+          endToken, featureSet);
+
+  @override
+  CompilationUnit compilationUnit2(
+          {Token beginToken,
+          ScriptTag scriptTag,
+          List<Directive> directives,
+          List<CompilationUnitMember> declarations,
+          Token endToken,
+          FeatureSet featureSet}) =>
+      new CompilationUnitImpl(beginToken, scriptTag, directives, declarations,
+          endToken, featureSet);
 
   @override
   ConditionalExpression conditionalExpression(
@@ -387,7 +401,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 +409,7 @@
           {Comment comment,
           List<Annotation> metadata,
           Token covariantKeyword,
+          Token requiredKeyword,
           Token keyword,
           TypeAnnotation type,
           @required Token thisKeyword,
@@ -402,8 +417,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(
@@ -461,27 +486,35 @@
           initialization, leftSeparator, condition, rightSeparator, updaters);
 
   @override
-  ForStatement2 forStatement2(
+  ForStatement forStatement(
       {Token awaitKeyword,
       Token forKeyword,
       Token leftParenthesis,
       ForLoopParts forLoopParts,
       Token rightParenthesis,
       Statement body}) {
-    if (forLoopParts is ForEachParts) {
-      // ignore: deprecated_member_use_from_same_package
-      return ForEachStatementImpl.withParts(awaitKeyword, forKeyword,
-          leftParenthesis, forLoopParts, rightParenthesis, body);
-    } else if (forLoopParts is ForParts) {
-      // ignore: deprecated_member_use_from_same_package
-      return ForStatementImpl.withParts(awaitKeyword, forKeyword,
-          leftParenthesis, forLoopParts, rightParenthesis, body);
-    } else {
-      throw new StateError('Unrecognized for loop parts');
-    }
+    return ForStatementImpl(awaitKeyword, forKeyword, leftParenthesis,
+        forLoopParts, rightParenthesis, body);
   }
 
   @override
+  @Deprecated('Replaced by forStatement')
+  ForStatement forStatement2(
+          {Token awaitKeyword,
+          Token forKeyword,
+          Token leftParenthesis,
+          ForLoopParts forLoopParts,
+          Token rightParenthesis,
+          Statement body}) =>
+      forStatement(
+          awaitKeyword: awaitKeyword,
+          forKeyword: forKeyword,
+          leftParenthesis: leftParenthesis,
+          forLoopParts: forLoopParts,
+          rightParenthesis: rightParenthesis,
+          body: body);
+
+  @override
   FunctionDeclaration functionDeclaration(
           Comment comment,
           List<Annotation> metadata,
@@ -530,20 +563,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(
@@ -693,39 +727,6 @@
         constKeyword, typeArguments, leftBracket, elements, rightBracket);
   }
 
-  @Deprecated('Use listLiteral')
-  @override
-  ListLiteral2 listLiteral2(
-          {Token constKeyword,
-          TypeArgumentList typeArguments,
-          Token leftBracket,
-          List<CollectionElement> elements,
-          Token rightBracket}) =>
-      new ListLiteral2Impl(
-          constKeyword, typeArguments, leftBracket, elements, rightBracket);
-
-  @override
-  @Deprecated('Use setOrMapLiteral')
-  MapLiteral mapLiteral(
-          Token constKeyword,
-          TypeArgumentList typeArguments,
-          Token leftBracket,
-          List<MapLiteralEntry> entries,
-          Token rightBracket) =>
-      new MapLiteralImpl(
-          constKeyword, typeArguments, leftBracket, entries, rightBracket);
-
-  @deprecated
-  @override
-  MapLiteral2 mapLiteral2(
-      {Token constKeyword,
-      TypeArgumentList typeArguments,
-      Token leftBracket,
-      List<CollectionElement> entries,
-      Token rightBracket}) {
-    throw new UnsupportedError('Not supported');
-  }
-
   @override
   MapLiteralEntry mapLiteralEntry(
           Expression key, Token separator, Expression value) =>
@@ -878,24 +879,6 @@
   ScriptTag scriptTag(Token scriptTag) => new ScriptTagImpl(scriptTag);
 
   @override
-  @Deprecated('Use setOrMapLiteral')
-  SetLiteral setLiteral(Token constKeyword, TypeArgumentList typeArguments,
-          Token leftBracket, List<Expression> elements, Token rightBracket) =>
-      new SetLiteralImpl(
-          constKeyword, typeArguments, leftBracket, elements, rightBracket);
-
-  @deprecated
-  @override
-  SetLiteral2 setLiteral2(
-      {Token constKeyword,
-      TypeArgumentList typeArguments,
-      Token leftBracket,
-      List<CollectionElement> elements,
-      Token rightBracket}) {
-    throw new UnsupportedError('Not supported');
-  }
-
-  @override
   SetOrMapLiteral setOrMapLiteral(
           {Token constKeyword,
           TypeArgumentList typeArguments,
@@ -918,18 +901,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}) {
@@ -1051,7 +1035,19 @@
           TypeAnnotation type,
           List<VariableDeclaration> variables) =>
       new VariableDeclarationListImpl(
-          comment, metadata, keyword, type, variables);
+          comment, metadata, null, keyword, type, variables);
+
+  @override
+  VariableDeclarationList variableDeclarationList2(
+      {Comment comment,
+      List<Annotation> metadata,
+      Token lateKeyword,
+      Token keyword,
+      TypeAnnotation type,
+      List<VariableDeclaration> variables}) {
+    return new VariableDeclarationListImpl(
+        comment, metadata, lateKeyword, keyword, type, variables);
+  }
 
   @override
   VariableDeclarationStatement variableDeclarationStatement(
diff --git a/analyzer/lib/src/dart/ast/constant_evaluator.dart b/analyzer/lib/src/dart/ast/constant_evaluator.dart
index a919a7f..430631f 100644
--- a/analyzer/lib/src/dart/ast/constant_evaluator.dart
+++ b/analyzer/lib/src/dart/ast/constant_evaluator.dart
@@ -261,7 +261,7 @@
   @override
   Object visitListLiteral(ListLiteral node) {
     List<Object> list = new List<Object>();
-    for (CollectionElement element in node.elements2) {
+    for (CollectionElement element in node.elements) {
       if (element is Expression) {
         Object value = element.accept(this);
         if (identical(value, NOT_A_CONSTANT)) {
@@ -278,22 +278,6 @@
   }
 
   @override
-  @deprecated
-  Object visitMapLiteral(MapLiteral node) {
-    Map<String, Object> map = new HashMap<String, Object>();
-    for (MapLiteralEntry entry in node.entries) {
-      Object key = entry.key.accept(this);
-      Object value = entry.value.accept(this);
-      if (key is String && !identical(value, NOT_A_CONSTANT)) {
-        map[key] = value;
-      } else {
-        return NOT_A_CONSTANT;
-      }
-    }
-    return map;
-  }
-
-  @override
   Object visitMethodInvocation(MethodInvocation node) => visitNode(node);
 
   @override
@@ -348,7 +332,7 @@
     // didn't add support for set literals. As a result, this assumes that we're
     // looking at a map literal until we prove otherwise.
     Map<String, Object> map = new HashMap<String, Object>();
-    for (CollectionElement element in node.elements2) {
+    for (CollectionElement element in node.elements) {
       if (element is MapLiteralEntry) {
         Object key = element.key.accept(this);
         Object value = element.value.accept(this);
diff --git a/analyzer/lib/src/dart/ast/resolution_map.dart b/analyzer/lib/src/dart/ast/resolution_map.dart
index 8d59a9e..3fa4ea4 100644
--- a/analyzer/lib/src/dart/ast/resolution_map.dart
+++ b/analyzer/lib/src/dart/ast/resolution_map.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/dart/ast/utilities.dart b/analyzer/lib/src/dart/ast/utilities.dart
index cb913fe..5ac34d1 100644
--- a/analyzer/lib/src/dart/ast/utilities.dart
+++ b/analyzer/lib/src/dart/ast/utilities.dart
@@ -285,12 +285,13 @@
 
   @override
   CompilationUnit visitCompilationUnit(CompilationUnit node) {
-    CompilationUnit clone = astFactory.compilationUnit(
-        cloneToken(node.beginToken),
-        cloneNode(node.scriptTag),
-        cloneNodeList(node.directives),
-        cloneNodeList(node.declarations),
-        cloneToken(node.endToken));
+    CompilationUnit clone = astFactory.compilationUnit2(
+        beginToken: cloneToken(node.beginToken),
+        scriptTag: cloneNode(node.scriptTag),
+        directives: cloneNodeList(node.directives),
+        declarations: cloneNodeList(node.declarations),
+        endToken: cloneToken(node.endToken),
+        featureSet: node.featureSet);
     clone.lineInfo = node.lineInfo;
     return clone;
   }
@@ -490,6 +491,7 @@
 
   @override
   ForElement visitForElement(ForElement node) => astFactory.forElement(
+      awaitKeyword: cloneToken(node.awaitKeyword),
       forKeyword: cloneToken(node.forKeyword),
       leftParenthesis: cloneToken(node.leftParenthesis),
       forLoopParts: cloneNode(node.forLoopParts),
@@ -526,14 +528,13 @@
           updaters: cloneNodeList(node.updaters));
 
   @override
-  ForStatement2 visitForStatement2(ForStatement2 node) =>
-      astFactory.forStatement2(
-          awaitKeyword: cloneToken(node.awaitKeyword),
-          forKeyword: cloneToken(node.forKeyword),
-          leftParenthesis: cloneToken(node.leftParenthesis),
-          forLoopParts: cloneNode(node.forLoopParts),
-          rightParenthesis: cloneToken(node.rightParenthesis),
-          body: cloneNode(node.body));
+  ForStatement visitForStatement(ForStatement node) => astFactory.forStatement(
+      awaitKeyword: cloneToken(node.awaitKeyword),
+      forKeyword: cloneToken(node.forKeyword),
+      leftParenthesis: cloneToken(node.leftParenthesis),
+      forLoopParts: cloneNode(node.forLoopParts),
+      rightParenthesis: cloneToken(node.rightParenthesis),
+      body: cloneNode(node.body));
 
   @override
   FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) =>
@@ -729,30 +730,9 @@
       cloneToken(node.constKeyword),
       cloneNode(node.typeArguments),
       cloneToken(node.leftBracket),
-      cloneNodeList(node.elements2),
+      cloneNodeList(node.elements),
       cloneToken(node.rightBracket));
 
-  @deprecated
-  @override
-  ListLiteral2 visitListLiteral2(ListLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
-  @override
-  @deprecated
-  MapLiteral visitMapLiteral(MapLiteral node) => astFactory.mapLiteral(
-      cloneToken(node.constKeyword),
-      cloneNode(node.typeArguments),
-      cloneToken(node.leftBracket),
-      cloneNodeList(node.entries),
-      cloneToken(node.rightBracket));
-
-  @deprecated
-  @override
-  MapLiteral2 visitMapLiteral2(MapLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
   @override
   MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) =>
       astFactory.mapLiteralEntry(cloneNode(node.key),
@@ -888,27 +868,12 @@
       astFactory.scriptTag(cloneToken(node.scriptTag));
 
   @override
-  @deprecated
-  SetLiteral visitSetLiteral(SetLiteral node) => astFactory.setLiteral(
-      cloneToken(node.constKeyword),
-      cloneNode(node.typeArguments),
-      cloneToken(node.leftBracket),
-      cloneNodeList(node.elements),
-      cloneToken(node.rightBracket));
-
-  @deprecated
-  @override
-  SetLiteral2 visitSetLiteral2(SetLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
-  @override
   SetOrMapLiteral visitSetOrMapLiteral(SetOrMapLiteral node) {
     var result = astFactory.setOrMapLiteral(
         constKeyword: cloneToken(node.constKeyword),
         typeArguments: cloneNode(node.typeArguments),
         leftBracket: cloneToken(node.leftBracket),
-        elements: cloneNodeList(node.elements2),
+        elements: cloneNodeList(node.elements),
         rightBracket: cloneToken(node.rightBracket));
     if (node.isMap) {
       (result as SetOrMapLiteralImpl).becomeMap();
@@ -1654,7 +1619,8 @@
   @override
   bool visitForElement(ForElement node) {
     ForElement other = _other as ForElement;
-    return isEqualTokens(node.forKeyword, other.forKeyword) &&
+    return isEqualTokens(node.awaitKeyword, other.awaitKeyword) &&
+        isEqualTokens(node.forKeyword, other.forKeyword) &&
         isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
         isEqualNodes(node.forLoopParts, other.forLoopParts) &&
         isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
@@ -1692,9 +1658,10 @@
   }
 
   @override
-  bool visitForStatement2(ForStatement2 node) {
-    ForStatement2 other = _other as ForStatement2;
+  bool visitForStatement(ForStatement node) {
+    ForStatement other = _other as ForStatement;
     return isEqualTokens(node.forKeyword, other.forKeyword) &&
+        isEqualTokens(node.awaitKeyword, other.awaitKeyword) &&
         isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
         isEqualNodes(node.forLoopParts, other.forLoopParts) &&
         isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
@@ -1921,22 +1888,10 @@
     return isEqualTokens(node.constKeyword, other.constKeyword) &&
         isEqualNodes(node.typeArguments, other.typeArguments) &&
         isEqualTokens(node.leftBracket, other.leftBracket) &&
-        _isEqualNodeLists(node.elements2, other.elements2) &&
+        _isEqualNodeLists(node.elements, other.elements) &&
         isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
-  @deprecated
-  @override
-  bool visitListLiteral2(ListLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
-  @deprecated
-  @override
-  bool visitMapLiteral2(MapLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
   @override
   bool visitMapLiteralEntry(MapLiteralEntry node) {
     MapLiteralEntry other = _other as MapLiteralEntry;
@@ -2114,19 +2069,13 @@
     return isEqualTokens(node.scriptTag, other.scriptTag);
   }
 
-  @deprecated
-  @override
-  bool visitSetLiteral2(SetLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
   @override
   bool visitSetOrMapLiteral(SetOrMapLiteral node) {
     SetOrMapLiteral other = _other as SetOrMapLiteral;
     return isEqualTokens(node.constKeyword, other.constKeyword) &&
         isEqualNodes(node.typeArguments, other.typeArguments) &&
         isEqualTokens(node.leftBracket, other.leftBracket) &&
-        _isEqualNodeLists(node.elements2, other.elements2) &&
+        _isEqualNodeLists(node.elements, other.elements) &&
         isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
@@ -2694,12 +2643,13 @@
 
   @override
   CompilationUnit visitCompilationUnit(CompilationUnit node) {
-    CompilationUnitImpl copy = astFactory.compilationUnit(
-        _mapToken(node.beginToken),
-        _cloneNode(node.scriptTag),
-        _cloneNodeList(node.directives),
-        _cloneNodeList(node.declarations),
-        _mapToken(node.endToken));
+    CompilationUnitImpl copy = astFactory.compilationUnit2(
+        beginToken: _mapToken(node.beginToken),
+        scriptTag: _cloneNode(node.scriptTag),
+        directives: _cloneNodeList(node.directives),
+        declarations: _cloneNodeList(node.declarations),
+        endToken: _mapToken(node.endToken),
+        featureSet: node.featureSet);
     copy.lineInfo = node.lineInfo;
     copy.declaredElement = node.declaredElement;
     return copy;
@@ -2908,6 +2858,7 @@
 
   @override
   ForElement visitForElement(ForElement node) => astFactory.forElement(
+      awaitKeyword: _mapToken(node.awaitKeyword),
       forKeyword: _mapToken(node.forKeyword),
       leftParenthesis: _mapToken(node.leftParenthesis),
       forLoopParts: _cloneNode(node.forLoopParts),
@@ -2944,13 +2895,13 @@
           updaters: _cloneNodeList(node.updaters));
 
   @override
-  ForStatement2 visitForStatement2(ForStatement2 node) =>
-      astFactory.forStatement2(
-          forKeyword: _mapToken(node.forKeyword),
-          leftParenthesis: _mapToken(node.leftParenthesis),
-          forLoopParts: _cloneNode(node.forLoopParts),
-          rightParenthesis: _mapToken(node.rightParenthesis),
-          body: _cloneNode(node.body));
+  ForStatement visitForStatement(ForStatement node) => astFactory.forStatement(
+      awaitKeyword: _mapToken(node.awaitKeyword),
+      forKeyword: _mapToken(node.forKeyword),
+      leftParenthesis: _mapToken(node.leftParenthesis),
+      forLoopParts: _cloneNode(node.forLoopParts),
+      rightParenthesis: _mapToken(node.rightParenthesis),
+      body: _cloneNode(node.body));
 
   @override
   FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) =>
@@ -3183,39 +3134,13 @@
         _mapToken(node.constKeyword),
         _cloneNode(node.typeArguments),
         _mapToken(node.leftBracket),
-        _cloneNodeList(node.elements2),
+        _cloneNodeList(node.elements),
         _mapToken(node.rightBracket));
     copy.staticType = node.staticType;
     return copy;
   }
 
   @override
-  ListLiteral2 visitListLiteral2(ListLiteral2 node) => astFactory.listLiteral2(
-      constKeyword: _mapToken(node.constKeyword),
-      typeArguments: _cloneNode(node.typeArguments),
-      leftBracket: _mapToken(node.leftBracket),
-      elements: _cloneNodeList(node.elements),
-      rightBracket: _mapToken(node.rightBracket));
-
-  @override
-  MapLiteral visitMapLiteral(MapLiteral node) {
-    MapLiteral copy = astFactory.mapLiteral(
-        _mapToken(node.constKeyword),
-        _cloneNode(node.typeArguments),
-        _mapToken(node.leftBracket),
-        _cloneNodeList(node.entries),
-        _mapToken(node.rightBracket));
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @deprecated
-  @override
-  MapLiteral2 visitMapLiteral2(MapLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
-  @override
   MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) =>
       astFactory.mapLiteralEntry(_cloneNode(node.key),
           _mapToken(node.separator), _cloneNode(node.value));
@@ -3393,30 +3318,12 @@
       astFactory.scriptTag(_mapToken(node.scriptTag));
 
   @override
-  SetLiteral visitSetLiteral(SetLiteral node) {
-    SetLiteral copy = astFactory.setLiteral(
-        _mapToken(node.constKeyword),
-        _cloneNode(node.typeArguments),
-        _mapToken(node.leftBracket),
-        _cloneNodeList(node.elements),
-        _mapToken(node.rightBracket));
-    copy.staticType = node.staticType;
-    return copy;
-  }
-
-  @deprecated
-  @override
-  SetLiteral2 visitSetLiteral2(SetLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
-  @override
   SetOrMapLiteral visitSetOrMapLiteral(SetOrMapLiteral node) {
     SetOrMapLiteral copy = astFactory.setOrMapLiteral(
         constKeyword: _mapToken(node.constKeyword),
         typeArguments: _cloneNode(node.typeArguments),
         leftBracket: _mapToken(node.leftBracket),
-        elements: _cloneNodeList(node.elements2),
+        elements: _cloneNodeList(node.elements),
         rightBracket: _mapToken(node.rightBracket));
     copy.staticType = node.staticType;
     return copy;
@@ -4423,12 +4330,12 @@
   }
 
   @override
-  bool visitForStatement2(ForStatement2 node) {
+  bool visitForStatement(ForStatement node) {
     if (identical(node.forLoopParts, _oldNode)) {
-      (node as ForStatement2Impl).forLoopParts = _newNode as ForLoopParts;
+      (node as ForStatementImpl).forLoopParts = _newNode as ForLoopParts;
       return true;
     } else if (identical(node.body, _oldNode)) {
-      (node as ForStatement2Impl).body = _newNode as Statement;
+      (node as ForStatementImpl).body = _newNode as Statement;
       return true;
     }
     return visitNode(node);
@@ -4689,24 +4596,12 @@
 
   @override
   bool visitListLiteral(ListLiteral node) {
-    if (_replaceInList(node.elements2)) {
+    if (_replaceInList(node.elements)) {
       return true;
     }
     return visitTypedLiteral(node);
   }
 
-  @deprecated
-  @override
-  bool visitListLiteral2(ListLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
-  @deprecated
-  @override
-  bool visitMapLiteral2(MapLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
   @override
   bool visitMapLiteralEntry(MapLiteralEntry node) {
     if (identical(node.key, _oldNode)) {
@@ -4935,15 +4830,9 @@
   @override
   bool visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
-  @deprecated
-  @override
-  bool visitSetLiteral2(SetLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
   @override
   bool visitSetOrMapLiteral(SetOrMapLiteral node) {
-    if (_replaceInList(node.elements2)) {
+    if (_replaceInList(node.elements)) {
       return true;
     }
     return visitTypedLiteral(node);
@@ -5740,24 +5629,10 @@
   }
 
   @override
-  @deprecated
-  bool visitForEachStatement(ForEachStatement node) {
-    ForEachStatement toNode = this._toNode as ForEachStatement;
-    return _and(
-        _isEqualTokens(node.forKeyword, toNode.forKeyword),
-        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
-        _isEqualNodes(node.loopVariable, toNode.loopVariable),
-        _isEqualNodes(node.identifier, toNode.identifier),
-        _isEqualTokens(node.inKeyword, toNode.inKeyword),
-        _isEqualNodes(node.iterable, toNode.iterable),
-        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
-        _isEqualNodes(node.body, toNode.body));
-  }
-
-  @override
   bool visitForElement(ForElement node) {
     ForElement toNode = this._toNode as ForElement;
     return _and(
+        _isEqualTokens(node.awaitKeyword, toNode.awaitKeyword),
         _isEqualTokens(node.forKeyword, toNode.forKeyword),
         _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
         _isEqualNodes(node.forLoopParts, toNode.forLoopParts),
@@ -5799,26 +5674,10 @@
   }
 
   @override
-  @deprecated
   bool visitForStatement(ForStatement node) {
     ForStatement toNode = this._toNode as ForStatement;
     return _and(
-        _isEqualTokens(node.forKeyword, toNode.forKeyword),
-        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
-        _isEqualNodes(node.variables, toNode.variables),
-        _isEqualNodes(node.initialization, toNode.initialization),
-        _isEqualTokens(node.leftSeparator, toNode.leftSeparator),
-        _isEqualNodes(node.condition, toNode.condition),
-        _isEqualTokens(node.rightSeparator, toNode.rightSeparator),
-        _isEqualNodeLists(node.updaters, toNode.updaters),
-        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
-        _isEqualNodes(node.body, toNode.body));
-  }
-
-  @override
-  bool visitForStatement2(ForStatement2 node) {
-    ForStatement2 toNode = this._toNode as ForStatement2;
-    return _and(
+        _isEqualTokens(node.awaitKeyword, toNode.awaitKeyword),
         _isEqualTokens(node.forKeyword, toNode.forKeyword),
         _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
         _isEqualNodes(node.forLoopParts, toNode.forLoopParts),
@@ -6109,7 +5968,7 @@
         _isEqualTokens(node.constKeyword, toNode.constKeyword),
         _isEqualNodes(node.typeArguments, toNode.typeArguments),
         _isEqualTokens(node.leftBracket, toNode.leftBracket),
-        _isEqualNodeLists(node.elements2, toNode.elements2),
+        _isEqualNodeLists(node.elements, toNode.elements),
         _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
       toNode.staticType = node.staticType;
       return true;
@@ -6117,34 +5976,6 @@
     return false;
   }
 
-  @deprecated
-  @override
-  bool visitListLiteral2(ListLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
-  @override
-  @deprecated
-  bool visitMapLiteral(MapLiteral node) {
-    MapLiteral toNode = this._toNode as MapLiteral;
-    if (_and(
-        _isEqualTokens(node.constKeyword, toNode.constKeyword),
-        _isEqualNodes(node.typeArguments, toNode.typeArguments),
-        _isEqualTokens(node.leftBracket, toNode.leftBracket),
-        _isEqualNodeLists(node.entries, toNode.entries),
-        _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
-      toNode.staticType = node.staticType;
-      return true;
-    }
-    return false;
-  }
-
-  @deprecated
-  @override
-  bool visitMapLiteral2(MapLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
   @override
   bool visitMapLiteralEntry(MapLiteralEntry node) {
     MapLiteralEntry toNode = this._toNode as MapLiteralEntry;
@@ -6384,35 +6215,13 @@
   }
 
   @override
-  @deprecated
-  bool visitSetLiteral(SetLiteral node) {
-    SetLiteral toNode = this._toNode as SetLiteral;
-    if (_and(
-        _isEqualTokens(node.constKeyword, toNode.constKeyword),
-        _isEqualNodes(node.typeArguments, toNode.typeArguments),
-        _isEqualTokens(node.leftBracket, toNode.leftBracket),
-        _isEqualNodeLists(node.elements, toNode.elements),
-        _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
-      toNode.staticType = node.staticType;
-      return true;
-    }
-    return false;
-  }
-
-  @deprecated
-  @override
-  bool visitSetLiteral2(SetLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
-  @override
   bool visitSetOrMapLiteral(SetOrMapLiteral node) {
     SetOrMapLiteral toNode = this._toNode as SetOrMapLiteral;
     if (_and(
         _isEqualTokens(node.constKeyword, toNode.constKeyword),
         _isEqualNodes(node.typeArguments, toNode.typeArguments),
         _isEqualTokens(node.leftBracket, toNode.leftBracket),
-        _isEqualNodeLists(node.elements2, toNode.elements2),
+        _isEqualNodeLists(node.elements, toNode.elements),
         _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
       toNode.staticType = node.staticType;
       return true;
@@ -6880,31 +6689,12 @@
   }
 
   @override
-  @deprecated
-  void visitForEachStatement(ForEachStatement node) {
-    DeclaredIdentifier loopVariable = node.loopVariable;
-    if (loopVariable != null) {
-      _addToScope(loopVariable.identifier);
-    }
-    super.visitForEachStatement(node);
-  }
-
-  @override
   void visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
     _addVariables(node.variables.variables);
     super.visitForPartsWithDeclarations(node);
   }
 
   @override
-  @deprecated
-  void visitForStatement(ForStatement node) {
-    if (!identical(_immediateChild, node.variables) && node.variables != null) {
-      _addVariables(node.variables.variables);
-    }
-    super.visitForStatement(node);
-  }
-
-  @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     if (node.parent is! FunctionDeclarationStatement) {
       _declarationNode = node;
@@ -7271,6 +7061,9 @@
 
   @override
   void visitDefaultFormalParameter(DefaultFormalParameter node) {
+    if (node.isRequiredNamed) {
+      _writer.print('required ');
+    }
     _visitNode(node.parameter);
     if (node.separator != null) {
       if (node.separator.lexeme != ":") {
@@ -7451,7 +7244,7 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement(ForStatement node) {
     if (node.awaitKeyword != null) {
       _writer.print('await ');
     }
@@ -7660,22 +7453,10 @@
     _visitTokenWithSuffix(node.constKeyword, ' ');
     _visitNode(node.typeArguments);
     _writer.print('[');
-    _visitNodeListWithSeparator(node.elements2, ', ');
+    _visitNodeListWithSeparator(node.elements, ', ');
     _writer.print(']');
   }
 
-  @deprecated
-  @override
-  void visitListLiteral2(ListLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
-  @deprecated
-  @override
-  void visitMapLiteral2(MapLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
   @override
   void visitMapLiteralEntry(MapLiteralEntry node) {
     _visitNode(node.key);
@@ -7840,12 +7621,6 @@
     _writer.print(node.scriptTag.lexeme);
   }
 
-  @deprecated
-  @override
-  void visitSetLiteral2(SetLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
   @override
   void visitSetOrMapLiteral(SetOrMapLiteral node) {
     if (node.constKeyword != null) {
@@ -7854,7 +7629,7 @@
     }
     _visitNode(node.typeArguments);
     _writer.print('{');
-    _visitNodeListWithSeparator(node.elements2, ', ');
+    _visitNodeListWithSeparator(node.elements, ', ');
     _writer.print('}');
   }
 
@@ -8010,6 +7785,7 @@
   @override
   void visitVariableDeclarationList(VariableDeclarationList node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.lateKeyword, " ");
     _visitTokenWithSuffix(node.keyword, " ");
     _visitNodeWithSuffix(node.type, " ");
     _visitNodeListWithSeparator(node.variables, ", ");
@@ -8223,7 +7999,12 @@
         if (i > 0) {
           sink.write(separator);
         }
-        nodes[i].accept(this);
+        var node = nodes[i];
+        if (node != null) {
+          node.accept(this);
+        } else {
+          sink.write('<null>');
+        }
       }
     }
   }
@@ -8545,6 +8326,9 @@
 
   @override
   void visitDefaultFormalParameter(DefaultFormalParameter node) {
+    if (node.isRequiredNamed) {
+      sink.write('required ');
+    }
     safelyVisitNode(node.parameter);
     if (node.separator != null) {
       if (node.separator.lexeme != ":") {
@@ -8725,7 +8509,7 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement(ForStatement node) {
     if (node.awaitKeyword != null) {
       sink.write('await ');
     }
@@ -8934,22 +8718,10 @@
     safelyVisitTokenWithSuffix(node.constKeyword, ' ');
     safelyVisitNode(node.typeArguments);
     sink.write('[');
-    safelyVisitNodeListWithSeparator(node.elements2, ', ');
+    safelyVisitNodeListWithSeparator(node.elements, ', ');
     sink.write(']');
   }
 
-  @deprecated
-  @override
-  void visitListLiteral2(ListLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
-  @deprecated
-  @override
-  void visitMapLiteral2(MapLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
   @override
   void visitMapLiteralEntry(MapLiteralEntry node) {
     safelyVisitNode(node.key);
@@ -9114,18 +8886,12 @@
     sink.write(node.scriptTag.lexeme);
   }
 
-  @deprecated
-  @override
-  void visitSetLiteral2(SetLiteral2 node) {
-    throw new UnsupportedError('Not supported');
-  }
-
   @override
   void visitSetOrMapLiteral(SetOrMapLiteral node) {
     safelyVisitTokenWithSuffix(node.constKeyword, ' ');
     safelyVisitNode(node.typeArguments);
     sink.write('{');
-    safelyVisitNodeListWithSeparator(node.elements2, ', ');
+    safelyVisitNodeListWithSeparator(node.elements, ', ');
     sink.write('}');
   }
 
@@ -9281,6 +9047,7 @@
   @override
   void visitVariableDeclarationList(VariableDeclarationList node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    safelyVisitTokenWithSuffix(node.lateKeyword, " ");
     safelyVisitTokenWithSuffix(node.keyword, " ");
     safelyVisitNodeWithSuffix(node.type, " ");
     safelyVisitNodeListWithSeparator(node.variables, ", ");
@@ -9319,7 +9086,7 @@
 
   void _writeOperand(Expression node, Expression operand) {
     if (operand != null) {
-      bool needsParenthesis = operand.precedence2 < node.precedence2;
+      bool needsParenthesis = operand.precedence < node.precedence;
       if (needsParenthesis) {
         sink.write('(');
       }
@@ -9331,44 +9098,12 @@
   }
 }
 
-/// Mixin allowing visitor classes to forward visit methods for AST structures
-/// that will be deleted as part of the implementation of the "UI as code"
-/// feature.
-///
-/// We will be removing the classes `ForEachStatement`, `ForStatement`,
-/// `MapLiteral`, and `SetLiteral` as part of implementing the "UI as code"
-/// feature.  In order to allow this change to be rolled out to clients in a
-/// staged fashion, we first update each visitor so that it forwards the old
-/// visit methods to their new counterparts; this will allow clients to begin
-/// rewriting their visitors in terms of the new data structures now.
-///
-/// This mixin exists so that we don't have to duplicate the forwarding logic in
-/// every concrete visitor class.
-///
-/// This class will be removed when the above classes (and their corresponding
-/// visit methods) are removed.
+/// Mixin allowing visitor classes to forward the visit method for
+/// `ForStatement2` to `ForStatement`
 mixin UIAsCodeVisitorMixin<R> implements AstVisitor<R> {
   @override
   @deprecated
-  R visitForEachStatement(ForEachStatement node) {
-    return visitForStatement2(node);
-  }
-
-  @override
-  @deprecated
-  R visitForStatement(ForStatement node) {
-    return visitForStatement2(node);
-  }
-
-  @override
-  @deprecated
-  R visitMapLiteral(MapLiteral node) {
-    return visitSetOrMapLiteral(node);
-  }
-
-  @override
-  @deprecated
-  R visitSetLiteral(SetLiteral node) {
-    return visitSetOrMapLiteral(node);
+  R visitForStatement2(ForStatement2 node) {
+    return visitForStatement(node);
   }
 }
diff --git a/analyzer/lib/src/dart/constant/constant_verifier.dart b/analyzer/lib/src/dart/constant/constant_verifier.dart
index e6281f5..55e3ef0 100644
--- a/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -13,6 +14,7 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
+import 'package:analyzer/src/dart/constant/potentially_constant.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -30,49 +32,54 @@
   /// The type provider used to access the known types.
   final TypeProvider _typeProvider;
 
-  /// The type system in use.
-  final TypeSystem _typeSystem;
-
   /// The set of variables declared using '-D' on the command line.
   final DeclaredVariables declaredVariables;
 
-  /// The type representing the type 'bool'.
-  InterfaceType _boolType;
-
   /// The type representing the type 'int'.
-  InterfaceType _intType;
-
-  /// The type representing the type 'num'.
-  InterfaceType _numType;
-
-  /// The type representing the type 'string'.
-  InterfaceType _stringType;
+  final InterfaceType _intType;
 
   /// The current library that is being analyzed.
   final LibraryElement _currentLibrary;
 
-  ConstantEvaluationEngine _evaluationEngine;
+  final bool _constantUpdate2018Enabled;
+
+  final ConstantEvaluationEngine _evaluationEngine;
 
   /// Initialize a newly created constant verifier.
   ///
   /// @param errorReporter the error reporter by which errors will be reported
-  ConstantVerifier(this._errorReporter, LibraryElement currentLibrary,
-      this._typeProvider, this.declaredVariables,
-      {bool forAnalysisDriver: false})
-      : _currentLibrary = currentLibrary,
-        _typeSystem = currentLibrary.context.typeSystem {
-    this._boolType = _typeProvider.boolType;
-    this._intType = _typeProvider.intType;
-    this._numType = _typeProvider.numType;
-    this._stringType = _typeProvider.stringType;
-    this._evaluationEngine = new ConstantEvaluationEngine(
-        _typeProvider, declaredVariables,
-        forAnalysisDriver: forAnalysisDriver,
-        typeSystem: _typeSystem,
-        experimentStatus:
-            (currentLibrary.context.analysisOptions as AnalysisOptionsImpl)
-                .experimentStatus);
-  }
+  ///
+  /// TODO(paulberry): make [featureSet] a required parameter.
+  ConstantVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary,
+      TypeProvider typeProvider, DeclaredVariables declaredVariables,
+      {bool forAnalysisDriver: false, FeatureSet featureSet})
+      : this._(
+            errorReporter,
+            currentLibrary,
+            typeProvider,
+            declaredVariables,
+            forAnalysisDriver,
+            currentLibrary.context.typeSystem,
+            featureSet ??
+                (currentLibrary.context.analysisOptions as AnalysisOptionsImpl)
+                    .contextFeatures);
+
+  ConstantVerifier._(
+      this._errorReporter,
+      this._currentLibrary,
+      this._typeProvider,
+      this.declaredVariables,
+      bool forAnalysisDriver,
+      TypeSystem typeSystem,
+      FeatureSet featureSet)
+      : _constantUpdate2018Enabled =
+            featureSet.isEnabled(Feature.constant_update_2018),
+        _intType = _typeProvider.intType,
+        _evaluationEngine = new ConstantEvaluationEngine(
+            _typeProvider, declaredVariables,
+            forAnalysisDriver: forAnalysisDriver,
+            typeSystem: typeSystem,
+            experimentStatus: featureSet);
 
   @override
   void visitAnnotation(Annotation node) {
@@ -146,12 +153,11 @@
       DartType elementType = nodeType.typeArguments[0];
       var verifier = _ConstLiteralVerifier(
         this,
-        isConst: true,
         errorCode: CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT,
         forList: true,
         listElementType: elementType,
       );
-      for (CollectionElement element in node.elements2) {
+      for (CollectionElement element in node.elements) {
         verifier.verify(element);
       }
     }
@@ -166,56 +172,55 @@
   @override
   void visitSetOrMapLiteral(SetOrMapLiteral node) {
     super.visitSetOrMapLiteral(node);
-    bool isConst = node.isConst;
     if (node.isSet) {
-      if (isConst) {
+      if (node.isConst) {
         InterfaceType nodeType = node.staticType;
         var elementType = nodeType.typeArguments[0];
         var duplicateElements = <Expression>[];
         var verifier = _ConstLiteralVerifier(
           this,
-          isConst: isConst,
           errorCode: CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT,
           forSet: true,
           setElementType: elementType,
           setUniqueValues: Set<DartObject>(),
-          setDuplicateElements: duplicateElements,
+          setDuplicateExpressions: duplicateElements,
         );
-        for (CollectionElement element in node.elements2) {
+        for (CollectionElement element in node.elements) {
           verifier.verify(element);
         }
         for (var duplicateElement in duplicateElements) {
           _errorReporter.reportErrorForNode(
-            StaticWarningCode.EQUAL_VALUES_IN_CONST_SET,
+            CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET,
             duplicateElement,
           );
         }
       }
     } else if (node.isMap) {
-      InterfaceType nodeType = node.staticType;
-      var keyType = nodeType.typeArguments[0];
-      var valueType = nodeType.typeArguments[1];
-      bool reportEqualKeys = true;
-      var duplicateKeyElements = <Expression>[];
-      var verifier = _ConstLiteralVerifier(
-        this,
-        isConst: isConst,
-        errorCode: CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT,
-        forMap: true,
-        mapKeyType: keyType,
-        mapValueType: valueType,
-        mapUniqueKeys: Set<DartObject>(),
-        mapDuplicateKeyElements: duplicateKeyElements,
-      );
-      for (CollectionElement entry in node.elements2) {
-        verifier.verify(entry);
-      }
-      if (reportEqualKeys) {
-        for (var duplicateKeyElement in duplicateKeyElements) {
-          _errorReporter.reportErrorForNode(
-            StaticWarningCode.EQUAL_KEYS_IN_MAP,
-            duplicateKeyElement,
-          );
+      if (node.isConst) {
+        InterfaceType nodeType = node.staticType;
+        var keyType = nodeType.typeArguments[0];
+        var valueType = nodeType.typeArguments[1];
+        bool reportEqualKeys = true;
+        var duplicateKeyElements = <Expression>[];
+        var verifier = _ConstLiteralVerifier(
+          this,
+          errorCode: CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT,
+          forMap: true,
+          mapKeyType: keyType,
+          mapValueType: valueType,
+          mapUniqueKeys: Set<DartObject>(),
+          mapDuplicateKeyExpressions: duplicateKeyElements,
+        );
+        for (CollectionElement entry in node.elements) {
+          verifier.verify(entry);
+        }
+        if (reportEqualKeys) {
+          for (var duplicateKeyElement in duplicateKeyElements) {
+            _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP,
+              duplicateKeyElement,
+            );
+          }
         }
       }
     }
@@ -416,6 +421,29 @@
     }
   }
 
+  void _reportNotPotentialConstants(AstNode node) {
+    var notPotentiallyConstants = getNotPotentiallyConstants(node);
+    if (notPotentiallyConstants.isEmpty) return;
+
+    for (var notConst in notPotentiallyConstants) {
+      _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.INVALID_CONSTANT,
+        notConst,
+      );
+    }
+  }
+
+  /// Validates that all arguments in the [argumentList] are potentially
+  /// constant expressions.
+  void _reportNotPotentialConstantsArguments(ArgumentList argumentList) {
+    if (argumentList == null) {
+      return;
+    }
+    for (Expression argument in argumentList.arguments) {
+      _reportNotPotentialConstants(argument);
+    }
+  }
+
   /// Validate that the given expression is a compile time constant. Return the
   /// value of the compile time constant, or `null` if the expression is not a
   /// compile time constant.
@@ -449,26 +477,20 @@
   /// Validates that the expressions of the initializers of the given constant
   /// [constructor] are all compile time constants.
   void _validateConstructorInitializers(ConstructorDeclaration constructor) {
-    List<ParameterElement> parameterElements =
-        constructor.parameters.parameterElements;
     NodeList<ConstructorInitializer> initializers = constructor.initializers;
     for (ConstructorInitializer initializer in initializers) {
       if (initializer is AssertInitializer) {
-        _validateInitializerExpression(
-            parameterElements, initializer.condition);
+        _reportNotPotentialConstants(initializer.condition);
         Expression message = initializer.message;
         if (message != null) {
-          _validateInitializerExpression(parameterElements, message);
+          _reportNotPotentialConstants(message);
         }
       } else if (initializer is ConstructorFieldInitializer) {
-        _validateInitializerExpression(
-            parameterElements, initializer.expression);
+        _reportNotPotentialConstants(initializer.expression);
       } else if (initializer is RedirectingConstructorInvocation) {
-        _validateInitializerInvocationArguments(
-            parameterElements, initializer.argumentList);
+        _reportNotPotentialConstantsArguments(initializer.argumentList);
       } else if (initializer is SuperConstructorInvocation) {
-        _validateInitializerInvocationArguments(
-            parameterElements, initializer.argumentList);
+        _reportNotPotentialConstantsArguments(initializer.argumentList);
       }
     }
   }
@@ -541,149 +563,61 @@
       }
     }
   }
-
-  /// Validates that the given expression is a compile time constant.
-  ///
-  /// @param parameterElements the elements of parameters of constant
-  ///        constructor, they are considered as a valid potentially constant
-  ///        expressions
-  /// @param expression the expression to validate
-  void _validateInitializerExpression(
-      List<ParameterElement> parameterElements, Expression expression) {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    ErrorReporter subErrorReporter =
-        new ErrorReporter(errorListener, _errorReporter.source);
-    DartObjectImpl result = expression.accept(
-        new _ConstantVerifier_validateInitializerExpression(_typeSystem,
-            _evaluationEngine, subErrorReporter, this, parameterElements));
-    _reportErrors(errorListener.errors,
-        CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
-    if (result != null) {
-      _reportErrorIfFromDeferredLibrary(
-          expression,
-          CompileTimeErrorCode
-              .NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY);
-    }
-  }
-
-  /// Validates that all of the arguments of a constructor initializer are
-  /// compile time constants.
-  ///
-  /// @param parameterElements the elements of parameters of constant
-  ///        constructor, they are considered as a valid potentially constant
-  ///        expressions
-  /// @param argumentList the argument list to validate
-  void _validateInitializerInvocationArguments(
-      List<ParameterElement> parameterElements, ArgumentList argumentList) {
-    if (argumentList == null) {
-      return;
-    }
-    for (Expression argument in argumentList.arguments) {
-      _validateInitializerExpression(parameterElements, argument);
-    }
-  }
-}
-
-class _ConstantVerifier_validateInitializerExpression extends ConstantVisitor {
-  final TypeSystem typeSystem;
-  final ConstantVerifier verifier;
-
-  List<ParameterElement> parameterElements;
-
-  _ConstantVerifier_validateInitializerExpression(
-      this.typeSystem,
-      ConstantEvaluationEngine evaluationEngine,
-      ErrorReporter errorReporter,
-      this.verifier,
-      this.parameterElements)
-      : super(evaluationEngine, errorReporter);
-
-  @override
-  DartObjectImpl visitSimpleIdentifier(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    int length = parameterElements.length;
-    for (int i = 0; i < length; i++) {
-      ParameterElement parameterElement = parameterElements[i];
-      if (identical(parameterElement, element) && parameterElement != null) {
-        DartType type = parameterElement.type;
-        if (type != null) {
-          if (type.isDynamic) {
-            return new DartObjectImpl(
-                verifier._typeProvider.objectType, DynamicState.DYNAMIC_STATE);
-          } else if (typeSystem.isSubtypeOf(type, verifier._boolType)) {
-            return new DartObjectImpl(
-                verifier._typeProvider.boolType, BoolState.UNKNOWN_VALUE);
-          } else if (typeSystem.isSubtypeOf(
-              type, verifier._typeProvider.doubleType)) {
-            return new DartObjectImpl(
-                verifier._typeProvider.doubleType, DoubleState.UNKNOWN_VALUE);
-          } else if (typeSystem.isSubtypeOf(type, verifier._intType)) {
-            return new DartObjectImpl(
-                verifier._typeProvider.intType, IntState.UNKNOWN_VALUE);
-          } else if (typeSystem.isSubtypeOf(type, verifier._numType)) {
-            return new DartObjectImpl(
-                verifier._typeProvider.numType, NumState.UNKNOWN_VALUE);
-          } else if (typeSystem.isSubtypeOf(type, verifier._stringType)) {
-            return new DartObjectImpl(
-                verifier._typeProvider.stringType, StringState.UNKNOWN_VALUE);
-          }
-          //
-          // We don't test for other types of objects (such as List, Map,
-          // Function or Type) because there are no operations allowed on such
-          // types other than '==' and '!=', which means that we don't need to
-          // know the type when there is no specific data about the state of
-          // such objects.
-          //
-        }
-        return new DartObjectImpl(
-            type is InterfaceType ? type : verifier._typeProvider.objectType,
-            GenericState.UNKNOWN_VALUE);
-      }
-    }
-    return super.visitSimpleIdentifier(node);
-  }
 }
 
 class _ConstLiteralVerifier {
   final ConstantVerifier verifier;
-  final bool isConst;
   final Set<DartObject> mapUniqueKeys;
-  final List<Expression> mapDuplicateKeyElements;
+  final List<Expression> mapDuplicateKeyExpressions;
   final ErrorCode errorCode;
   final DartType listElementType;
   final DartType mapKeyType;
   final DartType mapValueType;
   final DartType setElementType;
   final Set<DartObject> setUniqueValues;
-  final List<CollectionElement> setDuplicateElements;
+  final List<CollectionElement> setDuplicateExpressions;
   final bool forList;
   final bool forMap;
   final bool forSet;
 
   _ConstLiteralVerifier(
     this.verifier, {
-    this.isConst,
     this.mapUniqueKeys,
-    this.mapDuplicateKeyElements,
+    this.mapDuplicateKeyExpressions,
     this.errorCode,
     this.listElementType,
     this.mapKeyType,
     this.mapValueType,
     this.setElementType,
     this.setUniqueValues,
-    this.setDuplicateElements,
+    this.setDuplicateExpressions,
     this.forList = false,
     this.forMap = false,
     this.forSet = false,
   });
 
+  ErrorCode get _fromDeferredErrorCode {
+    if (forList) {
+      return CompileTimeErrorCode
+          .NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY;
+    } else if (forSet) {
+      return CompileTimeErrorCode
+          .NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY;
+    }
+
+    return null;
+  }
+
   bool verify(CollectionElement element) {
     if (element is Expression) {
-      if (!isConst) return true;
-
       var value = verifier._validate(element, errorCode);
       if (value == null) return false;
 
+      if (_fromDeferredErrorCode != null) {
+        verifier._reportErrorIfFromDeferredLibrary(
+            element, _fromDeferredErrorCode);
+      }
+
       if (forList) {
         return _validateListExpression(element, value);
       }
@@ -694,36 +628,54 @@
 
       return true;
     } else if (element is ForElement) {
-      if (!isConst) return true;
-
       verifier._errorReporter.reportErrorForNode(errorCode, element);
       return false;
     } else if (element is IfElement) {
-      if (!isConst) return true;
-
+      if (!verifier._constantUpdate2018Enabled) {
+        verifier._errorReporter.reportErrorForNode(errorCode, element);
+        return false;
+      }
       var conditionValue = verifier._validate(element.condition, errorCode);
       var conditionBool = conditionValue?.toBoolValue();
 
       // The errors have already been reported.
       if (conditionBool == null) return false;
 
-      var thenValid = !conditionBool || verify(element.thenElement);
+      verifier._reportErrorIfFromDeferredLibrary(
+          element.condition,
+          CompileTimeErrorCode
+              .NON_CONSTANT_IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY);
 
-      var elseValid = conditionBool ||
-          element.elseElement == null ||
-          verify(element.elseElement);
-
-      // TODO(scheglov) Check that not taken branches are constants
+      var thenValid = true;
+      var elseValid = true;
+      if (conditionBool) {
+        thenValid = verify(element.thenElement);
+        if (element.elseElement != null) {
+          elseValid = _reportNotPotentialConstants(element.elseElement);
+        }
+      } else {
+        thenValid = _reportNotPotentialConstants(element.thenElement);
+        if (element.elseElement != null) {
+          elseValid = verify(element.elseElement);
+        }
+      }
 
       return thenValid && elseValid;
     } else if (element is MapLiteralEntry) {
       return _validateMapLiteralEntry(element);
     } else if (element is SpreadElement) {
-      if (!isConst) return true;
-
+      if (!verifier._constantUpdate2018Enabled) {
+        verifier._errorReporter.reportErrorForNode(errorCode, element);
+        return false;
+      }
       var value = verifier._validate(element.expression, errorCode);
       if (value == null) return false;
 
+      verifier._reportErrorIfFromDeferredLibrary(
+          element.expression,
+          CompileTimeErrorCode
+              .NON_CONSTANT_SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY);
+
       if (forList || forSet) {
         return _validateListOrSetSpread(element, value);
       }
@@ -739,6 +691,36 @@
     );
   }
 
+  /// Return `true` if the [node] is a potential constant.
+  bool _reportNotPotentialConstants(AstNode node) {
+    var notPotentiallyConstants = getNotPotentiallyConstants(node);
+    if (notPotentiallyConstants.isEmpty) return true;
+
+    for (var notConst in notPotentiallyConstants) {
+      CompileTimeErrorCode errorCode;
+      if (forList) {
+        errorCode = CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT;
+      } else if (forMap) {
+        errorCode = CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT;
+        for (var parent = notConst; parent != null; parent = parent.parent) {
+          if (parent is MapLiteralEntry) {
+            if (parent.key == notConst) {
+              errorCode = CompileTimeErrorCode.NON_CONSTANT_MAP_KEY;
+            } else {
+              errorCode = CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE;
+            }
+            break;
+          }
+        }
+      } else if (forSet) {
+        errorCode = CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT;
+      }
+      verifier._errorReporter.reportErrorForNode(errorCode, notConst);
+    }
+
+    return false;
+  }
+
   bool _validateListExpression(Expression expression, DartObjectImpl value) {
     if (!verifier._evaluationEngine.runtimeTypeMatch(value, listElementType)) {
       verifier._errorReporter.reportErrorForNode(
@@ -784,6 +766,15 @@
       }
     }
 
+    if (forSet) {
+      var iterableValue = listValue ?? setValue;
+      for (var item in iterableValue) {
+        if (!setUniqueValues.add(item)) {
+          setDuplicateExpressions.add(element.expression);
+        }
+      }
+    }
+
     return true;
   }
 
@@ -793,95 +784,87 @@
     var keyExpression = entry.key;
     var valueExpression = entry.value;
 
-    if (isConst) {
-      var keyValue = verifier._validate(
-        keyExpression,
-        CompileTimeErrorCode.NON_CONSTANT_MAP_KEY,
-      );
+    var keyValue = verifier._validate(
+      keyExpression,
+      CompileTimeErrorCode.NON_CONSTANT_MAP_KEY,
+    );
+    var valueValue = verifier._validate(
+      valueExpression,
+      CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE,
+    );
 
-      var valueValue = verifier._validate(
-        valueExpression,
-        CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE,
-      );
+    if (keyValue != null) {
+      var keyType = keyValue.type;
 
-      if (keyValue != null) {
-        var keyType = keyValue.type;
-
-        if (!verifier._evaluationEngine
-            .runtimeTypeMatch(keyValue, mapKeyType)) {
-          verifier._errorReporter.reportErrorForNode(
-            StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
-            keyExpression,
-            [keyType, mapKeyType],
-          );
-        }
-
-        if (verifier._implementsEqualsWhenNotAllowed(keyType)) {
-          verifier._errorReporter.reportErrorForNode(
-            CompileTimeErrorCode
-                .CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
-            keyExpression,
-            [keyType],
-          );
-        }
-
-        verifier._reportErrorIfFromDeferredLibrary(
+      if (!verifier._evaluationEngine.runtimeTypeMatch(keyValue, mapKeyType)) {
+        verifier._errorReporter.reportErrorForNode(
+          StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
           keyExpression,
-          CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY,
-        );
-
-        if (!mapUniqueKeys.add(keyValue)) {
-          mapDuplicateKeyElements.add(keyExpression);
-        }
-      }
-
-      if (valueValue != null) {
-        if (!verifier._evaluationEngine
-            .runtimeTypeMatch(valueValue, mapValueType)) {
-          verifier._errorReporter.reportErrorForNode(
-            StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
-            valueExpression,
-            [valueValue.type, mapValueType],
-          );
-        }
-
-        verifier._reportErrorIfFromDeferredLibrary(
-          valueExpression,
-          CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
+          [keyType, mapKeyType],
         );
       }
-    } else {
-      // Note: we throw the errors away because this isn't actually a const.
-      var nullErrorReporter = new ErrorReporter(
-        AnalysisErrorListener.NULL_LISTENER,
-        verifier._errorReporter.source,
-      );
-      var keyValue = keyExpression.accept(
-        new ConstantVisitor(verifier._evaluationEngine, nullErrorReporter),
-      );
 
-      if (keyValue != null) {
-        if (!mapUniqueKeys.add(keyValue)) {
-          mapDuplicateKeyElements.add(keyExpression);
-        }
+      if (verifier._implementsEqualsWhenNotAllowed(keyType)) {
+        verifier._errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
+          keyExpression,
+          [keyType],
+        );
       }
 
-      return true;
+      verifier._reportErrorIfFromDeferredLibrary(
+        keyExpression,
+        CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY,
+      );
+
+      if (!mapUniqueKeys.add(keyValue)) {
+        mapDuplicateKeyExpressions.add(keyExpression);
+      }
     }
+
+    if (valueValue != null) {
+      if (!verifier._evaluationEngine
+          .runtimeTypeMatch(valueValue, mapValueType)) {
+        verifier._errorReporter.reportErrorForNode(
+          StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
+          valueExpression,
+          [valueValue.type, mapValueType],
+        );
+      }
+
+      verifier._reportErrorIfFromDeferredLibrary(
+        valueExpression,
+        CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
+      );
+    }
+
     return true;
   }
 
   bool _validateMapSpread(SpreadElement element, DartObjectImpl value) {
-    if (value.toMapValue() != null ||
-        value.isNull && _isNullableSpread(element)) {
+    if (value.isNull && _isNullableSpread(element)) {
       return true;
     }
-
+    Map<DartObject, DartObject> map = value.toMapValue();
+    if (map != null) {
+      // TODO(brianwilkerson) Figure out how to improve the error messages. They
+      //  currently point to the whole spread expression, but the key and/or
+      //  value being referenced might not be located there (if it's referenced
+      //  through a const variable).
+      for (var entry in map.entries) {
+        DartObjectImpl keyValue = entry.key;
+        if (keyValue != null) {
+          if (!mapUniqueKeys.add(keyValue)) {
+            mapDuplicateKeyExpressions.add(element.expression);
+          }
+        }
+      }
+      return true;
+    }
     verifier._errorReporter.reportErrorForNode(
       CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP,
       element.expression,
     );
-
     return false;
   }
 
@@ -910,7 +893,7 @@
     );
 
     if (!setUniqueValues.add(value)) {
-      setDuplicateElements.add(expression);
+      setDuplicateExpressions.add(expression);
     }
 
     return true;
diff --git a/analyzer/lib/src/dart/constant/evaluation.dart b/analyzer/lib/src/dart/constant/evaluation.dart
index cc56403..6633be9 100644
--- a/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/analyzer/lib/src/dart/constant/evaluation.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/constant/potentially_constant.dart';
 import 'package:analyzer/src/dart/constant/utilities.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -901,9 +902,6 @@
     if (obj.isNull) {
       return true;
     }
-    if (type.isUndefined) {
-      return false;
-    }
     var objType = obj.type;
     if (objType.isDartCoreInt && type.isDartCoreDouble) {
       // Work around dartbug.com/35993 by allowing `int` to be used in a place
@@ -918,6 +916,10 @@
       // fixed.
       return true;
     }
+    // TODO(scheglov ) Switch to using this, but not now, dartbug.com/33441
+    if (typeSystem.isSubtypeOf(objType, type)) {
+      return true;
+    }
     return objType.isSubtypeOf(type);
   }
 
@@ -1010,58 +1012,7 @@
 
 /**
  * A visitor used to evaluate constant expressions to produce their compile-time
- * value. According to the Dart Language Specification: <blockquote> A constant
- * expression is one of the following:
- *
- * * A literal number.
- * * A literal boolean.
- * * A literal string where any interpolated expression is a compile-time
- *   constant that evaluates to a numeric, string or boolean value or to
- *   <b>null</b>.
- * * A literal symbol.
- * * <b>null</b>.
- * * A qualified reference to a static constant variable.
- * * An identifier expression that denotes a constant variable, class or type
- *   alias.
- * * A constant constructor invocation.
- * * A constant list literal.
- * * A constant map literal.
- * * A simple or qualified identifier denoting a top-level function or a static
- *   method.
- * * A parenthesized expression <i>(e)</i> where <i>e</i> is a constant
- *   expression.
- * * An expression of the form <i>identical(e<sub>1</sub>, e<sub>2</sub>)</i>
- *   where <i>e<sub>1</sub></i> and <i>e<sub>2</sub></i> are constant
- *   expressions and <i>identical()</i> is statically bound to the predefined
- *   dart function <i>identical()</i> discussed above.
- * * An expression of one of the forms <i>e<sub>1</sub> == e<sub>2</sub></i> or
- *   <i>e<sub>1</sub> != e<sub>2</sub></i> where <i>e<sub>1</sub></i> and
- *   <i>e<sub>2</sub></i> are constant expressions that evaluate to a numeric,
- *   string or boolean value.
- * * An expression of one of the forms <i>!e</i>, <i>e<sub>1</sub> &amp;&amp;
- *   e<sub>2</sub></i> or <i>e<sub>1</sub> || e<sub>2</sub></i>, where <i>e</i>,
- *   <i>e1</sub></i> and <i>e2</sub></i> are constant expressions that evaluate
- *   to a boolean value.
- * * An expression of one of the forms <i>~e</i>, <i>e<sub>1</sub> ^
- *   e<sub>2</sub></i>, <i>e<sub>1</sub> &amp; e<sub>2</sub></i>,
- *   <i>e<sub>1</sub> | e<sub>2</sub></i>, <i>e<sub>1</sub> &gt;&gt;
- *   e<sub>2</sub></i> or <i>e<sub>1</sub> &lt;&lt; e<sub>2</sub></i>, where
- *   <i>e</i>, <i>e<sub>1</sub></i> and <i>e<sub>2</sub></i> are constant
- *   expressions that evaluate to an integer value or to <b>null</b>.
- * * An expression of one of the forms <i>-e</i>, <i>e<sub>1</sub> +
- *   e<sub>2</sub></i>, <i>e<sub>1</sub> - e<sub>2</sub></i>, <i>e<sub>1</sub> *
- *   e<sub>2</sub></i>, <i>e<sub>1</sub> / e<sub>2</sub></i>, <i>e<sub>1</sub>
- *   ~/ e<sub>2</sub></i>, <i>e<sub>1</sub> &gt; e<sub>2</sub></i>,
- *   <i>e<sub>1</sub> &lt; e<sub>2</sub></i>, <i>e<sub>1</sub> &gt;=
- *   e<sub>2</sub></i>, <i>e<sub>1</sub> &lt;= e<sub>2</sub></i> or
- *   <i>e<sub>1</sub> % e<sub>2</sub></i>, where <i>e</i>, <i>e<sub>1</sub></i>
- *   and <i>e<sub>2</sub></i> are constant expressions that evaluate to a
- *   numeric value or to <b>null</b>.
- * * An expression of the form <i>e<sub>1</sub> ? e<sub>2</sub> :
- *   e<sub>3</sub></i> where <i>e<sub>1</sub></i>, <i>e<sub>2</sub></i> and
- *   <i>e<sub>3</sub></i> are constant expressions, and <i>e<sub>1</sub></i>
- *   evaluates to a boolean value.
- * </blockquote>
+ * value.
  */
 class ConstantVisitor extends UnifyingAstVisitor<DartObjectImpl> {
   /**
@@ -1206,6 +1157,10 @@
       return _dartObjectComputer.eagerXor(
           node, leftResult, rightResult, experimentStatus.constant_update_2018);
     } else if (operatorType == TokenType.EQ_EQ) {
+      if (experimentStatus.constant_update_2018) {
+        return _dartObjectComputer.lazyEqualEqual(
+            node, leftResult, rightResult);
+      }
       return _dartObjectComputer.equalEqual(node, leftResult, rightResult);
     } else if (operatorType == TokenType.GT) {
       return _dartObjectComputer.greaterThan(node, leftResult, rightResult);
@@ -1264,8 +1219,10 @@
         return conditionResult;
       }
       if (conditionResult.toBoolValue() == true) {
+        _reportNotPotentialConstants(node.elseExpression);
         return node.thenExpression.accept(this);
       } else if (conditionResult.toBoolValue() == false) {
+        _reportNotPotentialConstants(node.thenExpression);
         return node.elseExpression.accept(this);
       }
       // We used to return an object with a known type and an unknown value, but
@@ -1370,7 +1327,7 @@
     }
     bool errorOccurred = false;
     List<DartObjectImpl> list = [];
-    for (CollectionElement element in node.elements2) {
+    for (CollectionElement element in node.elements) {
       errorOccurred = errorOccurred | _addElementsToList(list, element);
     }
     if (errorOccurred) {
@@ -1499,7 +1456,7 @@
       }
       bool errorOccurred = false;
       Map<DartObjectImpl, DartObjectImpl> map = {};
-      for (CollectionElement element in node.elements2) {
+      for (CollectionElement element in node.elements) {
         errorOccurred = errorOccurred | _addElementsToMap(map, element);
       }
       if (errorOccurred) {
@@ -1526,7 +1483,7 @@
       }
       bool errorOccurred = false;
       Set<DartObjectImpl> set = new Set<DartObjectImpl>();
-      for (CollectionElement element in node.elements2) {
+      for (CollectionElement element in node.elements) {
         errorOccurred = errorOccurred | _addElementsToSet(set, element);
       }
       if (errorOccurred) {
@@ -1603,8 +1560,7 @@
    */
   bool _addElementsToList(List<DartObject> list, CollectionElement element) {
     if (element is IfElement) {
-      DartObjectImpl conditionResult = element.condition.accept(this);
-      bool conditionValue = conditionResult?.toBoolValue();
+      bool conditionValue = _evaluateCondition(element.condition);
       if (conditionValue == null) {
         return true;
       } else if (conditionValue) {
@@ -1641,8 +1597,7 @@
   bool _addElementsToMap(
       Map<DartObjectImpl, DartObjectImpl> map, CollectionElement element) {
     if (element is IfElement) {
-      DartObjectImpl conditionResult = element.condition.accept(this);
-      bool conditionValue = conditionResult?.toBoolValue();
+      bool conditionValue = _evaluateCondition(element.condition);
       if (conditionValue == null) {
         return true;
       } else if (conditionValue) {
@@ -1679,8 +1634,7 @@
    */
   bool _addElementsToSet(Set<DartObject> set, CollectionElement element) {
     if (element is IfElement) {
-      DartObjectImpl conditionResult = element.condition.accept(this);
-      bool conditionValue = conditionResult?.toBoolValue();
+      bool conditionValue = _evaluateCondition(element.condition);
       if (conditionValue == null) {
         return true;
       } else if (conditionValue) {
@@ -1730,6 +1684,27 @@
   }
 
   /**
+   * Evaluate the given [condition] with the assumption that it must be a
+   * `bool`.
+   */
+  bool _evaluateCondition(Expression condition) {
+    DartObjectImpl conditionResult = condition.accept(this);
+    bool conditionValue = conditionResult?.toBoolValue();
+    if (conditionValue == null) {
+      // TODO(brianwilkerson) Figure out why the static type is sometimes null.
+      DartType staticType = condition.staticType;
+      if (staticType == null ||
+          typeSystem.isAssignableTo(staticType, _typeProvider.boolType)) {
+        // If the static type is not assignable, then we will have already
+        // reported this error.
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, condition);
+      }
+    }
+    return conditionValue;
+  }
+
+  /**
    * Return the constant value of the static constant represented by the given
    * [element]. The [node] is the node to be used if an error needs to be
    * reported.
@@ -1790,6 +1765,18 @@
     return identifier.name == 'length';
   }
 
+  void _reportNotPotentialConstants(AstNode node) {
+    var notPotentiallyConstants = getNotPotentiallyConstants(node);
+    if (notPotentiallyConstants.isEmpty) return;
+
+    for (var notConst in notPotentiallyConstants) {
+      _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.INVALID_CONSTANT,
+        notConst,
+      );
+    }
+  }
+
   /**
    * Return the value of the given [expression], or a representation of 'null'
    * if the expression cannot be evaluated.
@@ -2026,6 +2013,18 @@
     return null;
   }
 
+  DartObjectImpl lazyEqualEqual(Expression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.lazyEqualEqual(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
   DartObjectImpl lazyOr(BinaryExpression node, DartObjectImpl leftOperand,
       DartObjectImpl rightOperandComputer()) {
     if (leftOperand != null) {
diff --git a/analyzer/lib/src/dart/constant/potentially_constant.dart b/analyzer/lib/src/dart/constant/potentially_constant.dart
new file mode 100644
index 0000000..65e2023
--- /dev/null
+++ b/analyzer/lib/src/dart/constant/potentially_constant.dart
@@ -0,0 +1,366 @@
+// 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/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+
+/// Some [ConstructorElement]s can be temporary marked as "const" to check
+/// if doing this is valid.
+final temporaryConstConstructorElements = new Expando<bool>();
+
+/// Check if the [node] and all its sub-nodes are potentially constant.
+///
+/// Return the list of nodes that are not potentially constant.
+List<AstNode> getNotPotentiallyConstants(AstNode node) {
+  var collector = _Collector();
+  collector.collect(node);
+  return collector.nodes;
+}
+
+/// Return `true` if the [node] is a constant type expression.
+bool isConstantTypeExpression(TypeAnnotation node) {
+  if (node is TypeName) {
+    if (_isConstantTypeName(node.name)) {
+      var arguments = node.typeArguments?.arguments;
+      if (arguments != null) {
+        for (var argument in arguments) {
+          if (!isConstantTypeExpression(argument)) {
+            return false;
+          }
+        }
+      }
+      return true;
+    }
+    if (node.type is DynamicTypeImpl) {
+      return true;
+    }
+    if (node.type is VoidType) {
+      return true;
+    }
+    return false;
+  }
+
+  if (node is GenericFunctionType) {
+    var returnType = node.returnType;
+    if (returnType != null) {
+      if (!isConstantTypeExpression(returnType)) {
+        return false;
+      }
+    }
+
+    var typeParameters = node.typeParameters?.typeParameters;
+    if (typeParameters != null) {
+      for (var parameter in typeParameters) {
+        var bound = parameter.bound;
+        if (bound != null && !isConstantTypeExpression(bound)) {
+          return false;
+        }
+      }
+    }
+
+    var formalParameters = node.parameters?.parameters;
+    if (formalParameters != null) {
+      for (var parameter in formalParameters) {
+        if (parameter is SimpleFormalParameter) {
+          if (!isConstantTypeExpression(parameter.type)) {
+            return false;
+          }
+        }
+      }
+    }
+
+    return true;
+  }
+
+  return false;
+}
+
+bool _isConstantTypeName(Identifier name) {
+  var element = name.staticElement;
+  if (element is ClassElement || element is GenericTypeAliasElement) {
+    if (name is PrefixedIdentifier) {
+      if (name.isDeferred) {
+        return false;
+      }
+    }
+    return true;
+  }
+  return false;
+}
+
+class _Collector {
+  final List<AstNode> nodes = [];
+
+  void collect(AstNode node) {
+    if (node is BooleanLiteral ||
+        node is DoubleLiteral ||
+        node is IntegerLiteral ||
+        node is NullLiteral ||
+        node is SimpleStringLiteral ||
+        node is SymbolLiteral) {
+      return;
+    }
+
+    if (node is AdjacentStrings) {
+      for (var string in node.strings) {
+        collect(string);
+      }
+      return;
+    }
+
+    if (node is StringInterpolation) {
+      for (var component in node.elements) {
+        if (component is InterpolationExpression) {
+          collect(component.expression);
+        }
+      }
+      return;
+    }
+
+    if (node is Identifier) {
+      return _identifier(node);
+    }
+
+    if (node is InstanceCreationExpression) {
+      if (!node.isConst) {
+        nodes.add(node);
+      }
+      return;
+    }
+
+    if (node is TypedLiteral) {
+      return _typeLiteral(node);
+    }
+
+    if (node is ParenthesizedExpression) {
+      collect(node.expression);
+      return;
+    }
+
+    if (node is MethodInvocation) {
+      return _methodInvocation(node);
+    }
+
+    if (node is NamedExpression) {
+      return collect(node.expression);
+    }
+
+    if (node is BinaryExpression) {
+      collect(node.leftOperand);
+      collect(node.rightOperand);
+      return;
+    }
+
+    if (node is PrefixExpression) {
+      var operator = node.operator.type;
+      if (operator == TokenType.BANG ||
+          operator == TokenType.MINUS ||
+          operator == TokenType.TILDE) {
+        collect(node.operand);
+        return;
+      }
+      nodes.add(node);
+      return;
+    }
+
+    if (node is ConditionalExpression) {
+      collect(node.condition);
+      collect(node.thenExpression);
+      collect(node.elseExpression);
+      return;
+    }
+
+    if (node is PropertyAccess) {
+      return _propertyAccess(node);
+    }
+
+    if (node is AsExpression) {
+      if (!isConstantTypeExpression(node.type)) {
+        nodes.add(node.type);
+      }
+      collect(node.expression);
+      return;
+    }
+
+    if (node is IsExpression) {
+      if (!isConstantTypeExpression(node.type)) {
+        nodes.add(node.type);
+      }
+      collect(node.expression);
+      return;
+    }
+
+    if (node is MapLiteralEntry) {
+      collect(node.key);
+      collect(node.value);
+      return;
+    }
+
+    if (node is SpreadElement) {
+      collect(node.expression);
+      return;
+    }
+
+    if (node is IfElement) {
+      collect(node.condition);
+      collect(node.thenElement);
+      if (node.elseElement != null) {
+        collect(node.elseElement);
+      }
+      return;
+    }
+
+    nodes.add(node);
+  }
+
+  void _identifier(Identifier node) {
+    var element = node.staticElement;
+
+    if (node is PrefixedIdentifier) {
+      if (node.isDeferred) {
+        nodes.add(node);
+        return;
+      }
+      if (node.identifier.name == 'length') {
+        collect(node.prefix);
+        return;
+      }
+      if (element is MethodElement && element.isStatic) {
+        if (!_isConstantTypeName(node.prefix)) {
+          nodes.add(node);
+        }
+        return;
+      }
+    }
+
+    if (element is ParameterElement) {
+      var enclosing = element.enclosingElement;
+      if (enclosing is ConstructorElement &&
+          isConstConstructorElement(enclosing)) {
+        if (node.thisOrAncestorOfType<ConstructorInitializer>() != null) {
+          return;
+        }
+      }
+      nodes.add(node);
+      return;
+    }
+
+    if (element is VariableElement) {
+      if (!element.isConst) {
+        nodes.add(node);
+      }
+      return;
+    }
+    if (element is PropertyAccessorElement && element.isGetter) {
+      var variable = element.variable;
+      if (!variable.isConst) {
+        nodes.add(node);
+      }
+      return;
+    }
+    if (_isConstantTypeName(node)) {
+      return;
+    }
+    if (element is FunctionElement) {
+      return;
+    }
+    if (element is MethodElement && element.isStatic) {
+      return;
+    }
+    nodes.add(node);
+  }
+
+  void _methodInvocation(MethodInvocation node) {
+    var arguments = node.argumentList?.arguments;
+    if (arguments?.length == 2 && node.methodName.name == 'identical') {
+      var library = node.methodName?.staticElement?.library;
+      if (library?.isDartCore == true) {
+        collect(arguments[0]);
+        collect(arguments[1]);
+        return;
+      }
+    }
+    nodes.add(node);
+  }
+
+  void _propertyAccess(PropertyAccess node) {
+    if (node.propertyName.name == 'length') {
+      collect(node.target);
+      return;
+    }
+
+    var target = node.target;
+    if (target is PrefixedIdentifier) {
+      if (target.isDeferred) {
+        nodes.add(node);
+        return;
+      }
+
+      var element = node.propertyName.staticElement;
+      if (element is PropertyAccessorElement && element.isGetter) {
+        var variable = element.variable;
+        if (!variable.isConst) {
+          nodes.add(node.propertyName);
+        }
+        return;
+      }
+    }
+
+    nodes.add(node);
+  }
+
+  void _typeLiteral(TypedLiteral node) {
+    if (!node.isConst) {
+      nodes.add(node);
+      return;
+    }
+
+    if (node is ListLiteral) {
+      var typeArguments = node.typeArguments?.arguments;
+      if (typeArguments?.length == 1) {
+        var elementType = typeArguments[0];
+        if (!isConstantTypeExpression(elementType)) {
+          nodes.add(elementType);
+        }
+      }
+
+      for (var element in node.elements) {
+        collect(element);
+      }
+      return;
+    }
+
+    if (node is SetOrMapLiteral) {
+      var typeArguments = node.typeArguments?.arguments;
+      if (typeArguments?.length == 1) {
+        var elementType = typeArguments[0];
+        if (!isConstantTypeExpression(elementType)) {
+          nodes.add(elementType);
+        }
+      }
+
+      if (typeArguments?.length == 2) {
+        var keyType = typeArguments[0];
+        var valueType = typeArguments[1];
+        if (!isConstantTypeExpression(keyType)) {
+          nodes.add(keyType);
+        }
+        if (!isConstantTypeExpression(valueType)) {
+          nodes.add(valueType);
+        }
+      }
+
+      for (var element in node.elements) {
+        collect(element);
+      }
+    }
+  }
+
+  static bool isConstConstructorElement(ConstructorElement element) {
+    if (element.isConst) return true;
+    return temporaryConstConstructorElements[element] ?? false;
+  }
+}
diff --git a/analyzer/lib/src/dart/constant/utilities.dart b/analyzer/lib/src/dart/constant/utilities.dart
index 6e5f535..60cecdd 100644
--- a/analyzer/lib/src/dart/constant/utilities.dart
+++ b/analyzer/lib/src/dart/constant/utilities.dart
@@ -95,17 +95,6 @@
   }
 
   @override
-  @deprecated
-  MapLiteral visitMapLiteral(MapLiteral node) {
-    MapLiteral literal = super.visitMapLiteral(node);
-    literal.staticType = node.staticType;
-    if (node.constKeyword == null && node.isConst) {
-      literal.constKeyword = new KeywordToken(Keyword.CONST, node.offset);
-    }
-    return literal;
-  }
-
-  @override
   RedirectingConstructorInvocation visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     RedirectingConstructorInvocation invocation =
@@ -115,17 +104,6 @@
   }
 
   @override
-  @deprecated
-  SetLiteral visitSetLiteral(SetLiteral node) {
-    SetLiteral literal = super.visitSetLiteral(node);
-    literal.staticType = node.staticType;
-    if (node.constKeyword == null && node.isConst) {
-      literal.constKeyword = new KeywordToken(Keyword.CONST, node.offset);
-    }
-    return literal;
-  }
-
-  @override
   SetOrMapLiteral visitSetOrMapLiteral(SetOrMapLiteral node) {
     SetOrMapLiteral literal = super.visitSetOrMapLiteral(node);
     literal.staticType = node.staticType;
@@ -196,13 +174,13 @@
     } else {
       if (node.isMap) {
         // Values of keys are computed to check that they are unique.
-        for (var entry in node.elements2) {
+        for (var entry in node.elements) {
           // TODO(mfairhurst): How do if/for loops/spreads affect this?
           _find(entry);
         }
       } else if (node.isSet) {
         // values of sets are computed to check that they are unique.
-        for (var entry in node.elements2) {
+        for (var entry in node.elements) {
           _find(entry);
         }
       }
diff --git a/analyzer/lib/src/dart/constant/value.dart b/analyzer/lib/src/dart/constant/value.dart
index fcaa320..1b93859 100644
--- a/analyzer/lib/src/dart/constant/value.dart
+++ b/analyzer/lib/src/dart/constant/value.dart
@@ -109,6 +109,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   BoolState lazyOr(InstanceState rightOperandComputer()) {
     if (value == true) {
       return TRUE_STATE;
@@ -563,6 +568,31 @@
           _state.lazyAnd(() => rightOperandComputer()?._state));
 
   /**
+   * Return the result of invoking the '==' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl lazyEqualEqual(
+      TypeProvider typeProvider, DartObjectImpl rightOperand) {
+    if (isNull || rightOperand.isNull) {
+      return new DartObjectImpl(
+          typeProvider.boolType,
+          isNull && rightOperand.isNull
+              ? BoolState.TRUE_STATE
+              : BoolState.FALSE_STATE);
+    }
+    if (isBoolNumStringOrNull) {
+      return new DartObjectImpl(
+          typeProvider.boolType, _state.lazyEqualEqual(rightOperand._state));
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
+  }
+
+  /**
    * Return the result of invoking the '||' operator on this object with the
    * [rightOperand]. The [typeProvider] is the type provider used to find known
    * types.
@@ -1077,6 +1107,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   BoolState lessThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -1313,6 +1348,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
   BoolState lazyOr(InstanceState rightOperandComputer()) {
     InstanceState rightOperand = rightOperandComputer();
     assertBool(rightOperand);
@@ -1452,6 +1492,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   String toString() => _element == null ? "-unknown-" : _element.name;
 }
 
@@ -1544,6 +1589,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   String toString() {
     StringBuffer buffer = new StringBuffer();
     List<String> fieldNames = _fieldMap.keys.toList();
@@ -1855,6 +1905,15 @@
   }
 
   /**
+   * Return the result of invoking the '==' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState lazyEqualEqual(InstanceState rightOperand);
+
+  /**
    * Return the result of invoking the '||' operator on this object with the
    * [rightOperand].
    *
@@ -2348,6 +2407,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   BoolState lessThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2413,9 +2477,15 @@
       if (rightValue >= 0) {
         // TODO(brianwilkerson) After the analyzer package has a minimum SDK
         // constraint that includes support for the real operator, consider
-        // changing this to the following line:
+        // changing the line below to
         //   return new IntState(value >>> rightValue);
-        return new IntState(value ~/ (1 << rightValue));
+        int divisor = 1 << rightValue;
+        if (divisor == 0) {
+          // The `rightValue` is large enough to cause all of the non-zero bits
+          // in the left operand to be shifted out of the value.
+          return new IntState(0);
+        }
+        return new IntState(value ~/ divisor);
       }
     } else if (rightOperand is DynamicState || rightOperand is NumState) {
       return UNKNOWN_VALUE;
@@ -2634,6 +2704,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   String toString() {
     StringBuffer buffer = new StringBuffer();
     buffer.write('[');
@@ -2718,6 +2793,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   String toString() {
     StringBuffer buffer = new StringBuffer();
     buffer.write('{');
@@ -2785,6 +2865,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   BoolState logicalNot() {
     throw new EvaluationException(
         CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
@@ -2874,6 +2959,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
   BoolState lessThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
@@ -2976,6 +3066,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   String toString() {
     StringBuffer buffer = new StringBuffer();
     buffer.write('{');
@@ -3072,6 +3167,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   IntState stringLength() {
     if (value == null) {
       return IntState.UNKNOWN_VALUE;
@@ -3139,6 +3239,11 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   String toString() => value == null ? "-unknown-" : "#$value";
 }
 
@@ -3198,5 +3303,10 @@
   }
 
   @override
+  BoolState lazyEqualEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
   String toString() => _type?.toString() ?? "-unknown-";
 }
diff --git a/analyzer/lib/src/dart/element/element.dart b/analyzer/lib/src/dart/element/element.dart
index 5cf726d..a04e0f5 100644
--- a/analyzer/lib/src/dart/element/element.dart
+++ b/analyzer/lib/src/dart/element/element.dart
@@ -32,6 +32,7 @@
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary2/linked_unit_context.dart';
 import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/util/comment.dart';
 
 /// Assert that the given [object] is null, which in the places where this
 /// function is called means that the element is not resynthesized.
@@ -61,7 +62,7 @@
   AbstractClassElementImpl(String name, int offset) : super(name, offset);
 
   AbstractClassElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created class element to have the given [name].
@@ -453,6 +454,9 @@
   /// methods might be different.
   int version = 0;
 
+  /// This callback is set during mixins inference to handle reentrant calls.
+  List<InterfaceType> Function(ClassElementImpl) linkedMixinInferenceCallback;
+
   /// Initialize a newly created class element to have the given [name] at the
   /// given [offset] in the file that contains the declaration of this element.
   ClassElementImpl(String name, int offset)
@@ -460,11 +464,9 @@
         super(name, offset);
 
   ClassElementImpl.forLinkedNode(CompilationUnitElementImpl enclosing,
-      Reference reference, LinkedNode linkedNode)
+      Reference reference, AstNode linkedNode)
       : _unlinkedClass = null,
-        super.forLinkedNode(enclosing, reference, linkedNode) {
-    enclosing.linkedContext.loadClassMemberReferences(reference);
-  }
+        super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created class element to have the given [name].
   ClassElementImpl.forNode(Identifier name)
@@ -484,11 +486,10 @@
 
   @override
   List<PropertyAccessorElement> get accessors {
-    if (linkedNode != null) {
-      if (_accessors != null) return _accessors;
+    if (_accessors != null) return _accessors;
 
-      if (linkedNode.kind == LinkedNodeKind.classDeclaration ||
-          linkedNode.kind == LinkedNodeKind.mixinDeclaration) {
+    if (linkedNode != null) {
+      if (linkedNode is ClassOrMixinDeclaration) {
         _createPropertiesAndAccessors();
         assert(_accessors != null);
         return _accessors;
@@ -496,12 +497,14 @@
         return _accessors = const [];
       }
     }
+
     if (_accessors == null) {
       if (_unlinkedClass != null) {
         _resynthesizeFieldsAndPropertyAccessors();
       }
     }
-    return _accessors ?? const <PropertyAccessorElement>[];
+
+    return _accessors ??= const <PropertyAccessorElement>[];
   }
 
   @override
@@ -519,6 +522,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedContext.getCodeLength(linkedNode);
+    }
     if (_unlinkedClass != null) {
       return _unlinkedClass.codeRange?.length;
     }
@@ -527,6 +533,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedContext.getCodeOffset(linkedNode);
+    }
     if (_unlinkedClass != null) {
       return _unlinkedClass.codeRange?.offset;
     }
@@ -546,14 +555,26 @@
     if (linkedNode != null) {
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@constructor');
-      if (linkedNode.kind == LinkedNodeKind.classDeclaration) {
-        _constructors = linkedNode.classOrMixinDeclaration_members
-            .where((node) => node.kind == LinkedNodeKind.constructorDeclaration)
-            .map((node) {
-          var name = context.getConstructorDeclarationName(node);
-          var reference = containerRef.getChild(name);
-          return ConstructorElementImpl.forLinkedNode(reference, node, this);
-        }).toList();
+      _constructors = context.getConstructors(linkedNode).map((node) {
+        var name = node.name?.name ?? '';
+        var reference = containerRef.getChild(name);
+        if (reference.hasElementFor(node)) {
+          return reference.element as ConstructorElement;
+        }
+        return ConstructorElementImpl.forLinkedNode(this, reference, node);
+      }).toList();
+
+      if (_constructors.isEmpty) {
+        return _constructors = [
+          ConstructorElementImpl.forLinkedNode(
+            this,
+            containerRef.getChild(''),
+            null,
+          )
+            ..isSynthetic = true
+            ..name = ''
+            ..nameOffset = -1,
+        ];
       }
     }
 
@@ -584,16 +605,17 @@
         }
       }
 
-      // There are no explicit constructors.
-      // Create the implicit default constructor.
+      _constructors = const <ConstructorElement>[];
+    }
+
+    if (_constructors.isEmpty) {
       var constructor = new ConstructorElementImpl('', -1);
       constructor.isSynthetic = true;
       constructor.enclosingElement = this;
       _constructors = <ConstructorElement>[constructor];
     }
 
-    assert(_constructors != null);
-    return _constructors ?? const <ConstructorElement>[];
+    return _constructors;
   }
 
   /// Set the constructors contained in this class to the given [constructors].
@@ -611,9 +633,9 @@
   @override
   String get documentationComment {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getCommentText(
-        linkedNode.annotatedNode_comment,
-      );
+      var context = enclosingUnit.linkedContext;
+      var comment = context.getDocumentationComment(linkedNode);
+      return getCommentNodeRawText(comment);
     }
     if (_unlinkedClass != null) {
       return _unlinkedClass.documentationComment?.text;
@@ -626,11 +648,10 @@
 
   @override
   List<FieldElement> get fields {
-    if (linkedNode != null) {
-      if (_fields != null) return _fields;
+    if (_fields != null) return _fields;
 
-      if (linkedNode.kind == LinkedNodeKind.classDeclaration ||
-          linkedNode.kind == LinkedNodeKind.mixinDeclaration) {
+    if (linkedNode != null) {
+      if (linkedNode is ClassOrMixinDeclaration) {
         _createPropertiesAndAccessors();
         assert(_fields != null);
         return _fields;
@@ -638,11 +659,13 @@
         _fields = const [];
       }
     }
+
     if (_fields == null) {
       if (_unlinkedClass != null) {
         _resynthesizeFieldsAndPropertyAccessors();
       }
     }
+
     return _fields ?? const <FieldElement>[];
   }
 
@@ -653,10 +676,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;
   }
@@ -740,10 +769,13 @@
       var context = enclosingUnit.linkedContext;
       var implementsClause = context.getImplementsClause(linkedNode);
       if (implementsClause != null) {
-        return _interfaces = implementsClause.implementsClause_interfaces
-            .map((node) => context.getInterfaceType(node.typeName_type))
-            .where((type) => type != null)
+        return _interfaces = implementsClause.interfaces
+            .map((node) => node.type)
+            .whereType<InterfaceType>()
+            .where(_isInterfaceTypeInterface)
             .toList();
+      } else {
+        return _interfaces = const [];
       }
     } else if (_unlinkedClass != null) {
       var unlinkedInterfaces = _unlinkedClass.interfaces;
@@ -784,11 +816,7 @@
   @override
   bool get isAbstract {
     if (linkedNode != null) {
-      if (linkedNode.kind == LinkedNodeKind.classDeclaration) {
-        return linkedNode.classDeclaration_abstractKeyword != 0;
-      } else {
-        return linkedNode.classTypeAlias_abstractKeyword != 0;
-      }
+      return enclosingUnit.linkedContext.isAbstract(linkedNode);
     }
     if (_unlinkedClass != null) {
       return _unlinkedClass.isAbstract;
@@ -799,7 +827,7 @@
   @override
   bool get isMixinApplication {
     if (linkedNode != null) {
-      return linkedNode.kind == LinkedNodeKind.classTypeAlias;
+      return linkedNode is ClassTypeAlias;
     }
     if (_unlinkedClass != null) {
       return _unlinkedClass.isMixinApplication;
@@ -822,6 +850,14 @@
   }
 
   @override
+  bool get isSimplyBounded {
+    if (linkedNode != null) {
+      return linkedContext.isSimplyBounded(linkedNode);
+    }
+    return super.isSimplyBounded;
+  }
+
+  @override
   bool get isValidMixin {
     if (hasReferenceToSuper) {
       return false;
@@ -855,19 +891,17 @@
     if (linkedNode != null) {
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@method');
-      if (linkedNode.kind == LinkedNodeKind.classDeclaration ||
-          linkedNode.kind == LinkedNodeKind.mixinDeclaration) {
-        return _methods = linkedNode.classOrMixinDeclaration_members
-            .where((node) => node.kind == LinkedNodeKind.methodDeclaration)
-            .where((node) => node.methodDeclaration_propertyKeyword == 0)
-            .map((node) {
-          var name = context.getSimpleName(node.methodDeclaration_name);
-          var reference = containerRef.getChild(name);
-          return MethodElementImpl.forLinkedNode(reference, node, this);
-        }).toList();
-      } else {
-        return _methods = const <MethodElement>[];
-      }
+      return _methods = context
+          .getMethods(linkedNode)
+          .where((node) => node.propertyKeyword == null)
+          .map((node) {
+        var name = node.name.name;
+        var reference = containerRef.getChild(name);
+        if (reference.hasElementFor(node)) {
+          return reference.element as MethodElement;
+        }
+        return MethodElementImpl.forLinkedNode(this, reference, node);
+      }).toList();
     }
 
     if (_unlinkedClass != null) {
@@ -919,23 +953,25 @@
 
   @override
   List<InterfaceType> get mixins {
+    if (linkedMixinInferenceCallback != null) {
+      _mixins = linkedMixinInferenceCallback(this);
+    }
+
     if (_mixins != null) {
       return _mixins;
     }
 
     if (linkedNode != null) {
       var context = enclosingUnit.linkedContext;
-      LinkedNode withClause;
-      if (linkedNode.kind == LinkedNodeKind.classDeclaration) {
-        withClause = linkedNode.classDeclaration_withClause;
-      } else {
-        withClause = linkedNode.classTypeAlias_withClause;
-      }
+      var withClause = context.getWithClause(linkedNode);
       if (withClause != null) {
-        return _mixins = withClause.withClause_mixinTypes
-            .map((node) => context.getInterfaceType(node.typeName_type))
-            .where((type) => type != null)
+        return _mixins = withClause.mixinTypes
+            .map((node) => node.type)
+            .whereType<InterfaceType>()
+            .where(_isInterfaceTypeInterface)
             .toList();
+      } else {
+        return _mixins = const [];
       }
     } else if (_unlinkedClass != null) {
       var unlinkedMixins = _unlinkedClass.mixins;
@@ -991,6 +1027,10 @@
 
   @override
   int get nameOffset {
+    if (linkedNode != null) {
+      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+    }
+
     int offset = super.nameOffset;
     if (offset == 0 && _unlinkedClass != null) {
       return _unlinkedClass.nameOffset;
@@ -1005,37 +1045,37 @@
 
   @override
   InterfaceType get supertype {
-    if (_supertype == null) {
-      if (linkedNode != null) {
-        LinkedNode superclass;
-        if (linkedNode.kind == LinkedNodeKind.classDeclaration) {
-          superclass = linkedNode
-              .classDeclaration_extendsClause?.extendsClause_superclass;
-        } else {
-          superclass = linkedNode.classTypeAlias_superclass;
-        }
-        if (superclass != null) {
-          var context = enclosingUnit.linkedContext;
-          _supertype = context.getInterfaceType(superclass.typeName_type);
-        } else if (!linkedNode.classDeclaration_isDartObject) {
-          _supertype = context.typeProvider.objectType;
-        }
-      } else if (_unlinkedClass != null) {
-        if (_unlinkedClass.supertype != null) {
-          DartType type = enclosingUnit.resynthesizerContext
-              .resolveTypeRef(this, _unlinkedClass.supertype);
-          if (_isInterfaceTypeClass(type)) {
-            _supertype = type;
-          } else {
-            _supertype = context.typeProvider.objectType;
-          }
-        } else if (_unlinkedClass.hasNoSupertype) {
-          return null;
+    if (_supertype != null) return _supertype;
+
+    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;
+      }
+      return _supertype = this.context.typeProvider.objectType;
+    } else if (_unlinkedClass != null) {
+      if (_unlinkedClass.supertype != null) {
+        DartType type = enclosingUnit.resynthesizerContext
+            .resolveTypeRef(this, _unlinkedClass.supertype);
+        if (_isInterfaceTypeClass(type)) {
+          _supertype = type;
         } else {
           _supertype = context.typeProvider.objectType;
         }
+      } else if (_unlinkedClass.hasNoSupertype) {
+        return null;
+      } else {
+        _supertype = context.typeProvider.objectType;
       }
     }
+
     return _supertype;
   }
 
@@ -1054,27 +1094,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.getTypeParameters(linkedNode);
-      if (typeParameters == null) {
-        return _typeParameterElements = const [];
-      }
-      return _typeParameterElements = typeParameters.map((node) {
-        var name = context.getSimpleName(node.typeParameter_name);
-        var reference = containerRef.getChild(name);
-        reference.node = node;
-        return TypeParameterElementImpl.forLinkedNode(this, reference, node);
-      }).toList();
-    }
-    return super.typeParameters;
-  }
-
   /// Set the type parameters defined for this class to the given
   /// [typeParameters].
   void set typeParameters(List<TypeParameterElement> typeParameters) {
@@ -1300,9 +1319,9 @@
     var accessorList = <PropertyAccessorElementImpl>[];
     var fieldList = <FieldElementImpl>[];
 
-    var fields = context.classFields(linkedNode);
+    var fields = context.getFields(linkedNode);
     for (var field in fields) {
-      var name = context.getVariableName(field);
+      var name = field.name.name;
       var fieldElement = FieldElementImpl.forLinkedNodeFactory(
         this,
         reference.getChild('@field').getChild(name),
@@ -1316,44 +1335,43 @@
       }
     }
 
-    for (var node in linkedNode.classOrMixinDeclaration_members) {
-      if (node.kind == LinkedNodeKind.methodDeclaration) {
-        var isGetter = context.isGetterMethod(node);
-        var isSetter = context.isSetterMethod(node);
-        if (!isGetter && !isSetter) continue;
+    var methods = context.getMethods(linkedNode);
+    for (var method in methods) {
+      var isGetter = method.isGetter;
+      var isSetter = method.isSetter;
+      if (!isGetter && !isSetter) continue;
 
-        var name = context.getMethodName(node);
-        var containerRef = isGetter
-            ? reference.getChild('@getter')
-            : reference.getChild('@setter');
+      var name = method.name.name;
+      var containerRef = isGetter
+          ? reference.getChild('@getter')
+          : reference.getChild('@setter');
 
-        var accessorElement = PropertyAccessorElementImpl.forLinkedNode(
-          this,
-          containerRef.getChild(name),
-          node,
-        );
-        accessorList.add(accessorElement);
+      var accessorElement = PropertyAccessorElementImpl.forLinkedNode(
+        this,
+        containerRef.getChild(name),
+        method,
+      );
+      accessorList.add(accessorElement);
 
-        var fieldRef = reference.getChild('@field').getChild(name);
-        FieldElementImpl field = fieldRef.element;
-        if (field == null) {
-          field = new FieldElementImpl(name, -1);
-          fieldRef.element = field;
-          field.enclosingElement = this;
-          field.isSynthetic = true;
-          field.isFinal = isGetter;
-          field.isStatic = accessorElement.isStatic;
-          fieldList.add(field);
-        } else {
-          field.isFinal = false;
-        }
+      var fieldRef = reference.getChild('@field').getChild(name);
+      FieldElementImpl field = fieldRef.element;
+      if (field == null) {
+        field = new FieldElementImpl(name, -1);
+        fieldRef.element = field;
+        field.enclosingElement = this;
+        field.isSynthetic = true;
+        field.isFinal = isGetter;
+        field.isStatic = accessorElement.isStatic;
+        fieldList.add(field);
+      } else {
+        field.isFinal = false;
+      }
 
-        accessorElement.variable = field;
-        if (isGetter) {
-          field.getter = accessorElement;
-        } else {
-          field.setter = accessorElement;
-        }
+      accessorElement.variable = field;
+      if (isGetter) {
+        field.getter = accessorElement;
+      } else {
+        field.setter = accessorElement;
       }
     }
 
@@ -1632,7 +1650,7 @@
         super(null, -1);
 
   CompilationUnitElementImpl.forLinkedNode(LibraryElementImpl enclosingLibrary,
-      this.linkedContext, Reference reference, LinkedNode linkedNode)
+      this.linkedContext, Reference reference, CompilationUnit linkedNode)
       : resynthesizerContext = null,
         _unlinkedUnit = null,
         _unlinkedPart = null,
@@ -1649,25 +1667,26 @@
 
   @override
   List<PropertyAccessorElement> get accessors {
+    if (_accessors != null) return _accessors;
+
     if (linkedNode != null) {
-      if (_accessors != null) return _accessors;
       _createPropertiesAndAccessors(this);
       assert(_accessors != null);
       return _accessors;
     }
-    if (_accessors == null) {
-      if (_unlinkedUnit != null) {
-        _explicitTopLevelAccessors ??=
-            resynthesizerContext.buildTopLevelAccessors();
-        _explicitTopLevelVariables ??=
-            resynthesizerContext.buildTopLevelVariables();
-      }
-      if (_explicitTopLevelAccessors != null) {
-        _accessors = <PropertyAccessorElementImpl>[]
-          ..addAll(_explicitTopLevelAccessors.accessors)
-          ..addAll(_explicitTopLevelVariables.implicitAccessors);
-      }
+
+    if (_unlinkedUnit != null) {
+      _explicitTopLevelAccessors ??=
+          resynthesizerContext.buildTopLevelAccessors();
+      _explicitTopLevelVariables ??=
+          resynthesizerContext.buildTopLevelVariables();
     }
+    if (_explicitTopLevelAccessors != null) {
+      _accessors = <PropertyAccessorElementImpl>[]
+        ..addAll(_explicitTopLevelAccessors.accessors)
+        ..addAll(_explicitTopLevelVariables.implicitAccessors);
+    }
+
     return _accessors ?? const <PropertyAccessorElement>[];
   }
 
@@ -1682,6 +1701,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedContext.getCodeLength(linkedNode);
+    }
     if (_unlinkedUnit != null) {
       return _unlinkedUnit.codeRange?.length;
     }
@@ -1690,6 +1712,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedContext.getCodeOffset(linkedNode);
+    }
     if (_unlinkedUnit != null) {
       return _unlinkedUnit.codeRange?.offset;
     }
@@ -1707,25 +1732,27 @@
 
   @override
   List<ClassElement> get enums {
+    if (_enums != null) return _enums;
+
     if (linkedNode != null) {
-      if (_enums != null) return _enums;
-      var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@enum');
-      _enums = linkedNode.compilationUnit_declarations
-          .where((node) => node.kind == LinkedNodeKind.enumDeclaration)
-          .map((node) {
-        var name = context.getUnitMemberName(node);
+      CompilationUnit linkedNode = this.linkedNode;
+      _enums = linkedNode.declarations.whereType<EnumDeclaration>().map((node) {
+        var name = node.name.name;
         var reference = containerRef.getChild(name);
-        reference.node = node;
+        if (reference.hasElementFor(node)) {
+          return reference.element as EnumElementImpl;
+        }
         return EnumElementImpl.forLinkedNode(this, reference, node);
       }).toList();
     }
+
     if (_unlinkedUnit != null) {
-      _enums ??= _unlinkedUnit.enums
+      return _enums = _unlinkedUnit.enums
           .map((e) => new EnumElementImpl.forSerialized(e, this))
           .toList(growable: false);
     }
-    return _enums ?? const <ClassElement>[];
+    return _enums ??= const <ClassElement>[];
   }
 
   /// Set the enums contained in this compilation unit to the given [enums].
@@ -1742,16 +1769,17 @@
     if (_functions != null) return _functions;
 
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
+      CompilationUnit linkedNode = this.linkedNode;
       var containerRef = reference.getChild('@function');
-      _functions = linkedNode.compilationUnit_declarations
-          .where((node) =>
-              node.kind == LinkedNodeKind.functionDeclaration &&
-              !context.isGetterFunction(node) &&
-              !context.isSetterFunction(node))
+      return _functions = linkedNode.declarations
+          .whereType<FunctionDeclaration>()
+          .where((node) => !node.isGetter && !node.isSetter)
           .map((node) {
-        var name = context.getUnitMemberName(node);
+        var name = node.name.name;
         var reference = containerRef.getChild(name);
+        if (reference.hasElementFor(node)) {
+          return reference.element as FunctionElementImpl;
+        }
         return FunctionElementImpl.forLinkedNode(this, reference, node);
       }).toList();
     } else if (_unlinkedUnit != null) {
@@ -1777,13 +1805,22 @@
     if (_typeAliases != null) return _typeAliases;
 
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
+      CompilationUnit linkedNode = this.linkedNode;
       var containerRef = reference.getChild('@typeAlias');
-      _typeAliases = linkedNode.compilationUnit_declarations
-          .where((node) => node.kind == LinkedNodeKind.functionTypeAlias)
-          .map((node) {
-        var name = context.getUnitMemberName(node);
+      return _typeAliases = linkedNode.declarations.where((node) {
+        return node is FunctionTypeAlias || node is GenericTypeAlias;
+      }).map((node) {
+        String name;
+        if (node is FunctionTypeAlias) {
+          name = node.name.name;
+        } else {
+          name = (node as GenericTypeAlias).name.name;
+        }
+
         var reference = containerRef.getChild(name);
+        if (reference.hasElementFor(node)) {
+          return reference.element as GenericTypeAliasElementImpl;
+        }
         return GenericTypeAliasElementImpl.forLinkedNode(this, reference, node);
       }).toList();
     }
@@ -1830,8 +1867,24 @@
 
   @override
   List<ClassElement> get mixins {
+    if (_mixins != null) return _mixins;
+
+    if (linkedNode != null) {
+      CompilationUnit linkedNode = this.linkedNode;
+      var containerRef = reference.getChild('@mixin');
+      var declarations = linkedNode.declarations;
+      return _mixins = declarations.whereType<MixinDeclaration>().map((node) {
+        var name = node.name.name;
+        var reference = containerRef.getChild(name);
+        if (reference.hasElementFor(node)) {
+          return reference.element as MixinElementImpl;
+        }
+        return MixinElementImpl.forLinkedNode(this, reference, node);
+      }).toList();
+    }
+
     if (_unlinkedUnit != null) {
-      _mixins ??= _unlinkedUnit.mixins
+      return _mixins = _unlinkedUnit.mixins
           .map((c) => new MixinElementImpl.forSerialized(c, this))
           .toList(growable: false);
     }
@@ -1909,24 +1962,39 @@
 
   @override
   List<ClassElement> get types {
+    if (_types != null) return _types;
+
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
+      CompilationUnit linkedNode = this.linkedNode;
       var containerRef = reference.getChild('@class');
-      _types = linkedNode.compilationUnit_declarations
-          .where((node) =>
-              node.kind == LinkedNodeKind.classDeclaration ||
-              node.kind == LinkedNodeKind.classTypeAlias)
-          .map((node) {
-        var name = context.getUnitMemberName(node);
+      _types = <ClassElement>[];
+      for (var node in linkedNode.declarations) {
+        String name;
+        if (node is ClassDeclaration) {
+          name = node.name.name;
+        } else if (node is ClassTypeAlias) {
+          name = node.name.name;
+        } else {
+          continue;
+        }
         var reference = containerRef.getChild(name);
-        reference.node = node;
-        return ClassElementImpl.forLinkedNode(this, reference, node);
-      }).toList();
-    } else if (_unlinkedUnit != null) {
-      _types ??= _unlinkedUnit.classes
+        if (reference.hasElementFor(node)) {
+          _types.add(reference.element);
+        } else {
+          _types.add(
+            ClassElementImpl.forLinkedNode(this, reference, node),
+          );
+        }
+      }
+      return _types;
+    }
+
+    if (_unlinkedUnit != null) {
+      return _types = _unlinkedUnit.classes
           .map((c) => new ClassElementImpl.forSerialized(c, this))
           .toList(growable: false);
     }
+
     return _types ?? const <ClassElement>[];
   }
 
@@ -2101,9 +2169,12 @@
       var variableList = <TopLevelVariableElementImpl>[];
       variableMap[unit] = variableList;
 
-      var variables = context.topLevelVariables(unit.linkedNode);
+      var unitNode = unit.linkedContext.unit_withDeclarations;
+      var unitDeclarations = unitNode.declarations;
+
+      var variables = context.topLevelVariables(unitNode);
       for (var variable in variables) {
-        var name = context.getVariableName(variable);
+        var name = variable.name.name;
         var reference = unit.reference.getChild('@variable').getChild(name);
         var variableElement = TopLevelVariableElementImpl.forLinkedNodeFactory(
           unit,
@@ -2118,13 +2189,13 @@
         }
       }
 
-      for (var node in unit.linkedNode.compilationUnit_declarations) {
-        if (node.kind == LinkedNodeKind.functionDeclaration) {
-          var isGetter = context.isGetterFunction(node);
-          var isSetter = context.isSetterFunction(node);
+      for (var node in unitDeclarations) {
+        if (node is FunctionDeclaration) {
+          var isGetter = node.isGetter;
+          var isSetter = node.isSetter;
           if (!isGetter && !isSetter) continue;
 
-          var name = context.getUnitMemberName(node);
+          var name = node.name.name;
           var containerRef = isGetter
               ? unit.reference.getChild('@getter')
               : unit.reference.getChild('@setter');
@@ -2180,7 +2251,7 @@
   ConstFieldElementImpl(String name, int offset) : super(name, offset);
 
   ConstFieldElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created field element to have the given [name].
@@ -2202,7 +2273,7 @@
       : super(enumElement);
 
   ConstFieldElementImpl_EnumValue.forLinkedNode(EnumElementImpl enumElement,
-      Reference reference, LinkedNode linkedNode, this._index)
+      Reference reference, AstNode linkedNode, this._index)
       : _unlinkedEnumValue = null,
         super.forLinkedNode(enumElement, reference, linkedNode);
 
@@ -2212,9 +2283,9 @@
   @override
   String get documentationComment {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getCommentText(
-        linkedNode.annotatedNode_comment,
-      );
+      var context = enclosingUnit.linkedContext;
+      var comment = context.getDocumentationComment(linkedNode);
+      return getCommentNodeRawText(comment);
     }
     if (_unlinkedEnumValue != null) {
       return _unlinkedEnumValue.documentationComment?.text;
@@ -2259,9 +2330,7 @@
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getSimpleOffset(
-        linkedNode.enumConstantDeclaration_name,
-      );
+      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
     }
     int offset = super.nameOffset;
     if (offset == -1) {
@@ -2320,7 +2389,7 @@
   }
 
   ConstFieldElementImpl_ofEnum.forLinkedNode(
-      this._enum, Reference reference, LinkedNode linkedNode)
+      this._enum, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(_enum, reference, linkedNode);
 
   @override
@@ -2399,8 +2468,8 @@
   /// and [offset].
   ConstructorElementImpl(String name, int offset) : super(name, offset);
 
-  ConstructorElementImpl.forLinkedNode(Reference reference,
-      LinkedNode linkedNode, ClassElementImpl enclosingClass)
+  ConstructorElementImpl.forLinkedNode(ClassElementImpl enclosingClass,
+      Reference reference, ConstructorDeclaration linkedNode)
       : super.forLinkedNode(enclosingClass, reference, linkedNode);
 
   /// Initialize a newly created constructor element to have the given [name].
@@ -2414,13 +2483,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 (serializedExecutable != null) {
-        _constantInitializers = serializedExecutable.constantInitializers
-            .map((i) => _buildConstructorInitializer(i))
-            .toList(growable: false);
-      }
+    if (_constantInitializers != null) return _constantInitializers;
+
+    if (linkedNode != null) {
+      return _constantInitializers = linkedContext.getConstructorInitializers(
+        linkedNode,
+      );
     }
+
+    if (serializedExecutable != null) {
+      return _constantInitializers = serializedExecutable.constantInitializers
+          .map((i) => _buildConstructorInitializer(i))
+          .toList(growable: false);
+    }
+
     return _constantInitializers;
   }
 
@@ -2455,7 +2531,8 @@
   @override
   bool get isConst {
     if (linkedNode != null) {
-      return linkedNode.constructorDeclaration_constKeyword != 0;
+      ConstructorDeclaration linkedNode = this.linkedNode;
+      return linkedNode.constKeyword != null;
     }
     if (serializedExecutable != null) {
       return serializedExecutable.isConst;
@@ -2504,7 +2581,8 @@
   @override
   bool get isFactory {
     if (linkedNode != null) {
-      return linkedNode.constructorDeclaration_factoryKeyword != 0;
+      ConstructorDeclaration linkedNode = this.linkedNode;
+      return linkedNode.factoryKeyword != null;
     }
     if (serializedExecutable != null) {
       return serializedExecutable.isFactory;
@@ -2560,22 +2638,39 @@
 
   @override
   ConstructorElement get redirectedConstructor {
-    if (_redirectedConstructor == null) {
-      if (serializedExecutable != null) {
-        if (serializedExecutable.isRedirectedConstructor) {
-          if (serializedExecutable.isFactory) {
-            _redirectedConstructor = enclosingUnit.resynthesizerContext
-                .resolveConstructorRef(enclosingElement,
-                    serializedExecutable.redirectedConstructor);
-          } else {
-            _redirectedConstructor = enclosingElement.getNamedConstructor(
-                serializedExecutable.redirectedConstructorName);
+    if (_redirectedConstructor != null) return _redirectedConstructor;
+
+    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;
   }
 
@@ -2702,7 +2797,7 @@
       : super(name, offset);
 
   ConstTopLevelVariableElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created top-level variable element to have the given
@@ -2792,6 +2887,10 @@
   DefaultFieldFormalParameterElementImpl(String name, int nameOffset)
       : super(name, nameOffset);
 
+  DefaultFieldFormalParameterElementImpl.forLinkedNode(
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
+      : super.forLinkedNode(enclosing, reference, linkedNode);
+
   /// Initialize a newly created parameter element to have the given [name].
   DefaultFieldFormalParameterElementImpl.forNode(Identifier name)
       : super.forNode(name);
@@ -2811,7 +2910,7 @@
       : super(name, nameOffset);
 
   DefaultParameterElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created parameter element to have the given [name].
@@ -2877,6 +2976,10 @@
   /// literal.
   static String _LITERAL_VARIABLE_NAME = "literal";
 
+  /// The name of the top-level variable used to mark a type as having
+  /// "optional" type arguments.
+  static String _OPTIONAL_TYPE_ARGS_VARIABLE_NAME = "optionalTypeArgs";
+
   /// The name of the top-level variable used to mark a function as running
   /// a single test.
   static String _IS_TEST_VARIABLE_NAME = "isTest";
@@ -3026,6 +3129,12 @@
       element.library?.name == _META_LIB_NAME;
 
   @override
+  bool get isOptionalTypeArgs =>
+      element is PropertyAccessorElement &&
+      element.name == _OPTIONAL_TYPE_ARGS_VARIABLE_NAME &&
+      element.library?.name == _META_LIB_NAME;
+
+  @override
   bool get isOverride =>
       element is PropertyAccessorElement &&
       element.name == _OVERRIDE_VARIABLE_NAME &&
@@ -3107,7 +3216,7 @@
   ElementImpl _enclosingElement;
 
   Reference reference;
-  final LinkedNode linkedNode;
+  final AstNode linkedNode;
 
   /// The name of this element.
   String _name;
@@ -3149,7 +3258,7 @@
   /// Initialize from linked node.
   ElementImpl.forLinkedNode(
       this._enclosingElement, this.reference, this.linkedNode) {
-    reference?.element = this;
+    reference?.element ??= this;
   }
 
   /// Initialize a newly created element to have the given [name].
@@ -3297,6 +3406,30 @@
   }
 
   @override
+  bool get hasMustCallSuper {
+    var metadata = this.metadata;
+    for (var i = 0; i < metadata.length; i++) {
+      var annotation = metadata[i];
+      if (annotation.isMustCallSuper) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool get hasOptionalTypeArgs {
+    var metadata = this.metadata;
+    for (var i = 0; i < metadata.length; i++) {
+      var annotation = metadata[i];
+      if (annotation.isOptionalTypeArgs) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
   bool get hasOverride {
     var metadata = this.metadata;
     for (var i = 0; i < metadata.length; i++) {
@@ -3431,6 +3564,10 @@
   @override
   Source get librarySource => library?.source;
 
+  LinkedUnitContext get linkedContext {
+    return _enclosingElement.linkedContext;
+  }
+
   @override
   ElementLocation get location {
     if (_cachedLocation == null) {
@@ -3445,7 +3582,7 @@
   List<ElementAnnotation> get metadata {
     if (linkedNode != null) {
       if (_metadata != null) return _metadata;
-      var metadata = enclosingUnit.linkedContext.getMetadataOrEmpty(linkedNode);
+      var metadata = linkedContext.getMetadata(linkedNode);
       return _metadata = _buildAnnotations2(enclosingUnit, metadata);
     }
     return _metadata ?? const <ElementAnnotation>[];
@@ -3659,7 +3796,7 @@
 
   /// Return annotations for the given [nodeList] in the [unit].
   List<ElementAnnotation> _buildAnnotations2(
-      CompilationUnitElementImpl unit, List<LinkedNode> nodeList) {
+      CompilationUnitElementImpl unit, List<Annotation> nodeList) {
     var length = nodeList.length;
     if (length == 0) {
       return const <ElementAnnotation>[];
@@ -3667,9 +3804,10 @@
 
     var annotations = new List<ElementAnnotation>(length);
     for (int i = 0; i < length; i++) {
-      var ast = unit.linkedContext.readNode(nodeList[i]);
-      annotations[i] = ElementAnnotationImpl(enclosingUnit)
-        ..annotationAst = ast;
+      var ast = nodeList[i];
+      annotations[i] = ElementAnnotationImpl(unit)
+        ..annotationAst = ast
+        ..element = ast.element;
     }
     return annotations;
   }
@@ -3861,7 +3999,7 @@
         super(name, offset);
 
   EnumElementImpl.forLinkedNode(CompilationUnitElementImpl enclosing,
-      Reference reference, LinkedNode linkedNode)
+      Reference reference, EnumDeclaration linkedNode)
       : _unlinkedEnum = null,
         super.forLinkedNode(enclosing, reference, linkedNode);
 
@@ -3904,6 +4042,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedContext.getCodeLength(linkedNode);
+    }
     if (_unlinkedEnum != null) {
       return _unlinkedEnum.codeRange?.length;
     }
@@ -3912,6 +4053,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedContext.getCodeOffset(linkedNode);
+    }
     if (_unlinkedEnum != null) {
       return _unlinkedEnum.codeRange?.offset;
     }
@@ -3930,9 +4074,9 @@
   @override
   String get documentationComment {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getCommentText(
-        linkedNode.annotatedNode_comment,
-      );
+      var context = enclosingUnit.linkedContext;
+      var comment = context.getDocumentationComment(linkedNode);
+      return getCommentNodeRawText(comment);
     }
     if (_unlinkedEnum != null) {
       return _unlinkedEnum.documentationComment?.text;
@@ -4030,6 +4174,10 @@
 
   @override
   int get nameOffset {
+    if (linkedNode != null) {
+      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+    }
+
     int offset = super.nameOffset;
     if (offset == 0 && _unlinkedEnum != null && _unlinkedEnum.nameOffset != 0) {
       return _unlinkedEnum.nameOffset;
@@ -4142,13 +4290,12 @@
     }
 
     // Build fields for all enum constants.
-    var constants = linkedNode.enumDeclaration_constants;
+    var containerRef = this.reference.getChild('@constant');
+    var constants = linkedContext.getEnumConstants(linkedNode);
     for (var i = 0; i < constants.length; ++i) {
       var constant = constants[i];
-      var name = enclosingUnit.linkedContext.getSimpleName(
-        constant.enumConstantDeclaration_name,
-      );
-      var reference = this.reference.getChild('@constant').getChild(name);
+      var name = constant.name.name;
+      var reference = containerRef.getChild(name);
       var field = new ConstFieldElementImpl_EnumValue.forLinkedNode(
           this, reference, constant, i);
       fields.add(field);
@@ -4189,11 +4336,9 @@
 
   /// Initialize using the given linked node.
   ExecutableElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : serializedExecutable = null,
-        super.forLinkedNode(enclosing, reference, linkedNode) {
-    reference.element = this;
-  }
+        super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created executable element to have the given [name].
   ExecutableElementImpl.forNode(Identifier name)
@@ -4213,6 +4358,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedContext.getCodeLength(linkedNode);
+    }
     if (serializedExecutable != null) {
       return serializedExecutable.codeRange?.length;
     }
@@ -4221,6 +4369,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedContext.getCodeOffset(linkedNode);
+    }
     if (serializedExecutable != null) {
       return serializedExecutable.codeRange?.offset;
     }
@@ -4246,9 +4397,9 @@
   @override
   String get documentationComment {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getCommentText(
-        linkedNode.annotatedNode_comment,
-      );
+      var context = enclosingUnit.linkedContext;
+      var comment = context.getDocumentationComment(linkedNode);
+      return getCommentNodeRawText(comment);
     }
     if (serializedExecutable != null) {
       return serializedExecutable.documentationComment?.text;
@@ -4270,6 +4421,9 @@
 
   @override
   bool get hasImplicitReturnType {
+    if (linkedNode != null) {
+      return linkedContext.hasImplicitReturnType(linkedNode);
+    }
     if (serializedExecutable != null) {
       return serializedExecutable.returnType == null &&
           serializedExecutable.kind != UnlinkedExecutableKind.constructor;
@@ -4285,6 +4439,9 @@
 
   @override
   bool get isAbstract {
+    if (linkedNode != null) {
+      return !isExternal && enclosingUnit.linkedContext.isAbstract(linkedNode);
+    }
     if (serializedExecutable != null) {
       return serializedExecutable.isAbstract;
     }
@@ -4353,9 +4510,7 @@
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getSimpleOffset(
-        linkedNode.namedCompilationUnitMember_name,
-      );
+      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
     }
 
     int offset = super.nameOffset;
@@ -4367,44 +4522,26 @@
 
   @override
   List<ParameterElement> get parameters {
-    if (_parameters == null) {
-      if (linkedNode != null) {
-        var context = enclosingUnit.linkedContext;
-        var containerRef = reference.getChild('@parameter');
-        var formalParameters = context.getFormalParameters(linkedNode);
-        if (formalParameters != null) {
-          _parameters = formalParameters.map((node) {
-            if (node.kind == LinkedNodeKind.defaultFormalParameter) {
-              var parameterNode = node.defaultFormalParameter_parameter;
-              var name = context.getFormalParameterName(parameterNode);
-              var reference = containerRef.getChild(name);
-              reference.node = node;
-              return DefaultParameterElementImpl.forLinkedNode(
-                this,
-                reference,
-                node,
-              );
-            } else {
-              var name = context.getFormalParameterName(node);
-              var reference = containerRef.getChild(name);
-              reference.node = node;
-              return ParameterElementImpl.forLinkedNodeFactory(
-                this,
-                reference,
-                node,
-              );
-            }
-          }).toList();
-        } else {
-          _parameters = const [];
-        }
-      }
-      if (serializedExecutable != null) {
-        _parameters = ParameterElementImpl.resynthesizeList(
-            serializedExecutable.parameters, this);
-      }
+    if (_parameters != null) return _parameters;
+
+    if (linkedNode != null) {
+      var context = enclosingUnit.linkedContext;
+      var containerRef = reference.getChild('@parameter');
+      var formalParameters = context.getFormalParameters(linkedNode);
+      _parameters = ParameterElementImpl.forLinkedNodeList(
+        this,
+        context,
+        containerRef,
+        formalParameters,
+      );
     }
-    return _parameters ?? const <ParameterElement>[];
+
+    if (serializedExecutable != null) {
+      _parameters = ParameterElementImpl.resynthesizeList(
+          serializedExecutable.parameters, this);
+    }
+
+    return _parameters ??= const <ParameterElement>[];
   }
 
   /// Set the parameters defined by this executable element to the given
@@ -4420,8 +4557,9 @@
   @override
   DartType get returnType {
     if (linkedNode != null) {
-      return _returnType ??=
-          enclosingUnit.linkedContext.getReturnType(linkedNode);
+      if (_returnType != null) return _returnType;
+      var context = enclosingUnit.linkedContext;
+      return _returnType = context.getReturnType(linkedNode);
     }
     if (serializedExecutable != null &&
         _declaredReturnType == null &&
@@ -4438,6 +4576,9 @@
   }
 
   void set returnType(DartType returnType) {
+    if (linkedNode != null) {
+      linkedContext.setReturnType(linkedNode, returnType);
+    }
     _assertNotResynthesized(serializedExecutable);
     _returnType = _checkElementOfType(returnType);
   }
@@ -4480,19 +4621,19 @@
         buffer.write('<');
         for (int i = 0; i < typeParameterCount; i++) {
           if (i > 0) {
-            buffer.write(", ");
+            buffer.write(', ');
           }
           (typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
         }
         buffer.write('>');
       }
-      buffer.write("(");
+      buffer.write('(');
       String closing = null;
       ParameterKind kind = ParameterKind.REQUIRED;
       int parameterCount = parameters.length;
       for (int i = 0; i < parameterCount; i++) {
         if (i > 0) {
-          buffer.write(", ");
+          buffer.write(', ');
         }
         ParameterElement parameter = parameters[i];
         // ignore: deprecated_member_use_from_same_package
@@ -4501,12 +4642,15 @@
           if (closing != null) {
             buffer.write(closing);
           }
-          if (parameterKind == ParameterKind.POSITIONAL) {
-            buffer.write("[");
-            closing = "]";
-          } else if (parameterKind == ParameterKind.NAMED) {
-            buffer.write("{");
-            closing = "}";
+          if (parameter.isOptionalPositional) {
+            buffer.write('[');
+            closing = ']';
+          } else if (parameter.isNamed) {
+            buffer.write('{');
+            if (parameter.isRequiredNamed) {
+              buffer.write('required ');
+            }
+            closing = '}';
           } else {
             closing = null;
           }
@@ -4517,7 +4661,7 @@
       if (closing != null) {
         buffer.write(closing);
       }
-      buffer.write(")");
+      buffer.write(')');
     }
     if (type != null) {
       buffer.write(ElementImpl.RIGHT_ARROW);
@@ -4570,6 +4714,12 @@
         _unlinkedExportNonPublic = null,
         super(null, offset);
 
+  ExportElementImpl.forLinkedNode(
+      LibraryElementImpl enclosing, ExportDirective linkedNode)
+      : _unlinkedExportPublic = null,
+        _unlinkedExportNonPublic = null,
+        super.forLinkedNode(enclosing, null, linkedNode);
+
   /// Initialize using the given serialized information.
   ExportElementImpl.forSerialized(this._unlinkedExportPublic,
       this._unlinkedExportNonPublic, LibraryElementImpl enclosingLibrary)
@@ -4577,12 +4727,21 @@
 
   @override
   List<NamespaceCombinator> get combinators {
-    if (_combinators == null) {
-      if (_unlinkedExportPublic != null) {
-        _combinators = ImportElementImpl._buildCombinators(
-            _unlinkedExportPublic.combinators);
-      }
+    if (_combinators != null) return _combinators;
+
+    if (linkedNode != null) {
+      ExportDirective node = linkedNode;
+      return _combinators = ImportElementImpl._buildCombinators2(
+        enclosingUnit.linkedContext,
+        node.combinators,
+      );
     }
+
+    if (_unlinkedExportPublic != null) {
+      return _combinators = ImportElementImpl._buildCombinators(
+          _unlinkedExportPublic.combinators);
+    }
+
     return _combinators ?? const <NamespaceCombinator>[];
   }
 
@@ -4592,14 +4751,24 @@
   }
 
   @override
+  CompilationUnitElementImpl get enclosingUnit {
+    LibraryElementImpl enclosingLibrary = enclosingElement;
+    return enclosingLibrary._definingCompilationUnit;
+  }
+
+  @override
   LibraryElement get exportedLibrary {
-    if (_exportedLibrary == null) {
-      if (_unlinkedExportNonPublic != null) {
-        LibraryElementImpl library = enclosingElement as LibraryElementImpl;
-        _exportedLibrary =
-            library.resynthesizerContext.buildExportedLibrary(uri);
-      }
+    if (_exportedLibrary != null) return _exportedLibrary;
+
+    if (linkedNode != null) {
+      return _exportedLibrary = linkedContext.directiveLibrary(linkedNode);
     }
+
+    if (_unlinkedExportNonPublic != null) {
+      LibraryElementImpl library = enclosingElement as LibraryElementImpl;
+      _exportedLibrary = library.resynthesizerContext.buildExportedLibrary(uri);
+    }
+
     return _exportedLibrary;
   }
 
@@ -4632,6 +4801,10 @@
 
   @override
   int get nameOffset {
+    if (linkedNode != null) {
+      return linkedContext.getDirectiveOffset(linkedNode);
+    }
+
     int offset = super.nameOffset;
     if (offset == 0 && _unlinkedExportNonPublic != null) {
       return _unlinkedExportNonPublic.offset;
@@ -4700,7 +4873,7 @@
   FieldElementImpl(String name, int offset) : super(name, offset);
 
   FieldElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode) {
     if (!linkedNode.isSynthetic) {
       var enclosingRef = enclosing.reference;
@@ -4720,8 +4893,9 @@
   }
 
   factory FieldElementImpl.forLinkedNodeFactory(
-      ElementImpl enclosing, Reference reference, LinkedNode 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,
@@ -4760,9 +4934,14 @@
 
   @override
   bool get isCovariant {
+    if (linkedNode != null) {
+      return linkedContext.isExplicitlyCovariant(linkedNode);
+    }
+
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.isCovariant;
     }
+
     return hasModifier(Modifier.COVARIANT);
   }
 
@@ -4827,7 +5006,7 @@
       : super(name, nameOffset);
 
   FieldFormalParameterElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created parameter element to have the given [name].
@@ -4843,6 +5022,9 @@
   FieldElement get field {
     if (_field == null) {
       String fieldName;
+      if (linkedNode != null) {
+        fieldName = linkedContext.getFieldFormalParameterName(linkedNode);
+      }
       if (unlinkedParam != null) {
         fieldName = unlinkedParam.name;
       }
@@ -4872,11 +5054,6 @@
 
   @override
   DartType get type {
-    if (linkedNode != null) {
-      return _type ??= enclosingUnit.linkedContext.getType(
-        linkedNode.fieldFormalParameter_type2,
-      );
-    }
     if (unlinkedParam != null &&
         unlinkedParam.type == null &&
         !unlinkedParam.isFunctionTyped &&
@@ -4911,9 +5088,9 @@
   /// [offset].
   FunctionElementImpl(String name, int offset) : super(name, offset);
 
-  FunctionElementImpl.forLinkedNode(CompilationUnitElementImpl enclosingUnit,
-      Reference reference, LinkedNode linkedNode)
-      : super.forLinkedNode(enclosingUnit, reference, linkedNode);
+  FunctionElementImpl.forLinkedNode(ElementImpl enclosing, Reference reference,
+      FunctionDeclaration linkedNode)
+      : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created function element to have the given [name].
   FunctionElementImpl.forNode(Identifier name) : super.forNode(name);
@@ -4940,6 +5117,14 @@
   }
 
   @override
+  String get displayName {
+    if (linkedNode != null) {
+      return reference.name;
+    }
+    return super.displayName;
+  }
+
+  @override
   TypeParameterizedElementMixin get enclosingTypeParameterContext {
     return (enclosingElement as ElementImpl).typeParameterContext;
   }
@@ -4966,13 +5151,11 @@
   ElementKind get kind => ElementKind.FUNCTION;
 
   @override
-  DartType get returnType {
+  String get name {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getType(
-        linkedNode.functionDeclaration_returnType2,
-      );
+      return reference.name;
     }
-    return super.returnType;
+    return super.name;
   }
 
   @override
@@ -5143,6 +5326,10 @@
   /// The type defined by this element.
   FunctionType _type;
 
+  GenericFunctionTypeElementImpl.forLinkedNode(
+      ElementImpl enclosingElement, Reference reference, AstNode linkedNode)
+      : super.forLinkedNode(enclosingElement, reference, linkedNode);
+
   /// Initialize a newly created function element to have no name and the given
   /// [nameOffset]. This is used for function expressions, that have no name.
   GenericFunctionTypeElementImpl.forOffset(int nameOffset)
@@ -5167,6 +5354,15 @@
   @override
   List<ParameterElement> get parameters {
     if (_parameters == null) {
+      if (linkedNode != null) {
+        var context = enclosingUnit.linkedContext;
+        return _parameters = ParameterElementImpl.forLinkedNodeList(
+          this,
+          context,
+          reference.getChild('@parameter'),
+          context.getFormalParameters(linkedNode),
+        );
+      }
       if (_entityRef != null) {
         _parameters = ParameterElementImpl.resynthesizeList(
             _entityRef.syntheticParams, this);
@@ -5188,6 +5384,10 @@
   @override
   DartType get returnType {
     if (_returnType == null) {
+      if (linkedNode != null) {
+        var context = enclosingUnit.linkedContext;
+        return _returnType = context.getReturnType(linkedNode);
+      }
       if (_entityRef != null) {
         _returnType = enclosingUnit.resynthesizerContext.resolveTypeRef(
             this, _entityRef.syntheticReturnType,
@@ -5217,6 +5417,16 @@
     _type = type;
   }
 
+  @override
+  List<TypeParameterElement> get typeParameters {
+    if (linkedNode != null) {
+      if (linkedNode is FunctionTypeAlias) {
+        return const <TypeParameterElement>[];
+      }
+    }
+    return super.typeParameters;
+  }
+
   /// Set the type parameters defined by this function type element to the given
   /// [typeParameters].
   void set typeParameters(List<TypeParameterElement> typeParameters) {
@@ -5300,7 +5510,7 @@
   GenericTypeAliasElementImpl.forLinkedNode(
       CompilationUnitElementImpl enclosingUnit,
       Reference reference,
-      LinkedNode linkedNode)
+      AstNode linkedNode)
       : _unlinkedTypedef = null,
         super.forLinkedNode(enclosingUnit, reference, linkedNode);
 
@@ -5316,6 +5526,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedContext.getCodeLength(linkedNode);
+    }
     if (_unlinkedTypedef != null) {
       return _unlinkedTypedef.codeRange?.length;
     }
@@ -5324,6 +5537,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedContext.getCodeOffset(linkedNode);
+    }
     if (_unlinkedTypedef != null) {
       return _unlinkedTypedef.codeRange?.offset;
     }
@@ -5336,9 +5552,9 @@
   @override
   String get documentationComment {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getCommentText(
-        linkedNode.annotatedNode_comment,
-      );
+      var context = enclosingUnit.linkedContext;
+      var comment = context.getDocumentationComment(linkedNode);
+      return getCommentNodeRawText(comment);
     }
     if (_unlinkedTypedef != null) {
       return _unlinkedTypedef.documentationComment?.text;
@@ -5362,25 +5578,26 @@
     if (_function != null) return _function;
 
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      _function = new GenericFunctionTypeElementImpl.forOffset(-1);
-      _function.enclosingElement = this;
-      _function.returnType = context.getType(
-        linkedNode.functionTypeAlias_returnType2,
-      );
-      var containerRef = reference.getChild('@parameter');
-      var formalParameters = context.getFormalParameters(linkedNode);
-      _function.parameters = formalParameters.map((node) {
-        var name = context.getFormalParameterName(node);
-        var reference = containerRef.getChild(name);
-        reference.node = node;
-        return ParameterElementImpl.forLinkedNodeFactory(
+      if (linkedNode is GenericTypeAlias) {
+        var context = enclosingUnit.linkedContext;
+        var function = context.getGeneticTypeAliasFunction(linkedNode);
+        if (function != null) {
+          var reference = context.getGenericFunctionTypeReference(function);
+          return _function = GenericFunctionTypeElementImpl.forLinkedNode(
+            this,
+            reference,
+            function,
+          );
+        } else {
+          return null;
+        }
+      } else {
+        return _function = GenericFunctionTypeElementImpl.forLinkedNode(
           this,
-          reference,
-          node,
+          reference.getChild('@function'),
+          linkedNode,
         );
-      }).toList();
-      return _function;
+      }
     }
 
     if (_unlinkedTypedef != null) {
@@ -5419,6 +5636,21 @@
     _function = function;
   }
 
+  bool get hasSelfReference {
+    if (linkedNode != null) {
+      return linkedContext.getHasTypedefSelfReference(linkedNode);
+    }
+    return false;
+  }
+
+  @override
+  bool get isSimplyBounded {
+    if (linkedNode != null) {
+      return linkedContext.isSimplyBounded(linkedNode);
+    }
+    return super.isSimplyBounded;
+  }
+
   @override
   ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
 
@@ -5444,6 +5676,10 @@
 
   @override
   int get nameOffset {
+    if (linkedNode != null) {
+      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+    }
+
     int offset = super.nameOffset;
     if (offset == 0 && _unlinkedTypedef != null) {
       return _unlinkedTypedef.nameOffset;
@@ -5579,20 +5815,38 @@
   /// The unlinked representation of the combinator in the summary.
   final UnlinkedCombinator _unlinkedCombinator;
 
+  final LinkedUnitContext linkedContext;
+  final HideCombinator linkedNode;
+
   /// The names that are not to be made visible in the importing library even if
   /// they are defined in the imported library.
   List<String> _hiddenNames;
 
-  HideElementCombinatorImpl() : _unlinkedCombinator = null;
+  HideElementCombinatorImpl()
+      : _unlinkedCombinator = null,
+        linkedContext = null,
+        linkedNode = null;
+
+  HideElementCombinatorImpl.forLinkedNode(this.linkedContext, this.linkedNode)
+      : _unlinkedCombinator = null;
 
   /// Initialize using the given serialized information.
-  HideElementCombinatorImpl.forSerialized(this._unlinkedCombinator);
+  HideElementCombinatorImpl.forSerialized(this._unlinkedCombinator)
+      : linkedContext = null,
+        linkedNode = null;
 
   @override
   List<String> get hiddenNames {
-    if (_unlinkedCombinator != null) {
-      _hiddenNames ??= _unlinkedCombinator.hides.toList(growable: false);
+    if (_hiddenNames != null) return _hiddenNames;
+
+    if (linkedNode != null) {
+      return _hiddenNames = linkedNode.hiddenNames.map((i) => i.name).toList();
     }
+
+    if (_unlinkedCombinator != null) {
+      return _hiddenNames = _unlinkedCombinator.hides.toList(growable: false);
+    }
+
     return _hiddenNames ?? const <String>[];
   }
 
@@ -5654,7 +5908,7 @@
         super(null, offset);
 
   ImportElementImpl.forLinkedNode(
-      LibraryElementImpl enclosing, LinkedNode linkedNode)
+      LibraryElementImpl enclosing, ImportDirective linkedNode)
       : _unlinkedImport = null,
         _linkedDependency = null,
         super.forLinkedNode(enclosing, null, linkedNode);
@@ -5666,11 +5920,20 @@
 
   @override
   List<NamespaceCombinator> get combinators {
-    if (_combinators == null) {
-      if (_unlinkedImport != null) {
-        _combinators = _buildCombinators(_unlinkedImport.combinators);
-      }
+    if (_combinators != null) return _combinators;
+
+    if (linkedNode != null) {
+      ImportDirective node = linkedNode;
+      return _combinators = ImportElementImpl._buildCombinators2(
+        enclosingUnit.linkedContext,
+        node.combinators,
+      );
     }
+
+    if (_unlinkedImport != null) {
+      return _combinators = _buildCombinators(_unlinkedImport.combinators);
+    }
+
     return _combinators ?? const <NamespaceCombinator>[];
   }
 
@@ -5699,15 +5962,9 @@
     if (_importedLibrary != null) return _importedLibrary;
 
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var relativeUriStr = context.getStringContent(
-        linkedNode.uriBasedDirective_uri,
-      );
-      var relativeUri = Uri.parse(relativeUriStr);
-      var uri = resolveRelativeUri(librarySource.uri, relativeUri);
-      var elementFactory = context.bundleContext.elementFactory;
-      return _importedLibrary = elementFactory.libraryOfUri('$uri');
+      return _importedLibrary = linkedContext.directiveLibrary(linkedNode);
     }
+
     if (_linkedDependency != null) {
       if (_importedLibrary == null) {
         LibraryElementImpl library = enclosingElement as LibraryElementImpl;
@@ -5719,6 +5976,7 @@
         }
       }
     }
+
     return _importedLibrary;
   }
 
@@ -5729,6 +5987,10 @@
 
   @override
   bool get isDeferred {
+    if (linkedNode != null) {
+      ImportDirective linkedNode = this.linkedNode;
+      return linkedNode.deferredKeyword != null;
+    }
     if (_unlinkedImport != null) {
       return _unlinkedImport.isDeferred;
     }
@@ -5748,11 +6010,6 @@
 
   @override
   List<ElementAnnotation> get metadata {
-    if (linkedNode != null) {
-      if (_metadata != null) return _metadata;
-      var metadata = enclosingUnit.linkedContext.getMetadataOrEmpty(linkedNode);
-      return _metadata = _buildAnnotations2(enclosingUnit, metadata);
-    }
     if (_metadata == null) {
       if (_unlinkedImport != null) {
         return _metadata = _buildAnnotations(
@@ -5769,6 +6026,10 @@
 
   @override
   int get nameOffset {
+    if (linkedNode != null) {
+      return linkedContext.getDirectiveOffset(linkedNode);
+    }
+
     int offset = super.nameOffset;
     if (offset == 0 && _unlinkedImport != null) {
       if (_unlinkedImport.isImplicit) {
@@ -5786,12 +6047,27 @@
   }
 
   PrefixElement get prefix {
-    if (_prefix == null) {
-      if (_unlinkedImport != null && _unlinkedImport.prefixReference != 0) {
-        LibraryElementImpl library = enclosingElement as LibraryElementImpl;
-        _prefix = new PrefixElementImpl.forSerialized(_unlinkedImport, library);
+    if (_prefix != null) return _prefix;
+
+    if (linkedNode != null) {
+      ImportDirective linkedNode = this.linkedNode;
+      var prefix = linkedNode.prefix;
+      if (prefix != null) {
+        var name = prefix.name;
+        var library = enclosingElement as LibraryElementImpl;
+        _prefix = new PrefixElementImpl.forLinkedNode(
+          library,
+          library.reference.getChild('@prefix').getChild(name),
+          prefix,
+        );
       }
     }
+
+    if (_unlinkedImport != null && _unlinkedImport.prefixReference != 0) {
+      LibraryElementImpl library = enclosingElement as LibraryElementImpl;
+      _prefix = new PrefixElementImpl.forSerialized(_unlinkedImport, library);
+    }
+
     return _prefix;
   }
 
@@ -5897,6 +6173,19 @@
       return const <NamespaceCombinator>[];
     }
   }
+
+  static List<NamespaceCombinator> _buildCombinators2(
+      LinkedUnitContext context, List<Combinator> combinators) {
+    return combinators.map((node) {
+      if (node is HideCombinator) {
+        return HideElementCombinatorImpl.forLinkedNode(context, node);
+      }
+      if (node is ShowCombinator) {
+        return ShowElementCombinatorImpl.forLinkedNode(context, node);
+      }
+      throw UnimplementedError('${node.runtimeType}');
+    }).toList();
+  }
 }
 
 /// A concrete implementation of a [LabelElement].
@@ -6028,12 +6317,16 @@
       this.nameLength,
       this.linkedContext,
       Reference reference,
-      LinkedNode linkedNode)
+      CompilationUnit linkedNode)
       : resynthesizerContext = null,
         unlinkedDefiningUnit = null,
         super.forLinkedNode(null, reference, linkedNode) {
     _name = name;
     _nameOffset = offset;
+    setResolutionCapability(
+        LibraryResolutionCapability.resolvedTypeNames, true);
+    setResolutionCapability(
+        LibraryResolutionCapability.constantExpressions, true);
   }
 
   /// Initialize a newly created library element in the given [context] to have
@@ -6096,6 +6389,10 @@
 
   @override
   String get documentationComment {
+    if (linkedNode != null) {
+      var comment = linkedContext.getLibraryDocumentationComment(linkedNode);
+      return getCommentNodeRawText(comment);
+    }
     if (unlinkedDefiningUnit != null) {
       return unlinkedDefiningUnit.libraryDocumentationComment?.text;
     }
@@ -6103,9 +6400,21 @@
   }
 
   FunctionElement get entryPoint {
-    if (resynthesizerContext != null) {
-      _entryPoint ??= resynthesizerContext.findEntryPoint();
+    if (_entryPoint != null) return _entryPoint;
+
+    if (linkedContext != null) {
+      var namespace = library.exportNamespace;
+      var entryPoint = namespace.get(FunctionElement.MAIN_FUNCTION_NAME);
+      if (entryPoint is FunctionElement) {
+        return _entryPoint = entryPoint;
+      }
+      return null;
     }
+
+    if (resynthesizerContext != null) {
+      return _entryPoint = resynthesizerContext.findEntryPoint();
+    }
+
     return _entryPoint;
   }
 
@@ -6127,9 +6436,17 @@
 
   @override
   Namespace get exportNamespace {
+    if (_exportNamespace != null) return _exportNamespace;
+
+    if (linkedNode != null) {
+      var elements = linkedContext.bundleContext.elementFactory;
+      return _exportNamespace = elements.buildExportNamespace(source.uri);
+    }
+
     if (resynthesizerContext != null) {
       _exportNamespace ??= resynthesizerContext.buildExportNamespace();
     }
+
     return _exportNamespace;
   }
 
@@ -6139,34 +6456,42 @@
 
   @override
   List<ExportElement> get exports {
-    if (_exports == null) {
-      if (unlinkedDefiningUnit != null) {
-        List<UnlinkedExportNonPublic> unlinkedNonPublicExports =
-            unlinkedDefiningUnit.exports;
-        List<UnlinkedExportPublic> unlinkedPublicExports =
-            unlinkedDefiningUnit.publicNamespace.exports;
-        assert(unlinkedDefiningUnit.exports.length ==
-            unlinkedPublicExports.length);
-        int length = unlinkedNonPublicExports.length;
-        if (length != 0) {
-          List<ExportElement> exports = new List<ExportElement>();
-          for (int i = 0; i < length; i++) {
-            UnlinkedExportPublic serializedExportPublic =
-                unlinkedPublicExports[i];
-            UnlinkedExportNonPublic serializedExportNonPublic =
-                unlinkedNonPublicExports[i];
-            ExportElementImpl exportElement =
-                new ExportElementImpl.forSerialized(
-                    serializedExportPublic, serializedExportNonPublic, library);
-            exports.add(exportElement);
-          }
-          _exports = exports;
-        } else {
-          _exports = const <ExportElement>[];
+    if (_exports != null) return _exports;
+
+    if (linkedNode != null) {
+      var unit = linkedContext.unit_withDirectives;
+      return _exports = unit.directives
+          .whereType<ExportDirective>()
+          .map((node) => ExportElementImpl.forLinkedNode(this, node))
+          .toList();
+    }
+
+    if (unlinkedDefiningUnit != null) {
+      List<UnlinkedExportNonPublic> unlinkedNonPublicExports =
+          unlinkedDefiningUnit.exports;
+      List<UnlinkedExportPublic> unlinkedPublicExports =
+          unlinkedDefiningUnit.publicNamespace.exports;
+      assert(
+          unlinkedDefiningUnit.exports.length == unlinkedPublicExports.length);
+      int length = unlinkedNonPublicExports.length;
+      if (length != 0) {
+        List<ExportElement> exports = new List<ExportElement>();
+        for (int i = 0; i < length; i++) {
+          UnlinkedExportPublic serializedExportPublic =
+              unlinkedPublicExports[i];
+          UnlinkedExportNonPublic serializedExportNonPublic =
+              unlinkedNonPublicExports[i];
+          ExportElementImpl exportElement = new ExportElementImpl.forSerialized(
+              serializedExportPublic, serializedExportNonPublic, library);
+          exports.add(exportElement);
         }
+        _exports = exports;
+      } else {
+        _exports = const <ExportElement>[];
       }
     }
-    return _exports ?? const <ExportElement>[];
+
+    return _exports ??= const <ExportElement>[];
   }
 
   /// Set the specifications of all of the exports defined in this library to
@@ -6181,6 +6506,19 @@
 
   @override
   bool get hasExtUri {
+    if (linkedNode != null) {
+      var unit = linkedContext.unit_withDirectives;
+      for (var import in unit.directives) {
+        if (import is ImportDirective) {
+          var uriStr = linkedContext.getSelectedUri(import);
+          if (DartUriResolver.isDartExtUri(uriStr)) {
+            return true;
+          }
+        }
+      }
+      return false;
+    }
+
     if (unlinkedDefiningUnit != null) {
       List<UnlinkedImport> unlinkedImports = unlinkedDefiningUnit.imports;
       for (UnlinkedImport import in unlinkedImports) {
@@ -6228,20 +6566,32 @@
 
   @override
   List<ImportElement> get imports {
-    if (_imports == null) {
-      if (linkedNode != null) {
-        return _imports = linkedNode.compilationUnit_directives
-            .where((node) => node.kind == LinkedNodeKind.importDirective)
-            .map((node) {
-          return ImportElementImpl.forLinkedNode(this, node);
-        }).toList();
+    if (_imports != null) return _imports;
+
+    if (linkedNode != null) {
+      var unit = linkedContext.unit_withDirectives;
+      _imports = unit.directives
+          .whereType<ImportDirective>()
+          .map((node) => ImportElementImpl.forLinkedNode(this, node))
+          .toList();
+      var hasCore = _imports.any((import) {
+        return import.importedLibrary?.isDartCore ?? false;
+      });
+      if (!hasCore) {
+        var elements = linkedContext.bundleContext.elementFactory;
+        _imports.add(ImportElementImpl(-1)
+          ..importedLibrary = elements.libraryOfUri('dart:core')
+          ..isSynthetic = true);
       }
-      if (unlinkedDefiningUnit != null) {
-        _imports = buildImportsFromSummary(this, unlinkedDefiningUnit.imports,
-            resynthesizerContext.linkedLibrary.importDependencies);
-      }
+      return _imports;
     }
-    return _imports ?? const <ImportElement>[];
+
+    if (unlinkedDefiningUnit != null) {
+      _imports = buildImportsFromSummary(this, unlinkedDefiningUnit.imports,
+          resynthesizerContext.linkedLibrary.importDependencies);
+    }
+
+    return _imports ??= const <ImportElement>[];
   }
 
   /// Set the specifications of all of the imports defined in this library to
@@ -6310,6 +6660,14 @@
   }
 
   @override
+  bool get isSynthetic {
+    if (linkedNode != null) {
+      return linkedContext.isSynthetic;
+    }
+    return super.isSynthetic;
+  }
+
+  @override
   ElementKind get kind => ElementKind.LIBRARY;
 
   @override
@@ -6403,21 +6761,19 @@
 
   @override
   List<ElementAnnotation> get metadata {
+    if (_metadata != null) return _metadata;
+
     if (linkedNode != null) {
-      if (_metadata != null) return _metadata;
-      CompilationUnitElementImpl enclosingUnit = _definingCompilationUnit;
-      var context = enclosingUnit.linkedContext;
-      var metadata = context.getMetadataOrEmpty(linkedNode);
-      return _metadata = _buildAnnotations2(enclosingUnit, metadata);
+      var metadata = linkedContext.getLibraryMetadata(linkedNode);
+      return _metadata = _buildAnnotations2(definingCompilationUnit, metadata);
     }
-    if (_metadata == null) {
-      if (unlinkedDefiningUnit != null) {
-        _metadata = _buildAnnotations(
-            _definingCompilationUnit as CompilationUnitElementImpl,
-            unlinkedDefiningUnit.libraryAnnotations);
-        return _metadata;
-      }
+
+    if (unlinkedDefiningUnit != null) {
+      return _metadata = _buildAnnotations(
+          _definingCompilationUnit as CompilationUnitElementImpl,
+          unlinkedDefiningUnit.libraryAnnotations);
     }
+
     return super.metadata;
   }
 
@@ -6441,8 +6797,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;
   }
@@ -6748,6 +7111,17 @@
   }
 
   @override
+  bool get isLate {
+    if (linkedNode != null) {
+      return enclosingUnit.linkedContext.isLate(linkedNode);
+    }
+    if (_unlinkedVariable != null) {
+      return _unlinkedVariable.isLate;
+    }
+    return hasModifier(Modifier.LATE);
+  }
+
+  @override
   bool get isPotentiallyMutatedInClosure => true;
 
   @override
@@ -6794,8 +7168,8 @@
   /// given [offset].
   MethodElementImpl(String name, int offset) : super(name, offset);
 
-  MethodElementImpl.forLinkedNode(Reference reference, LinkedNode linkedNode,
-      ClassElementImpl enclosingClass)
+  MethodElementImpl.forLinkedNode(ClassElementImpl enclosingClass,
+      Reference reference, MethodDeclaration linkedNode)
       : super.forLinkedNode(enclosingClass, reference, linkedNode);
 
   /// Initialize a newly created method element to have the given [name].
@@ -6829,14 +7203,6 @@
       super.enclosingElement as ClassElementImpl;
 
   @override
-  bool get isAbstract {
-    if (linkedNode != null) {
-      return !isExternal && enclosingUnit.linkedContext.isAbstract(linkedNode);
-    }
-    return super.isAbstract;
-  }
-
-  @override
   bool get isOperator {
     String name = displayName;
     if (name.isEmpty) {
@@ -6852,7 +7218,7 @@
   @override
   bool get isStatic {
     if (linkedNode != null) {
-      return linkedNode.methodDeclaration_modifierKeyword != 0;
+      return enclosingUnit.linkedContext.isStatic(linkedNode);
     }
     if (serializedExecutable != null) {
       return serializedExecutable.isStatic;
@@ -6879,16 +7245,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
@@ -6954,6 +7310,10 @@
   /// given [offset] in the file that contains the declaration of this element.
   MixinElementImpl(String name, int offset) : super(name, offset);
 
+  MixinElementImpl.forLinkedNode(CompilationUnitElementImpl enclosing,
+      Reference reference, MixinDeclaration linkedNode)
+      : super.forLinkedNode(enclosing, reference, linkedNode);
+
   /// Initialize a newly created class element to have the given [name].
   MixinElementImpl.forNode(Identifier name) : super.forNode(name);
 
@@ -6969,24 +7329,43 @@
   bool get isMixin => true;
 
   @override
+  List<InterfaceType> get mixins => const <InterfaceType>[];
+
+  @override
   List<InterfaceType> get superclassConstraints {
-    if (_superclassConstraints == null) {
-      if (_unlinkedClass != null) {
-        List<InterfaceType> constraints;
-        if (_unlinkedClass.superclassConstraints.isNotEmpty) {
-          ResynthesizerContext context = enclosingUnit.resynthesizerContext;
-          constraints = _unlinkedClass.superclassConstraints
-              .map((EntityRef t) => context.resolveTypeRef(this, t))
-              .where(_isInterfaceTypeInterface)
-              .cast<InterfaceType>()
-              .toList(growable: false);
-        }
-        if (constraints == null || constraints.isEmpty) {
-          constraints = [context.typeProvider.objectType];
-        }
-        _superclassConstraints = constraints;
+    if (_superclassConstraints != null) return _superclassConstraints;
+
+    if (linkedNode != null) {
+      List<InterfaceType> constraints;
+      var onClause = enclosingUnit.linkedContext.getOnClause(linkedNode);
+      if (onClause != null) {
+        constraints = onClause.superclassConstraints
+            .map((node) => node.type)
+            .whereType<InterfaceType>()
+            .toList();
       }
+      if (constraints == null || constraints.isEmpty) {
+        constraints = [context.typeProvider.objectType];
+      }
+      return _superclassConstraints = constraints;
     }
+
+    if (_unlinkedClass != null) {
+      List<InterfaceType> constraints;
+      if (_unlinkedClass.superclassConstraints.isNotEmpty) {
+        ResynthesizerContext context = enclosingUnit.resynthesizerContext;
+        constraints = _unlinkedClass.superclassConstraints
+            .map((EntityRef t) => context.resolveTypeRef(this, t))
+            .where(_isInterfaceTypeInterface)
+            .cast<InterfaceType>()
+            .toList(growable: false);
+      }
+      if (constraints == null || constraints.isEmpty) {
+        constraints = [context.typeProvider.objectType];
+      }
+      return _superclassConstraints = constraints;
+    }
+
     return _superclassConstraints ?? const <InterfaceType>[];
   }
 
@@ -7002,11 +7381,17 @@
 
   @override
   List<String> get superInvokedNames {
-    if (_superInvokedNames == null) {
-      if (_unlinkedClass != null) {
-        _superInvokedNames = _unlinkedClass.superInvokedNames;
-      }
+    if (_superInvokedNames != null) return _superInvokedNames;
+
+    if (linkedNode != null) {
+      return _superInvokedNames =
+          linkedContext.getMixinSuperInvokedNames(linkedNode);
     }
+
+    if (_unlinkedClass != null) {
+      return _superInvokedNames = _unlinkedClass.superInvokedNames;
+    }
+
     return _superInvokedNames ?? const <String>[];
   }
 
@@ -7107,25 +7492,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 LATE = const Modifier('LATE', 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,
@@ -7141,6 +7529,7 @@
     GETTER,
     HAS_EXT_URI,
     IMPLICIT_TYPE,
+    LATE,
     MIXIN_APPLICATION,
     REFERENCES_SUPER,
     SETTER,
@@ -7221,6 +7610,12 @@
   bool get hasLiteral => false;
 
   @override
+  bool get hasMustCallSuper => false;
+
+  @override
+  bool get hasOptionalTypeArgs => false;
+
+  @override
   bool get hasOverride => false;
 
   @override
@@ -7417,6 +7812,30 @@
   }
 }
 
+/// The synthetic element representing the declaration of the type `Never`.
+class NeverElementImpl extends ElementImpl implements TypeDefiningElement {
+  /// Return the unique instance of this class.
+  static NeverElementImpl get instance =>
+      BottomTypeImpl.instance.element as NeverElementImpl;
+
+  @override
+  BottomTypeImpl type;
+
+  /// Initialize a newly created instance of this class. Instances of this class
+  /// should <b>not</b> be created except as part of creating the type
+  /// associated with this element. The single instance of this class should be
+  /// accessed through the method [instance].
+  NeverElementImpl() : super('Never', -1) {
+    setModifier(Modifier.SYNTHETIC, true);
+  }
+
+  @override
+  ElementKind get kind => ElementKind.NEVER;
+
+  @override
+  T accept<T>(ElementVisitor<T> visitor) => null;
+}
+
 /// A [VariableElementImpl], which is not a parameter.
 abstract class NonParameterVariableElementImpl extends VariableElementImpl {
   /// The unlinked representation of the variable in the summary.
@@ -7429,7 +7848,7 @@
         super(name, offset);
 
   NonParameterVariableElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : _unlinkedVariable = null,
         super.forLinkedNode(enclosing, reference, linkedNode);
 
@@ -7445,6 +7864,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedContext.getCodeLength(linkedNode);
+    }
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.codeRange?.length;
     }
@@ -7453,6 +7875,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedContext.getCodeOffset(linkedNode);
+    }
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.codeRange?.offset;
     }
@@ -7462,9 +7887,9 @@
   @override
   String get documentationComment {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getCommentText(
-        linkedNode.variableDeclaration_declaration.comment,
-      );
+      var context = enclosingUnit.linkedContext;
+      var comment = context.getDocumentationComment(linkedNode);
+      return getCommentNodeRawText(comment);
     }
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.documentationComment?.text;
@@ -7474,6 +7899,9 @@
 
   @override
   bool get hasImplicitType {
+    if (linkedNode != null) {
+      return linkedContext.hasImplicitType(linkedNode);
+    }
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.type == null;
     }
@@ -7489,6 +7917,11 @@
   @override
   FunctionElement get initializer {
     if (_initializer == null) {
+      if (linkedNode != null) {
+        if (linkedContext.readInitializer(linkedNode) != null) {
+          _initializer = new FunctionElementImpl('', -1)..isSynthetic = true;
+        }
+      }
       if (_unlinkedVariable != null) {
         UnlinkedExecutable unlinkedInitializer = _unlinkedVariable.initializer;
         if (unlinkedInitializer != null) {
@@ -7550,9 +7983,7 @@
   @override
   String get name {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getSimpleName(
-        linkedNode.variableDeclaration_name,
-      );
+      return reference.name;
     }
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.name;
@@ -7563,10 +7994,9 @@
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getSimpleOffset(
-        linkedNode.variableDeclaration_name,
-      );
+      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
     }
+
     int offset = super.nameOffset;
     if (offset == 0) {
       if (_unlinkedVariable != null) {
@@ -7589,12 +8019,19 @@
 
   @override
   void set type(DartType type) {
+    if (linkedNode != null) {
+      return linkedContext.setVariableType(linkedNode, type);
+    }
     _assertNotResynthesized(_unlinkedVariable);
     _type = _checkElementOfType(type);
   }
 
   @override
   TopLevelInferenceError get typeInferenceError {
+    if (linkedNode != null) {
+      return linkedContext.getTypeInferenceError(linkedNode);
+    }
+
     if (_unlinkedVariable != null) {
       return enclosingUnit.resynthesizerContext
           .getTypeInferenceError(_unlinkedVariable.inferredTypeSlot);
@@ -7614,6 +8051,16 @@
   /// The unlinked representation of the parameter in the summary.
   final UnlinkedParam unlinkedParam;
 
+  /// A list containing all of the parameters defined by this parameter element.
+  /// There will only be parameters if this parameter is a function typed
+  /// parameter.
+  List<ParameterElement> _parameters;
+
+  /// A list containing all of the type parameters defined for this parameter
+  /// element. There will only be parameters if this parameter is a function
+  /// typed parameter.
+  List<TypeParameterElement> _typeParameters;
+
   /// The kind of this parameter.
   ParameterKind _parameterKind;
 
@@ -7636,27 +8083,23 @@
         super(name, nameOffset);
 
   ParameterElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, FormalParameter linkedNode)
       : unlinkedParam = null,
         super.forLinkedNode(enclosing, reference, linkedNode);
 
   factory ParameterElementImpl.forLinkedNodeFactory(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode) {
-    var kind = linkedNode.kind;
-    if (kind == LinkedNodeKind.fieldFormalParameter) {
+      ElementImpl enclosing, Reference reference, FormalParameter node) {
+    if (node is FieldFormalParameter) {
       return FieldFormalParameterElementImpl.forLinkedNode(
         enclosing,
         reference,
-        linkedNode,
+        node,
       );
-    } else if (kind == LinkedNodeKind.simpleFormalParameter) {
-      return ParameterElementImpl.forLinkedNode(
-        enclosing,
-        reference,
-        linkedNode,
-      );
+    } else if (node is FunctionTypedFormalParameter ||
+        node is SimpleFormalParameter) {
+      return ParameterElementImpl.forLinkedNode(enclosing, reference, node);
     } else {
-      throw UnimplementedError('$kind');
+      throw UnimplementedError('${node.runtimeType}');
     }
   }
 
@@ -7676,7 +8119,7 @@
       {bool synthetic: false}) {
     ParameterElementImpl element;
     if (unlinkedParameter.isInitializingFormal) {
-      if (unlinkedParameter.kind == UnlinkedParamKind.required) {
+      if (unlinkedParameter.kind == UnlinkedParamKind.requiredPositional) {
         element = new FieldFormalParameterElementImpl.forSerialized(
             unlinkedParameter, enclosingElement);
       } else {
@@ -7684,7 +8127,7 @@
             unlinkedParameter, enclosingElement);
       }
     } else {
-      if (unlinkedParameter.kind == UnlinkedParamKind.required) {
+      if (unlinkedParameter.kind == UnlinkedParamKind.requiredPositional) {
         element = new ParameterElementImpl.forSerialized(
             unlinkedParameter, enclosingElement);
       } else {
@@ -7708,6 +8151,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedContext.getCodeLength(linkedNode);
+    }
     if (unlinkedParam != null) {
       return unlinkedParam.codeRange?.length;
     }
@@ -7716,6 +8162,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedContext.getCodeOffset(linkedNode);
+    }
     if (unlinkedParam != null) {
       return unlinkedParam.codeRange?.offset;
     }
@@ -7724,6 +8173,10 @@
 
   @override
   String get defaultValueCode {
+    if (linkedNode != null) {
+      return linkedContext.getDefaultValueCode(linkedNode);
+    }
+
     if (unlinkedParam != null) {
       if (unlinkedParam.initializer?.bodyExpr == null) {
         return null;
@@ -7741,6 +8194,9 @@
 
   @override
   bool get hasImplicitType {
+    if (linkedNode != null) {
+      return linkedContext.hasImplicitType(linkedNode);
+    }
     if (unlinkedParam != null) {
       return unlinkedParam.type == null && !unlinkedParam.isFunctionTyped;
     }
@@ -7757,6 +8213,9 @@
   /// when it overrides a method in a supertype that has a corresponding
   /// covariant parameter.
   bool get inheritsCovariant {
+    if (linkedNode != null) {
+      return linkedContext.getInheritsCovariant(linkedNode);
+    }
     if (unlinkedParam != null) {
       return enclosingUnit.resynthesizerContext
           .inheritsCovariant(unlinkedParam.inheritsCovariantSlot);
@@ -7767,6 +8226,11 @@
 
   /// Record whether or not this parameter inherits from a covariant parameter.
   void set inheritsCovariant(bool value) {
+    if (linkedNode != null) {
+      linkedContext.setInheritsCovariant(linkedNode, value);
+      return;
+    }
+
     _assertNotResynthesized(unlinkedParam);
     _inheritsCovariant = value;
   }
@@ -7774,6 +8238,11 @@
   @override
   FunctionElement get initializer {
     if (_initializer == null) {
+      if (linkedNode != null) {
+        if (linkedContext.readInitializer(linkedNode) != null) {
+          _initializer = new FunctionElementImpl('', -1)..isSynthetic = true;
+        }
+      }
       if (unlinkedParam != null) {
         UnlinkedExecutable unlinkedInitializer = unlinkedParam.initializer;
         if (unlinkedInitializer != null) {
@@ -7811,13 +8280,6 @@
 
   @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 (isExplicitlyCovariant || inheritsCovariant) {
       return true;
     }
@@ -7826,6 +8288,9 @@
 
   /// Return true if this parameter is explicitly marked as being covariant.
   bool get isExplicitlyCovariant {
+    if (linkedNode != null) {
+      return linkedContext.isExplicitlyCovariant(linkedNode);
+    }
     if (unlinkedParam != null) {
       return unlinkedParam.isExplicitlyCovariant;
     }
@@ -7842,14 +8307,8 @@
   @override
   bool get isFinal {
     if (linkedNode != null) {
-      if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
-        var parameter = linkedNode.defaultFormalParameter_parameter;
-        return parameter.simpleFormalParameter_keyword != 0;
-      }
-      if (linkedNode.kind == LinkedNodeKind.fieldFormalParameter) {
-        return false;
-      }
-      return linkedNode.simpleFormalParameter_keyword != 0;
+      FormalParameter linkedNode = this.linkedNode;
+      return linkedNode.isFinal;
     }
     if (unlinkedParam != null) {
       return unlinkedParam.isFinal;
@@ -7898,9 +8357,7 @@
   @override
   int get nameOffset {
     if (linkedNode != null) {
-      return enclosingUnit.linkedContext.getSimpleOffset(
-        linkedNode.normalFormalParameter_identifier,
-      );
+      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
     }
 
     int offset = super.nameOffset;
@@ -7908,7 +8365,8 @@
       if (unlinkedParam != null) {
         if (isSynthetic ||
             (unlinkedParam.name.isEmpty &&
-                unlinkedParam.kind != UnlinkedParamKind.named &&
+                unlinkedParam.kind != UnlinkedParamKind.requiredNamed &&
+                unlinkedParam.kind != UnlinkedParamKind.optionalNamed &&
                 enclosingElement is GenericFunctionTypeElement)) {
           return -1;
         }
@@ -7923,26 +8381,24 @@
     if (_parameterKind != null) return _parameterKind;
 
     if (linkedNode != null) {
-      if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
-        if (linkedNode.defaultFormalParameter_isNamed) {
-          return _parameterKind = ParameterKind.NAMED;
-        } else {
-          return _parameterKind = ParameterKind.POSITIONAL;
-        }
-      }
-      return _parameterKind = ParameterKind.REQUIRED;
+      FormalParameter linkedNode = this.linkedNode;
+      // ignore: deprecated_member_use_from_same_package
+      return linkedNode.kind;
     }
     if (unlinkedParam != null) {
       switch (unlinkedParam.kind) {
-        case UnlinkedParamKind.named:
+        case UnlinkedParamKind.optionalNamed:
           _parameterKind = ParameterKind.NAMED;
           break;
-        case UnlinkedParamKind.positional:
+        case UnlinkedParamKind.optionalPositional:
           _parameterKind = ParameterKind.POSITIONAL;
           break;
-        case UnlinkedParamKind.required:
+        case UnlinkedParamKind.requiredPositional:
           _parameterKind = ParameterKind.REQUIRED;
           break;
+        case UnlinkedParamKind.requiredNamed:
+          _parameterKind = ParameterKind.NAMED_REQUIRED;
+          break;
       }
     }
     return _parameterKind;
@@ -7955,22 +8411,47 @@
 
   @override
   List<ParameterElement> get parameters {
-    return const <ParameterElement>[];
+    if (_parameters != null) return _parameters;
+
+    if (linkedNode != null) {
+      var context = enclosingUnit.linkedContext;
+      var formalParameters = context.getFormalParameters(linkedNode);
+      if (formalParameters != null) {
+        var containerRef = reference.getChild('@parameter');
+        return _parameters = ParameterElementImpl.forLinkedNodeList(
+          this,
+          context,
+          containerRef,
+          formalParameters,
+        );
+      } else {
+        return _parameters ??= const <ParameterElement>[];
+      }
+    }
+
+    if (unlinkedParam != null) {
+      _resynthesizeTypeAndParameters();
+      return _parameters ??= const <ParameterElement>[];
+    }
+
+    return _parameters ??= const <ParameterElement>[];
+  }
+
+  /// Set the parameters defined by this executable element to the given
+  /// [parameters].
+  void set parameters(List<ParameterElement> parameters) {
+    for (ParameterElement parameter in parameters) {
+      (parameter as ParameterElementImpl).enclosingElement = this;
+    }
+    this._parameters = parameters;
   }
 
   @override
   DartType get type {
     if (linkedNode != null) {
       if (_type != null) return _type;
-      if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
-        var parameter = linkedNode.defaultFormalParameter_parameter;
-        return _type = enclosingUnit.linkedContext.getType(
-          parameter.simpleFormalParameter_type2,
-        );
-      }
-      return _type = enclosingUnit.linkedContext.getType(
-        linkedNode.simpleFormalParameter_type2,
-      );
+      var context = enclosingUnit.linkedContext;
+      return _type = context.getType(linkedNode);
     }
     _resynthesizeTypeAndParameters();
     return super.type;
@@ -7978,6 +8459,10 @@
 
   @override
   TopLevelInferenceError get typeInferenceError {
+    if (linkedNode != null) {
+      return linkedContext.getTypeInferenceError(linkedNode);
+    }
+
     if (unlinkedParam != null) {
       return enclosingUnit.resynthesizerContext
           .getTypeInferenceError(unlinkedParam.inferredTypeSlot);
@@ -7988,7 +8473,34 @@
 
   @override
   List<TypeParameterElement> get typeParameters {
-    return const <TypeParameterElement>[];
+    if (_typeParameters != null) return _typeParameters;
+
+    if (linkedNode != null) {
+      var typeParameters = linkedContext.getTypeParameters2(linkedNode);
+      if (typeParameters == null) {
+        return _typeParameters = const [];
+      }
+      var containerRef = reference.getChild('@typeParameter');
+      return _typeParameters =
+          typeParameters.typeParameters.map<TypeParameterElement>((node) {
+        var reference = containerRef.getChild(node.name.name);
+        if (reference.hasElementFor(node)) {
+          return reference.element as TypeParameterElement;
+        }
+        return TypeParameterElementImpl.forLinkedNode(this, reference, node);
+      }).toList();
+    }
+
+    return _typeParameters ??= const <TypeParameterElement>[];
+  }
+
+  /// Set the type parameters defined by this parameter element to the given
+  /// [typeParameters].
+  void set typeParameters(List<TypeParameterElement> typeParameters) {
+    for (TypeParameterElement parameter in typeParameters) {
+      (parameter as TypeParameterElementImpl).enclosingElement = this;
+    }
+    this._typeParameters = typeParameters;
   }
 
   @override
@@ -8014,21 +8526,20 @@
 
   @override
   void appendTo(StringBuffer buffer) {
-    String left = "";
-    String right = "";
-    while (true) {
-      if (parameterKind == ParameterKind.NAMED) {
-        left = "{";
-        right = "}";
-      } else if (parameterKind == ParameterKind.POSITIONAL) {
-        left = "[";
-        right = "]";
-      } else if (parameterKind == ParameterKind.REQUIRED) {}
-      break;
+    if (isNamed) {
+      buffer.write('{');
+      if (isRequiredNamed) {
+        buffer.write('required ');
+      }
+      appendToWithoutDelimiters(buffer);
+      buffer.write('}');
+    } else if (isOptionalPositional) {
+      buffer.write('[');
+      appendToWithoutDelimiters(buffer);
+      buffer.write(']');
+    } else {
+      appendToWithoutDelimiters(buffer);
     }
-    buffer.write(left);
-    appendToWithoutDelimiters(buffer);
-    buffer.write(right);
   }
 
   @deprecated
@@ -8060,9 +8571,10 @@
         var typeElement = new GenericFunctionTypeElementImpl.forOffset(-1);
         typeElement.enclosingElement = this;
 
-        typeElement.parameters = ParameterElementImpl.resynthesizeList(
+        _parameters = ParameterElementImpl.resynthesizeList(
             unlinkedParam.parameters, typeElement,
             synthetic: isSynthetic);
+        typeElement.parameters = _parameters;
 
         typeElement.returnType = enclosingUnit.resynthesizerContext
             .resolveTypeRef(this, unlinkedParam.type);
@@ -8080,6 +8592,57 @@
     }
   }
 
+  static List<ParameterElement> forLinkedNodeList(
+      ElementImpl enclosing,
+      LinkedUnitContext context,
+      Reference containerRef,
+      List<FormalParameter> formalParameters) {
+    if (formalParameters == null) {
+      return const [];
+    }
+
+    return formalParameters.map((node) {
+      if (node is DefaultFormalParameter) {
+        NormalFormalParameter parameterNode = node.parameter;
+        var name = parameterNode.identifier?.name ?? '';
+        var reference = containerRef.getChild(name);
+        reference.node2 = node;
+        if (parameterNode is FieldFormalParameter) {
+          return DefaultFieldFormalParameterElementImpl.forLinkedNode(
+            enclosing,
+            reference,
+            node,
+          );
+        } else {
+          return DefaultParameterElementImpl.forLinkedNode(
+            enclosing,
+            reference,
+            node,
+          );
+        }
+      } else {
+        if (node.identifier == null) {
+          return ParameterElementImpl.forLinkedNodeFactory(
+            enclosing,
+            containerRef.getChild(''),
+            node,
+          );
+        } else {
+          var name = node.identifier.name;
+          var reference = containerRef.getChild(name);
+          if (reference.hasElementFor(node)) {
+            return reference.element as ParameterElement;
+          }
+          return ParameterElementImpl.forLinkedNodeFactory(
+            enclosing,
+            reference,
+            node,
+          );
+        }
+      }
+    }).toList();
+  }
+
   /// Create and return [ParameterElement]s for the given [unlinkedParameters].
   static List<ParameterElement> resynthesizeList(
       List<UnlinkedParam> unlinkedParameters, ElementImpl enclosingElement,
@@ -8115,11 +8678,28 @@
   @override
   bool get inheritsCovariant {
     PropertyInducingElement variable = setter.variable;
-    if (variable is FieldElementImpl && variable._unlinkedVariable != null) {
-      return enclosingUnit.resynthesizerContext
-          .inheritsCovariant(variable._unlinkedVariable.inheritsCovariantSlot);
+    if (variable is FieldElementImpl) {
+      if (variable.linkedNode != null) {
+        var context = variable.linkedContext;
+        return context.getInheritsCovariant(variable.linkedNode);
+      }
+      if (variable._unlinkedVariable != null) {
+        return enclosingUnit.resynthesizerContext.inheritsCovariant(
+            variable._unlinkedVariable.inheritsCovariantSlot);
+      }
     }
-    return super.inheritsCovariant;
+    return false;
+  }
+
+  @override
+  void set inheritsCovariant(bool value) {
+    PropertyInducingElement variable = setter.variable;
+    if (variable is FieldElementImpl) {
+      if (variable.linkedNode != null) {
+        var context = variable.linkedContext;
+        return context.setInheritsCovariant(variable.linkedNode, value);
+      }
+    }
   }
 
   @override
@@ -8152,10 +8732,14 @@
 /// [ParameterElement].
 mixin ParameterElementMixin implements ParameterElement {
   @override
-  bool get isNamed => parameterKind == ParameterKind.NAMED;
+  bool get isNamed =>
+      parameterKind == ParameterKind.NAMED ||
+      parameterKind == ParameterKind.NAMED_REQUIRED;
 
   @override
-  bool get isNotOptional => parameterKind == ParameterKind.REQUIRED;
+  bool get isNotOptional =>
+      parameterKind == ParameterKind.REQUIRED ||
+      parameterKind == ParameterKind.NAMED_REQUIRED;
 
   @override
   bool get isOptional =>
@@ -8163,6 +8747,9 @@
       parameterKind == ParameterKind.POSITIONAL;
 
   @override
+  bool get isOptionalNamed => parameterKind == ParameterKind.NAMED;
+
+  @override
   bool get isOptionalPositional => parameterKind == ParameterKind.POSITIONAL;
 
   @override
@@ -8171,21 +8758,22 @@
       parameterKind == ParameterKind.REQUIRED;
 
   @override
+  bool get isRequiredNamed => parameterKind == ParameterKind.NAMED_REQUIRED;
+
+  @override
+  bool get isRequiredPositional => parameterKind == ParameterKind.REQUIRED;
+
+  @override
   // Overridden to remove the 'deprecated' annotation.
   ParameterKind get parameterKind;
 
   @override
   void appendToWithoutDelimiters(StringBuffer buffer) {
     buffer.write(type);
-    buffer.write(" ");
+    buffer.write(' ');
     buffer.write(displayName);
     if (defaultValueCode != null) {
-      if (parameterKind == ParameterKind.NAMED) {
-        buffer.write(": ");
-      }
-      if (parameterKind == ParameterKind.POSITIONAL) {
-        buffer.write(" = ");
-      }
+      buffer.write(' = ');
       buffer.write(defaultValueCode);
     }
   }
@@ -8202,6 +8790,11 @@
       : _unlinkedImport = null,
         super(name, nameOffset);
 
+  PrefixElementImpl.forLinkedNode(
+      ElementImpl enclosing, Reference reference, SimpleIdentifier linkedNode)
+      : _unlinkedImport = null,
+        super.forLinkedNode(enclosing, reference, linkedNode);
+
   /// Initialize a newly created prefix element to have the given [name].
   PrefixElementImpl.forNode(Identifier name)
       : _unlinkedImport = null,
@@ -8220,9 +8813,6 @@
       super.enclosingElement as LibraryElement;
 
   @override
-  String get identifier => "_${super.identifier}";
-
-  @override
   List<LibraryElement> get importedLibraries => const <LibraryElement>[];
 
   @override
@@ -8230,6 +8820,9 @@
 
   @override
   String get name {
+    if (linkedNode != null) {
+      return reference.name;
+    }
     if (_name == null) {
       if (_unlinkedImport != null) {
         LibraryElementImpl library = enclosingElement as LibraryElementImpl;
@@ -8242,6 +8835,9 @@
 
   @override
   int get nameOffset {
+    if (linkedNode != null) {
+      return (linkedNode as SimpleIdentifier).offset;
+    }
     int offset = super.nameOffset;
     if (offset == 0 && _unlinkedImport != null) {
       return _unlinkedImport.prefixOffset;
@@ -8270,7 +8866,7 @@
   PropertyAccessorElementImpl(String name, int offset) : super(name, offset);
 
   PropertyAccessorElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created property accessor element to have the given
@@ -8343,14 +8939,6 @@
   }
 
   @override
-  bool get isAbstract {
-    if (linkedNode != null) {
-      return enclosingUnit.linkedContext.isAbstract(linkedNode);
-    }
-    return super.isAbstract;
-  }
-
-  @override
   bool get isGetter {
     if (linkedNode != null) {
       return enclosingUnit.linkedContext.isGetter(linkedNode);
@@ -8401,7 +8989,11 @@
   @override
   String get name {
     if (linkedNode != null) {
-      return reference.name;
+      var name = reference.name;
+      if (isSetter) {
+        return '$name=';
+      }
+      return name;
     }
     if (serializedExecutable != null) {
       return serializedExecutable.name;
@@ -8538,7 +9130,7 @@
   PropertyInducingElementImpl(String name, int offset) : super(name, offset);
 
   PropertyInducingElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created element to have the given [name].
@@ -8552,6 +9144,17 @@
   @override
   bool get isConstantEvaluated => true;
 
+  @override
+  bool get isLate {
+    if (linkedNode != null) {
+      return enclosingUnit.linkedContext.isLate(linkedNode);
+    }
+    if (_unlinkedVariable != null) {
+      return _unlinkedVariable.isLate;
+    }
+    return hasModifier(Modifier.LATE);
+  }
+
   @deprecated
   @override
   DartType get propagatedType => null;
@@ -8563,9 +9166,7 @@
   DartType get type {
     if (linkedNode != null) {
       if (_type != null) return _type;
-      return _type = enclosingUnit.linkedContext.getType(
-        linkedNode.variableDeclaration_type2,
-      );
+      return _type = linkedContext.getType(linkedNode);
     }
     if (isSynthetic && _type == null) {
       if (getter != null) {
@@ -8638,6 +9239,9 @@
   /// The unlinked representation of the combinator in the summary.
   final UnlinkedCombinator _unlinkedCombinator;
 
+  final LinkedUnitContext linkedContext;
+  final ShowCombinator linkedNode;
+
   /// The names that are to be made visible in the importing library if they are
   /// defined in the imported library.
   List<String> _shownNames;
@@ -8649,10 +9253,18 @@
   /// The offset of the 'show' keyword of this element.
   int _offset = 0;
 
-  ShowElementCombinatorImpl() : _unlinkedCombinator = null;
+  ShowElementCombinatorImpl()
+      : _unlinkedCombinator = null,
+        linkedContext = null,
+        linkedNode = null;
+
+  ShowElementCombinatorImpl.forLinkedNode(this.linkedContext, this.linkedNode)
+      : _unlinkedCombinator = null;
 
   /// Initialize using the given serialized information.
-  ShowElementCombinatorImpl.forSerialized(this._unlinkedCombinator);
+  ShowElementCombinatorImpl.forSerialized(this._unlinkedCombinator)
+      : linkedContext = null,
+        linkedNode = null;
 
   @override
   int get end {
@@ -8669,6 +9281,9 @@
 
   @override
   int get offset {
+    if (linkedNode != null) {
+      return linkedNode.keyword.offset;
+    }
     if (_unlinkedCombinator != null) {
       return _unlinkedCombinator.offset;
     }
@@ -8682,9 +9297,16 @@
 
   @override
   List<String> get shownNames {
-    if (_unlinkedCombinator != null) {
-      _shownNames ??= _unlinkedCombinator.shows.toList(growable: false);
+    if (_shownNames != null) return _shownNames;
+
+    if (linkedNode != null) {
+      return _shownNames = linkedNode.shownNames.map((i) => i.name).toList();
     }
+
+    if (_unlinkedCombinator != null) {
+      return _shownNames = _unlinkedCombinator.shows.toList(growable: false);
+    }
+
     return _shownNames ?? const <String>[];
   }
 
@@ -8739,7 +9361,7 @@
   TopLevelVariableElementImpl(String name, int offset) : super(name, offset);
 
   TopLevelVariableElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode) {
     if (!linkedNode.isSynthetic) {
       var enclosingRef = enclosing.reference;
@@ -8759,7 +9381,7 @@
   }
 
   factory TopLevelVariableElementImpl.forLinkedNodeFactory(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode) {
+      ElementImpl enclosing, Reference reference, AstNode linkedNode) {
     if (enclosing.enclosingUnit.linkedContext.isConst(linkedNode)) {
       return ConstTopLevelVariableElementImpl.forLinkedNode(
         enclosing,
@@ -8821,9 +9443,7 @@
         super(name, offset);
 
   TypeParameterElementImpl.forLinkedNode(
-      TypeParameterizedElementMixin enclosing,
-      Reference reference,
-      LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, TypeParameter linkedNode)
       : _unlinkedTypeParam = null,
         super.forLinkedNode(enclosing, reference, linkedNode);
 
@@ -8850,13 +9470,8 @@
     if (_bound != null) return _bound;
 
     if (linkedNode != null) {
-      var bound = linkedNode.typeParameter_bound;
-      if (bound != null) {
-        var context = enclosingUnit.linkedContext;
-        return _bound = context.getTypeAnnotationType(bound);
-      } else {
-        return null;
-      }
+      var context = enclosingUnit.linkedContext;
+      return _bound = context.getTypeParameterBound(linkedNode)?.type;
     }
 
     if (_unlinkedTypeParam != null) {
@@ -8878,6 +9493,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedContext.getCodeLength(linkedNode);
+    }
     if (_unlinkedTypeParam != null) {
       return _unlinkedTypeParam.codeRange?.length;
     }
@@ -8886,12 +9504,25 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedContext.getCodeOffset(linkedNode);
+    }
     if (_unlinkedTypeParam != null) {
       return _unlinkedTypeParam.codeRange?.offset;
     }
     return super.codeOffset;
   }
 
+  /// The default value of the type parameter. It is used to provide the
+  /// corresponding missing type argument in type annotations and as the
+  /// fall-back type value in type inference.
+  DartType get defaultType {
+    if (linkedNode != null) {
+      return linkedContext.getDefaultType(linkedNode);
+    }
+    return null;
+  }
+
   @override
   String get displayName => name;
 
@@ -8910,7 +9541,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;
@@ -8920,6 +9552,10 @@
 
   @override
   int get nameOffset {
+    if (linkedNode != null) {
+      return enclosingUnit.linkedContext.getNameOffset(linkedNode);
+    }
+
     int offset = super.nameOffset;
     if (offset == 0 && _unlinkedTypeParam != null) {
       return _unlinkedTypeParam.nameOffset;
@@ -8928,13 +9564,7 @@
   }
 
   TypeParameterType get type {
-    if (linkedNode != null) {
-      _type ??= new TypeParameterTypeImpl(this);
-    }
-    if (_unlinkedTypeParam != null) {
-      _type ??= new TypeParameterTypeImpl(this);
-    }
-    return _type;
+    return _type ??= new TypeParameterTypeImpl(this);
   }
 
   void set type(TypeParameterType type) {
@@ -8984,16 +9614,17 @@
     if (_typeParameterElements != null) return _typeParameterElements;
 
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-      var containerRef = reference.getChild('@typeParameter');
-      var typeParameters = context.getTypeParameters(linkedNode);
+      var typeParameters = linkedContext.getTypeParameters2(linkedNode);
       if (typeParameters == null) {
         return _typeParameterElements = const [];
       }
-      return _typeParameterElements = typeParameters.map((node) {
-        var name = context.getSimpleName(node.typeParameter_name);
-        var reference = containerRef.getChild(name);
-        reference.node = node;
+      var containerRef = reference.getChild('@typeParameter');
+      return _typeParameterElements =
+          typeParameters.typeParameters.map<TypeParameterElement>((node) {
+        var reference = containerRef.getChild(node.name.name);
+        if (reference.hasElementFor(node)) {
+          return reference.element as TypeParameterElement;
+        }
         return TypeParameterElementImpl.forLinkedNode(this, reference, node);
       }).toList();
     }
@@ -9107,7 +9738,7 @@
   UriReferencedElementImpl(String name, int offset) : super(name, offset);
 
   UriReferencedElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize using the given serialized information.
@@ -9171,7 +9802,7 @@
   VariableElementImpl(String name, int offset) : super(name, offset);
 
   VariableElementImpl.forLinkedNode(
-      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      ElementImpl enclosing, Reference reference, AstNode linkedNode)
       : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created variable element to have the given [name].
@@ -9277,6 +9908,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/analyzer/lib/src/dart/element/handle.dart b/analyzer/lib/src/dart/element/handle.dart
index 67f47f7..f316eb7 100644
--- a/analyzer/lib/src/dart/element/handle.dart
+++ b/analyzer/lib/src/dart/element/handle.dart
@@ -395,6 +395,12 @@
   bool get hasLiteral => actualElement.hasLiteral;
 
   @override
+  bool get hasMustCallSuper => actualElement.hasMustCallSuper;
+
+  @override
+  bool get hasOptionalTypeArgs => actualElement.hasOptionalTypeArgs;
+
+  @override
   bool get hasOverride => actualElement.hasOverride;
 
   @override
@@ -981,6 +987,9 @@
       super.actualElement as LocalVariableElement;
 
   @override
+  bool get isLate => actualElement.isLate;
+
+  @override
   ElementKind get kind => ElementKind.LOCAL_VARIABLE;
 
   @override
@@ -1168,14 +1177,17 @@
   @override
   PropertyAccessorElement get getter => actualElement.getter;
 
+  @override
+  bool get isConstantEvaluated => actualElement.isConstantEvaluated;
+
+  @override
+  bool get isLate => actualElement.isLate;
+
   @deprecated
   @override
   DartType get propagatedType => null;
 
   @override
-  bool get isConstantEvaluated => actualElement.isConstantEvaluated;
-
-  @override
   PropertyAccessorElement get setter => actualElement.setter;
 }
 
@@ -1256,10 +1268,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/analyzer/lib/src/dart/element/inheritance_manager2.dart b/analyzer/lib/src/dart/element/inheritance_manager2.dart
index b2fb92f..8bdc5c7 100644
--- a/analyzer/lib/src/dart/element/inheritance_manager2.dart
+++ b/analyzer/lib/src/dart/element/inheritance_manager2.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/dart/element/member.dart b/analyzer/lib/src/dart/element/member.dart
index 845d59d..fc58f4f 100644
--- a/analyzer/lib/src/dart/element/member.dart
+++ b/analyzer/lib/src/dart/element/member.dart
@@ -255,6 +255,9 @@
   @override
   bool get isEnumConstant => baseElement.isEnumConstant;
 
+  @override
+  bool get isLate => baseElement.isLate;
+
   @deprecated
   @override
   bool get isVirtual => baseElement.isVirtual;
@@ -425,6 +428,12 @@
   bool get hasLiteral => _baseElement.hasLiteral;
 
   @override
+  bool get hasMustCallSuper => _baseElement.hasMustCallSuper;
+
+  @override
+  bool get hasOptionalTypeArgs => _baseElement.hasOptionalTypeArgs;
+
+  @override
   bool get hasOverride => _baseElement.hasOverride;
 
   @override
@@ -642,10 +651,10 @@
         if (closing != null) {
           buffer.write(closing);
         }
-        if (parameterKind == ParameterKind.POSITIONAL) {
+        if (parameter.isOptionalPositional) {
           buffer.write("[");
           closing = "]";
-        } else if (parameterKind == ParameterKind.NAMED) {
+        } else if (parameter.isNamed) {
           buffer.write("{");
           closing = "}";
         } else {
diff --git a/analyzer/lib/src/dart/element/type.dart b/analyzer/lib/src/dart/element/type.dart
index 5fbed4f..e1b62e2 100644
--- a/analyzer/lib/src/dart/element/type.dart
+++ b/analyzer/lib/src/dart/element/type.dart
@@ -56,35 +56,16 @@
  */
 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(new NeverElementImpl(), "Never") {
+    (element as NeverElementImpl).type = this;
+  }
 
   @override
   int get hashCode => 0;
@@ -93,6 +74,9 @@
   bool get isBottom => true;
 
   @override
+  NullabilitySuffix get nullabilitySuffix => NullabilitySuffix.none;
+
+  @override
   bool operator ==(Object object) => identical(object, this);
 
   @override
@@ -134,16 +118,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 +130,7 @@
  */
 class CircularFunctionTypeImpl extends DynamicTypeImpl
     implements _FunctionTypeImplLazy {
-  CircularFunctionTypeImpl() : super._circular(Nullability.indeterminate);
+  CircularFunctionTypeImpl() : super._circular();
 
   @override
   List<ParameterElement> get baseParameters => const <ParameterElement>[];
@@ -262,7 +239,7 @@
   FunctionTypeImpl substitute3(List<DartType> argumentTypes) => this;
 
   @override
-  TypeImpl withNullability(Nullability nullability) => this;
+  TypeImpl withNullability(NullabilitySuffix nullabilitySuffix) => this;
 
   @override
   void _forEachParameterType(
@@ -294,7 +271,7 @@
  * `...`.
  */
 class CircularTypeImpl extends DynamicTypeImpl {
-  CircularTypeImpl() : super._circular(Nullability.indeterminate);
+  CircularTypeImpl() : super._circular();
 
   @override
   bool operator ==(Object object) => object is CircularTypeImpl;
@@ -332,9 +309,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 +323,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 +336,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 +351,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 +360,9 @@
   bool get isDynamic => true;
 
   @override
+  NullabilitySuffix get nullabilitySuffix => NullabilitySuffix.none;
+
+  @override
   bool operator ==(Object object) => identical(object, this);
 
   @override
@@ -451,16 +409,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 +420,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 +428,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 +445,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 +461,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.
 
@@ -553,25 +504,25 @@
     var name = original.name ?? "";
     var element = original.element;
     var function = new FunctionElementImpl(name, -1);
-    function.enclosingElement = element.enclosingElement;
+    function.enclosingElement = element?.enclosingElement;
     function.isSynthetic = true;
     function.returnType = newType.returnType;
     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
@@ -653,10 +604,16 @@
 
   @override
   Map<String, DartType> get namedParameterTypes {
+    // TODO(brianwilkerson) This implementation breaks the contract because the
+    //  parameters will not necessarily be returned in the order in which they
+    //  were declared.
     Map<String, DartType> types = <String, DartType>{};
     _forEachParameterType(ParameterKind.NAMED, (name, type) {
       types[name] = type;
     });
+    _forEachParameterType(ParameterKind.NAMED_REQUIRED, (name, type) {
+      types[name] = type;
+    });
     return types;
   }
 
@@ -723,6 +680,9 @@
   @override
   void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes,
       {bool withNullability = false}) {
+    // TODO(paulberry): update to use the new "Function" syntax to avoid
+    // ambiguity with NNBD, and eliminate code duplication with
+    // _ElementWriter.writeType.  See issue #35818.
     if (visitedTypes.add(this)) {
       if (typeFormals.isNotEmpty) {
         // To print a type with type variables, first make sure we have unique
@@ -930,7 +890,7 @@
       return this;
     }
     return new _FunctionTypeImplStrict._(returnType, typeFormals, parameters,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   @override
@@ -1106,7 +1066,7 @@
     var tOptional = <ParameterElement>[];
     var tNamed = <String, ParameterElement>{};
     for (var p in tParams) {
-      if (p.isNotOptional) {
+      if (p.isRequiredPositional) {
         tRequired.add(p);
       } else if (p.isOptionalPositional) {
         tOptional.add(p);
@@ -1120,7 +1080,7 @@
     var sOptional = <ParameterElement>[];
     var sNamed = <String, ParameterElement>{};
     for (var p in sParams) {
-      if (p.isNotOptional) {
+      if (p.isRequiredPositional) {
         sRequired.add(p);
       } else if (p.isOptionalPositional) {
         sOptional.add(p);
@@ -1297,7 +1257,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 +1300,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 +1309,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 +1326,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 +1334,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,
@@ -1541,6 +1501,15 @@
   }
 
   @override
+  bool get isDartCoreString {
+    ClassElement element = this.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "String" && element.library.isDartCore;
+  }
+
+  @override
   bool get isObject => element.supertype == null && !element.isMixin;
 
   @override
@@ -2220,7 +2189,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();
@@ -2249,7 +2218,7 @@
       return this;
     } else {
       return new InterfaceTypeImpl._(element, name, prunedTypedefs,
-          nullability: nullability)
+          nullabilitySuffix: nullabilitySuffix)
         ..typeArguments = typeArguments;
     }
   }
@@ -2273,7 +2242,7 @@
     }
 
     InterfaceTypeImpl newType =
-        new InterfaceTypeImpl(element, prune, nullability);
+        new InterfaceTypeImpl(element, prune, nullabilitySuffix);
     newType.typeArguments = newTypeArguments;
     return newType;
   }
@@ -2284,9 +2253,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);
   }
 
   /**
@@ -2673,16 +2643,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 =
@@ -2752,24 +2725,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
 }
 
 /**
@@ -2825,6 +2809,9 @@
   bool get isDartCoreNull => false;
 
   @override
+  bool get isDartCoreString => false;
+
+  @override
   bool get isDynamic => false;
 
   @override
@@ -2837,9 +2824,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
@@ -2970,20 +2957,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;
     }
   }
@@ -3071,14 +3062,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
@@ -3242,16 +3233,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);
@@ -3261,9 +3252,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);
   }
 
   /**
@@ -3285,87 +3276,6 @@
 }
 
 /**
- * The unique instance of the class `UndefinedTypeImpl` implements the type of
- * type names that couldn't be resolved.
- *
- * This class behaves like DynamicTypeImpl in almost every respect, to reduce
- * cascading errors.
- */
-class UndefinedTypeImpl extends TypeImpl {
-  /**
-   * The unique instance of this class.
-   */
-  static final UndefinedTypeImpl instance = new UndefinedTypeImpl._();
-
-  /**
-   * Prevent the creation of instances of this class.
-   */
-  UndefinedTypeImpl._()
-      : super(DynamicElementImpl.instance, Keyword.DYNAMIC.lexeme);
-
-  @override
-  int get hashCode => 1;
-
-  @override
-  bool get isDynamic => true;
-
-  @override
-  bool get isUndefined => true;
-
-  @override
-  Nullability get nullability => Nullability.indeterminate;
-
-  @override
-  bool operator ==(Object object) => identical(object, this);
-
-  @override
-  bool isMoreSpecificThan(DartType type,
-      [bool withDynamic = false, Set<Element> visitedElements]) {
-    // T is S
-    if (identical(this, type)) {
-      return true;
-    }
-    // else
-    return withDynamic;
-  }
-
-  @override
-  bool isSubtypeOf(DartType type) => true;
-
-  @override
-  bool isSupertypeOf(DartType type) => true;
-
-  @override
-  TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
-
-  @override
-  DartType replaceTopAndBottom(TypeProvider typeProvider,
-      {bool isCovariant = true}) {
-    if (isCovariant) {
-      return typeProvider.nullType;
-    } else {
-      return this;
-    }
-  }
-
-  @override
-  DartType substitute2(
-      List<DartType> argumentTypes, List<DartType> parameterTypes,
-      [List<FunctionTypeAliasElement> prune]) {
-    int length = parameterTypes.length;
-    for (int i = 0; i < length; i++) {
-      if (parameterTypes[i] == this) {
-        return argumentTypes[i];
-      }
-    }
-    return this;
-  }
-
-  @override
-  TypeImpl withNullability(Nullability nullability) => this;
-}
-
-/**
  * The type `void`.
  */
 abstract class VoidType implements DartType {
@@ -3381,33 +3291,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;
@@ -3416,6 +3305,9 @@
   bool get isVoid => true;
 
   @override
+  NullabilitySuffix get nullabilitySuffix => NullabilitySuffix.none;
+
+  @override
   bool operator ==(Object object) => identical(object, this);
 
   @override
@@ -3452,16 +3344,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;
   }
 }
 
@@ -3514,9 +3399,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.
@@ -3556,7 +3441,7 @@
   @override
   List<String> get normalParameterNames {
     return baseParameters
-        .where((parameter) => parameter.isNotOptional)
+        .where((parameter) => parameter.isRequiredPositional)
         .map((parameter) => parameter.name)
         .toList();
   }
@@ -3723,7 +3608,7 @@
 
     return new _FunctionTypeImplLazy._(element, name, prunedTypedefs,
         newTypeArgs, _returnType, _parameters, true,
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   @override
@@ -3745,7 +3630,7 @@
           .toList(growable: false);
       return new _FunctionTypeImplLazy._(element, name, prune, typeArgs,
           _returnType, _parameters, _isInstantiated,
-          nullability: nullability);
+          nullabilitySuffix: nullabilitySuffix);
     }
   }
 
@@ -3774,15 +3659,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
@@ -3830,8 +3715,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;
@@ -3843,8 +3728,10 @@
   List<FunctionTypeAliasElement> get newPrune => const [];
 
   @override
-  List<String> get normalParameterNames =>
-      parameters.where((p) => p.isNotOptional).map((p) => p.name).toList();
+  List<String> get normalParameterNames => parameters
+      .where((p) => p.isRequiredPositional)
+      .map((p) => p.name)
+      .toList();
 
   @override
   List<String> get optionalParameterNames => parameters
@@ -3887,7 +3774,7 @@
         returnType.substitute2(argumentTypes, parameterTypes),
         const [],
         _transformOrShare(parameters, transformParameter),
-        nullability: nullability);
+        nullabilitySuffix: nullabilitySuffix);
   }
 
   @override
@@ -3947,14 +3834,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/analyzer/lib/src/dart/element/type_algebra.dart b/analyzer/lib/src/dart/element/type_algebra.dart
new file mode 100644
index 0000000..d73ab28
--- /dev/null
+++ b/analyzer/lib/src/dart/element/type_algebra.dart
@@ -0,0 +1,413 @@
+// 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/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_visitor.dart';
+import 'package:analyzer/src/summary2/function_type_builder.dart';
+import 'package:analyzer/src/summary2/named_type_builder.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.
+///
+/// This will copy only the sub-terms of [type] that contain substituted
+/// variables; all other [DartType] objects will be reused.
+///
+/// In particular, if no type parameters were substituted, this is guaranteed
+/// to return the [type] instance (not a copy), so the caller may use
+/// [identical] to efficiently check if a distinct type was created.
+DartType substitute(
+  DartType type,
+  Map<TypeParameterElement, DartType> substitution,
+) {
+  if (substitution.isEmpty) {
+    return type;
+  }
+  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;
+
+  const Substitution();
+
+  DartType getSubstitute(TypeParameterElement parameter, bool upperBound);
+
+  DartType substituteType(DartType type, {bool contravariant: false}) {
+    return new _TopSubstitutor(this, contravariant).visit(type);
+  }
+
+  /// Substitutes the type parameters on the class of [type] with the
+  /// type arguments provided in [type].
+  static Substitution fromInterfaceType(InterfaceType type) {
+    if (type.typeArguments.isEmpty) {
+      return _NullSubstitution.instance;
+    }
+    return fromPairs(type.element.typeParameters, type.typeArguments);
+  }
+
+  /// Substitutes each parameter to the type it maps to in [map].
+  static Substitution fromMap(Map<TypeParameterElement, DartType> map) {
+    if (map.isEmpty) {
+      return _NullSubstitution.instance;
+    }
+    return new _MapSubstitution(map, map);
+  }
+
+  /// Substitutes the Nth parameter in [parameters] with the Nth type in
+  /// [types].
+  static Substitution fromPairs(
+    List<TypeParameterElement> parameters,
+    List<DartType> types,
+  ) {
+    assert(parameters.length == types.length);
+    if (parameters.isEmpty) {
+      return _NullSubstitution.instance;
+    }
+    return fromMap(
+      new Map<TypeParameterElement, DartType>.fromIterables(
+        parameters,
+        types,
+      ),
+    );
+  }
+
+  /// Substitutes all occurrences of the given type parameters with the
+  /// corresponding upper or lower bound, depending on the variance of the
+  /// context where it occurs.
+  ///
+  /// For example the type `(T) => T` with the bounds `bottom <: T <: num`
+  /// becomes `(bottom) => num` (in this example, `num` is the upper bound,
+  /// and `bottom` is the lower bound).
+  ///
+  /// This is a way to obtain an upper bound for a type while eliminating all
+  /// references to certain type variables.
+  static Substitution fromUpperAndLowerBounds(
+    Map<TypeParameterElement, DartType> upper,
+    Map<TypeParameterElement, DartType> lower,
+  ) {
+    if (upper.isEmpty && lower.isEmpty) {
+      return _NullSubstitution.instance;
+    }
+    return new _MapSubstitution(upper, lower);
+  }
+}
+
+class _FreshTypeParametersSubstitutor extends _TypeSubstitutor {
+  final Map<TypeParameterElement, DartType> substitution = {};
+
+  _FreshTypeParametersSubstitutor(_TypeSubstitutor outer) : super(outer);
+
+  TypeParameterElement freshTypeParameter(TypeParameterElement element) {
+    var freshElement = new TypeParameterElementImpl(element.name, -1);
+    var freshType = new TypeParameterTypeImpl(freshElement);
+    freshElement.type = freshType;
+    substitution[element] = freshType;
+    if (element.bound != null) {
+      freshElement.bound = visit(element.bound);
+    }
+    return freshElement;
+  }
+
+  DartType lookup(TypeParameterElement parameter, bool upperBound) {
+    return substitution[parameter];
+  }
+}
+
+class _MapSubstitution extends Substitution {
+  final Map<TypeParameterElement, DartType> upper;
+  final Map<TypeParameterElement, DartType> lower;
+
+  _MapSubstitution(this.upper, this.lower);
+
+  DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
+    return upperBound ? upper[parameter] : lower[parameter];
+  }
+}
+
+class _NullSubstitution extends Substitution {
+  static const _NullSubstitution instance = const _NullSubstitution();
+
+  const _NullSubstitution();
+
+  DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
+    return new TypeParameterTypeImpl(parameter);
+  }
+
+  @override
+  DartType substituteType(DartType type, {bool contravariant: false}) => type;
+}
+
+class _TopSubstitutor extends _TypeSubstitutor {
+  final Substitution substitution;
+
+  _TopSubstitutor(this.substitution, bool contravariant) : super(null) {
+    if (contravariant) {
+      invertVariance();
+    }
+  }
+
+  @override
+  TypeParameterElement freshTypeParameter(TypeParameterElement element) {
+    throw 'Create a fresh environment first';
+  }
+
+  @override
+  DartType lookup(TypeParameterElement parameter, bool upperBound) {
+    return substitution.getSubstitute(parameter, upperBound);
+  }
+}
+
+abstract class _TypeSubstitutor extends DartTypeVisitor<DartType> {
+  final _TypeSubstitutor outer;
+  bool covariantContext = true;
+
+  /// The number of times a variable from this environment has been used in
+  /// a substitution.
+  ///
+  /// There is a strict requirement that we must return the same instance for
+  /// types that were not altered by the substitution.  This counter lets us
+  /// check quickly if anything happened in a substitution.
+  int useCounter = 0;
+
+  _TypeSubstitutor(this.outer) {
+    covariantContext = outer == null ? true : outer.covariantContext;
+  }
+
+  void bumpCountersUntil(_TypeSubstitutor target) {
+    var substitutor = this;
+    while (substitutor != target) {
+      substitutor.useCounter++;
+      substitutor = substitutor.outer;
+    }
+    target.useCounter++;
+  }
+
+  TypeParameterElement freshTypeParameter(TypeParameterElement element);
+
+  List<TypeParameterElement> freshTypeParameters(
+      List<TypeParameterElement> parameters) {
+    if (parameters.isEmpty) {
+      return const <TypeParameterElement>[];
+    }
+    return parameters.map(freshTypeParameter).toList();
+  }
+
+  DartType getSubstitute(TypeParameterElement parameter) {
+    var environment = this;
+    while (environment != null) {
+      var replacement = environment.lookup(parameter, covariantContext);
+      if (replacement != null) {
+        bumpCountersUntil(environment);
+        return replacement;
+      }
+      environment = environment.outer;
+    }
+    return null;
+  }
+
+  void invertVariance() {
+    covariantContext = !covariantContext;
+  }
+
+  DartType lookup(TypeParameterElement parameter, bool upperBound);
+
+  _FreshTypeParametersSubstitutor newInnerEnvironment() {
+    return new _FreshTypeParametersSubstitutor(this);
+  }
+
+  DartType visit(DartType type) {
+    return DartTypeVisitor.visit(type, this);
+  }
+
+  @override
+  DartType visitBottomType(BottomTypeImpl type) => type;
+
+  @override
+  DartType visitDynamicType(DynamicTypeImpl type) => type;
+
+  @override
+  DartType visitFunctionType(FunctionType type) {
+    // This is a bit tricky because we have to generate fresh type parameters
+    // in order to change the bounds.  At the same time, if the function type
+    // was unaltered, we have to return the [type] object (not a copy!).
+    // Substituting a type for a fresh type variable should not be confused
+    // with a "real" substitution.
+    //
+    // Create an inner environment to generate fresh type parameters.  The use
+    // counter on the inner environment tells if the fresh type parameters have
+    // any uses, but does not tell if the resulting function type is distinct.
+    // Our own use counter will get incremented if something from our
+    // environment has been used inside the function.
+    var inner = type.typeFormals.isEmpty ? this : newInnerEnvironment();
+    int before = this.useCounter;
+
+    // Invert the variance when translating parameters.
+    inner.invertVariance();
+
+    var typeFormals = inner.freshTypeParameters(type.typeFormals);
+
+    var parameters = type.parameters.map((parameter) {
+      var type = inner.visit(parameter.type);
+      return ParameterElementImpl.synthetic(
+        parameter.name,
+        type,
+        // ignore: deprecated_member_use_from_same_package
+        parameter.parameterKind,
+      );
+    }).toList();
+
+    inner.invertVariance();
+
+    var returnType = inner.visit(type.returnType);
+
+    if (this.useCounter == before) return type;
+
+    return FunctionTypeImpl.synthetic(returnType, typeFormals, parameters);
+  }
+
+  @override
+  DartType visitFunctionTypeBuilder(FunctionTypeBuilder type) {
+    // This is a bit tricky because we have to generate fresh type parameters
+    // in order to change the bounds.  At the same time, if the function type
+    // was unaltered, we have to return the [type] object (not a copy!).
+    // Substituting a type for a fresh type variable should not be confused
+    // with a "real" substitution.
+    //
+    // Create an inner environment to generate fresh type parameters.  The use
+    // counter on the inner environment tells if the fresh type parameters have
+    // any uses, but does not tell if the resulting function type is distinct.
+    // Our own use counter will get incremented if something from our
+    // environment has been used inside the function.
+    var inner = type.typeFormals.isEmpty ? this : newInnerEnvironment();
+    int before = this.useCounter;
+
+    // Invert the variance when translating parameters.
+    inner.invertVariance();
+
+    var typeFormals = inner.freshTypeParameters(type.typeFormals);
+
+    var parameters = type.parameters.map((parameter) {
+      var type = inner.visit(parameter.type);
+      return ParameterElementImpl.synthetic(
+        parameter.name,
+        type,
+        // ignore: deprecated_member_use_from_same_package
+        parameter.parameterKind,
+      );
+    }).toList();
+
+    inner.invertVariance();
+
+    var returnType = inner.visit(type.returnType);
+
+    if (this.useCounter == before) return type;
+
+    return FunctionTypeBuilder(
+      typeFormals,
+      parameters,
+      returnType,
+      type.nullabilitySuffix,
+    );
+  }
+
+  @override
+  DartType visitInterfaceType(InterfaceType type) {
+    if (type.typeArguments.isEmpty) {
+      return type;
+    }
+
+    int before = useCounter;
+    var typeArguments = type.typeArguments.map(visit).toList();
+    if (useCounter == before) {
+      return type;
+    }
+
+    return new InterfaceTypeImpl.explicit(type.element, typeArguments);
+  }
+
+  @override
+  DartType visitNamedType(NamedTypeBuilder type) {
+    if (type.arguments.isEmpty) {
+      return type;
+    }
+
+    int before = useCounter;
+    var arguments = type.arguments.map(visit).toList();
+    if (useCounter == before) {
+      return type;
+    }
+
+    return new NamedTypeBuilder(
+      type.element,
+      arguments,
+      type.nullabilitySuffix,
+    );
+  }
+
+  @override
+  DartType visitTypeParameterType(TypeParameterType type) {
+    return getSubstitute(type.element) ?? type;
+  }
+
+  @override
+  DartType visitVoidType(VoidType type) => type;
+}
diff --git a/analyzer/lib/src/dart/element/type_visitor.dart b/analyzer/lib/src/dart/element/type_visitor.dart
new file mode 100644
index 0000000..08b8de6
--- /dev/null
+++ b/analyzer/lib/src/dart/element/type_visitor.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.
+
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/summary2/function_type_builder.dart';
+import 'package:analyzer/src/summary2/named_type_builder.dart';
+
+class DartTypeVisitor<R> {
+  const DartTypeVisitor();
+
+  R defaultDartType(DartType type) => null;
+
+  R visitBottomType(BottomTypeImpl type) => defaultDartType(type);
+
+  R visitDynamicType(DynamicTypeImpl type) => defaultDartType(type);
+
+  R visitFunctionType(FunctionType type) => defaultDartType(type);
+
+  R visitFunctionTypeBuilder(FunctionTypeBuilder type) => defaultDartType(type);
+
+  R visitInterfaceType(InterfaceType type) => defaultDartType(type);
+
+  R visitNamedType(NamedTypeBuilder type) => defaultDartType(type);
+
+  R visitTypeParameterType(TypeParameterType type) => defaultDartType(type);
+
+  R visitVoidType(VoidType type) => defaultDartType(type);
+
+  static R visit<R>(DartType type, DartTypeVisitor<R> visitor) {
+    if (type is BottomTypeImpl) {
+      return visitor.visitBottomType(type);
+    }
+    if (type is DynamicTypeImpl) {
+      return visitor.visitDynamicType(type);
+    }
+    if (type is FunctionType) {
+      return visitor.visitFunctionType(type);
+    }
+    if (type is FunctionTypeBuilder) {
+      return visitor.visitFunctionTypeBuilder(type);
+    }
+    if (type is InterfaceType) {
+      return visitor.visitInterfaceType(type);
+    }
+    if (type is NamedTypeBuilder) {
+      return visitor.visitNamedType(type);
+    }
+    if (type is TypeParameterType) {
+      return visitor.visitTypeParameterType(type);
+    }
+    if (type is VoidType) {
+      return visitor.visitVoidType(type);
+    }
+    throw UnimplementedError('(${type.runtimeType}) $type');
+  }
+}
diff --git a/analyzer/lib/src/dart/element/wrapped.dart b/analyzer/lib/src/dart/element/wrapped.dart
index 10c3f75..5a9be7c 100644
--- a/analyzer/lib/src/dart/element/wrapped.dart
+++ b/analyzer/lib/src/dart/element/wrapped.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -71,6 +71,12 @@
   bool get hasLoadLibraryFunction => wrappedUnit.hasLoadLibraryFunction;
 
   @override
+  bool get hasMustCallSuper => wrappedUnit.hasMustCallSuper;
+
+  @override
+  bool get hasOptionalTypeArgs => wrappedUnit.hasOptionalTypeArgs;
+
+  @override
   bool get hasOverride => wrappedUnit.hasOverride;
 
   @override
@@ -261,6 +267,12 @@
   bool get hasLiteral => wrappedImport.hasLiteral;
 
   @override
+  bool get hasMustCallSuper => wrappedImport.hasMustCallSuper;
+
+  @override
+  bool get hasOptionalTypeArgs => wrappedImport.hasOptionalTypeArgs;
+
+  @override
   bool get hasOverride => wrappedImport.hasOverride;
 
   @override
@@ -466,6 +478,12 @@
   bool get hasLoadLibraryFunction => wrappedLib.hasLoadLibraryFunction;
 
   @override
+  bool get hasMustCallSuper => wrappedLib.hasMustCallSuper;
+
+  @override
+  bool get hasOptionalTypeArgs => wrappedLib.hasOptionalTypeArgs;
+
+  @override
   bool get hasOverride => wrappedLib.hasOverride;
 
   @override
diff --git a/analyzer/lib/src/dart/error/hint_codes.dart b/analyzer/lib/src/dart/error/hint_codes.dart
index 39f9dee..a11b0d2 100644
--- a/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/analyzer/lib/src/dart/error/hint_codes.dart
@@ -34,7 +34,7 @@
   static const HintCode DEAD_CODE_CATCH_FOLLOWING_CATCH = const HintCode(
       'DEAD_CODE_CATCH_FOLLOWING_CATCH',
       "Dead code: catch clauses after a 'catch (e)' or "
-      "an 'on Object catch (e)' are never reached.",
+          "an 'on Object catch (e)' are never reached.",
       correction:
           "Try reordering the catch clauses so that they can be reached, or "
           "removing the unreachable catch clauses.");
@@ -51,7 +51,7 @@
   static const HintCode DEAD_CODE_ON_CATCH_SUBTYPE = const HintCode(
       'DEAD_CODE_ON_CATCH_SUBTYPE',
       "Dead code: this on-catch block will never be executed because '{0}' is "
-      "a subtype of '{1}' and hence will have been caught above.",
+          "a subtype of '{1}' and hence will have been caught above.",
       correction:
           "Try reordering the catch clauses so that this block can be reached, or "
           "removing the unreachable catch clause.");
@@ -148,7 +148,7 @@
       const HintCode(
           'FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE',
           "A file in the 'lib' directory shouldn't import a file outside the "
-          "'lib' directory.",
+              "'lib' directory.",
           correction: "Try removing the import, or "
               "moving the imported file inside the 'lib' directory.");
 
@@ -163,7 +163,7 @@
       const HintCode(
           'FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE',
           "A file outside the 'lib' directory shouldn't reference a file "
-          "inside the 'lib' directory using a relative path.",
+              "inside the 'lib' directory using a relative path.",
           correction: "Try using a package: URI instead.");
 
   /**
@@ -173,11 +173,30 @@
       const HintCode(
           'IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION',
           "The library '{0}' defines a top-level function named 'loadLibrary' "
-          "which is hidden by deferring this library.",
+              "which is hidden by deferring this library.",
           correction: "Try changing the import to not be deferred, or "
               "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.
    */
@@ -185,18 +204,10 @@
       const HintCode(
           'INFERENCE_FAILURE_ON_UNINITIALIZED_VARIABLE',
           "The type of {0} cannot be inferred without either a type or "
-          "initializer.",
+              "initializer.",
           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.
    */
@@ -250,7 +261,7 @@
   static const HintCode INVALID_REQUIRED_PARAM = const HintCode(
       'INVALID_REQUIRED_PARAM',
       "The type parameter '{0}' is annotated with @required but only named "
-      "parameters without default value can be annotated with it.",
+          "parameters without default value can be annotated with it.",
       correction: "Remove @required.");
 
   /**
@@ -263,7 +274,7 @@
   static const HintCode INVALID_SEALED_ANNOTATION = const HintCode(
       'INVALID_SEALED_ANNOTATION',
       "The member '{0}' is annotated with '@sealed' but only classes can be "
-      "annotated with it.",
+          "annotated with it.",
       correction: "Remove @sealed.");
 
   /**
@@ -277,7 +288,7 @@
   static const HintCode INVALID_USE_OF_PROTECTED_MEMBER = const HintCode(
       'INVALID_USE_OF_PROTECTED_MEMBER',
       "The member '{0}' can only be used within instance members of subclasses "
-      "of '{1}'.");
+          "of '{1}'.");
 
   /// This hint is generated anywhere where a member annotated with
   /// `@visibleForTemplate` is used outside of a "template" Dart file.
@@ -308,7 +319,7 @@
   static const HintCode INVALID_VISIBILITY_ANNOTATION = const HintCode(
       'INVALID_VISIBILITY_ANNOTATION',
       "The member '{0}' is annotated with '{1}', but this annotation is only "
-      "meaningful on declarations of public members.");
+          "meaningful on declarations of public members.");
 
   /**
    * Hint for the `x is double` type checks.
@@ -316,16 +327,18 @@
   static const HintCode IS_DOUBLE = const HintCode(
       'IS_DOUBLE',
       "When compiled to JS, this test might return true when the left hand "
-      "side is an int.",
+          "side is an int.",
       correction: "Try testing for 'num' instead.");
 
   /**
    * Hint for the `x is int` type checks.
    */
+  // TODO(brianwilkerson) This hint isn't being generated. Decide whether to
+  //  generate it or remove it.
   static const HintCode IS_INT = const HintCode(
       'IS_INT',
       "When compiled to JS, this test might return true when the left hand "
-      "side is a double.",
+          "side is a double.",
       correction: "Try testing for 'num' instead.");
 
   /**
@@ -334,16 +347,18 @@
   static const HintCode IS_NOT_DOUBLE = const HintCode(
       'IS_NOT_DOUBLE',
       "When compiled to JS, this test might return false when the left hand "
-      "side is an int.",
+          "side is an int.",
       correction: "Try testing for 'num' instead.");
 
   /**
    * Hint for the `x is! int` type checks.
    */
+  // TODO(brianwilkerson) This hint isn't being generated. Decide whether to
+  //  generate it or remove it.
   static const HintCode IS_NOT_INT = const HintCode(
       'IS_NOT_INT',
       "When compiled to JS, this test might return false when the left hand "
-      "side is a double.",
+          "side is a double.",
       correction: "Try testing for 'num' instead.");
 
   /**
@@ -353,7 +368,7 @@
   static const HintCode MISSING_JS_LIB_ANNOTATION = const HintCode(
       'MISSING_JS_LIB_ANNOTATION',
       "The @JS() annotation can only be used if it is also declared on the "
-      "library directive.",
+          "library directive.",
       correction: "Try adding the annotation to the library directive.");
 
   /**
@@ -390,7 +405,7 @@
   static const HintCode MISSING_RETURN = const HintCode(
       'MISSING_RETURN',
       "This function has a return type of '{0}', but doesn't end with a "
-      "return statement.",
+          "return statement.",
       correction: "Try adding a return statement, "
           "or changing the return type to 'void'.");
 
@@ -401,7 +416,7 @@
   static const HintCode MIXIN_ON_SEALED_CLASS = const HintCode(
       'MIXIN_ON_SEALED_CLASS',
       "The class '{0}' should not be used as a mixin constraint because it is "
-      "sealed, and any class mixing in this mixin has '{0}' as a superclass.",
+          "sealed, and any class mixing in this mixin has '{0}' as a superclass.",
       correction:
           "Try composing with this class, or refer to its documentation for "
           "more information.");
@@ -413,8 +428,8 @@
   static const HintCode MUST_BE_IMMUTABLE = const HintCode(
       'MUST_BE_IMMUTABLE',
       "This class (or a class which this class inherits from) is marked as "
-      "'@immutable', but one or more of its instance fields are not final: "
-      "{0}");
+          "'@immutable', but one or more of its instance fields are not final: "
+          "{0}");
 
   /**
    * Generate a hint for methods that override methods annotated `@mustCallSuper`
@@ -426,7 +441,7 @@
   static const HintCode MUST_CALL_SUPER = const HintCode(
       'MUST_CALL_SUPER',
       "This method overrides a method annotated as @mustCallSuper in '{0}', "
-      "but does not invoke the overridden method.");
+          "but does not invoke the overridden method.");
 
   /**
    * Generate a hint for non-const instance creation using a constructor
@@ -435,7 +450,7 @@
   static const HintCode NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR = const HintCode(
       'NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR',
       "This instance creation must be 'const', because the {0} constructor is "
-      "marked as '@literal'.",
+          "marked as '@literal'.",
       correction: "Try adding a 'const' keyword.");
 
   /**
@@ -446,7 +461,7 @@
       const HintCode(
           'NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW',
           "This instance creation must be 'const', because the {0} constructor is "
-          "marked as '@literal'.",
+              "marked as '@literal'.",
           correction: "Try replacing the 'new' keyword with 'const'.");
 
   /**
@@ -464,7 +479,7 @@
   static const HintCode NULL_AWARE_IN_CONDITION = const HintCode(
       'NULL_AWARE_IN_CONDITION',
       "The value of the '?.' operator can be 'null', which isn't appropriate "
-      "in a condition.",
+          "in a condition.",
       correction:
           "Try replacing the '?.' with a '.', testing the left-hand side for null if "
           "necessary.");
@@ -476,7 +491,7 @@
   static const HintCode NULL_AWARE_IN_LOGICAL_OPERATOR = const HintCode(
       'NULL_AWARE_IN_LOGICAL_OPERATOR',
       "The value of the '?.' operator can be 'null', which isn't appropriate "
-      "as an operand of a logical operator.");
+          "as an operand of a logical operator.");
 
   /**
    * Hint for classes that override equals, but not hashCode.
@@ -545,18 +560,106 @@
   static const HintCode SDK_VERSION_ASYNC_EXPORTED_FROM_CORE = const HintCode(
       'SDK_VERSION_ASYNC_EXPORTED_FROM_CORE',
       "The class '{0}' was not exported from 'dart:core' until version 2.1, "
-      "but this code is required to be able to run on earlier versions.",
+          "but this code is required to be able to run on earlier versions.",
       correction:
           "Try either importing 'dart:async' or updating the SDK constraints.");
 
   /**
+   * An as expression being used in a const context is expected to run on
+   * versions of the SDK that did not support them.
+   */
+  static const HintCode SDK_VERSION_AS_EXPRESSION_IN_CONST_CONTEXT = const HintCode(
+      'SDK_VERSION_AS_EXPRESSION_IN_CONST_CONTEXT',
+      "The use of an as expression in a constant expression wasn't "
+          "supported until version 2.2.2, but this code is required to be able "
+          "to run on earlier versions.",
+      correction: "Try updating the SDK constraints.");
+
+  /**
+   * The operator '&', '|' or '^' is being used on boolean values in code that
+   * is expected to run on versions of the SDK that did not support it.
+   */
+  static const HintCode SDK_VERSION_BOOL_OPERATOR = const HintCode(
+      'SDK_VERSION_BOOL_OPERATOR',
+      "Using the operator '{0}' for 'bool's was not supported until version "
+          "2.2.2, but this code is required to be able to run on earlier versions.",
+      correction: "Try updating the SDK constraints.");
+
+  /**
+   * The operator '==' is being used on non-primitive values in code that
+   * is expected to run on versions of the SDK that did not support it.
+   */
+  static const HintCode SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT = const HintCode(
+      'SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT',
+      "Using the operator '==' for non-primitive types was not supported until "
+          "version 2.2.2, but this code is required to be able to run on earlier "
+          "versions.",
+      correction: "Try updating the SDK constraints.");
+
+  /**
+   * The operator '>>>' is being used in code that is expected to run on
+   * versions of the SDK that did not support it.
+   */
+  static const HintCode SDK_VERSION_GT_GT_GT_OPERATOR = const HintCode(
+      'SDK_VERSION_GT_GT_GT_OPERATOR',
+      "The operator '>>>' was not supported until version 2.2.2, but this code "
+          "is required to be able to run on earlier versions.",
+      correction: "Try updating the SDK constraints.");
+
+  /**
+   * An is expression being used in a const context is expected to run on
+   * versions of the SDK that did not support them.
+   */
+  static const HintCode SDK_VERSION_IS_EXPRESSION_IN_CONST_CONTEXT = const HintCode(
+      'SDK_VERSION_IS_EXPRESSION_IN_CONST_CONTEXT',
+      "The use of an is expression in a constant expression wasn't "
+          "supported until version 2.2.2, but this code is required to be able "
+          "to run on earlier versions.",
+      correction: "Try updating the SDK constraints.");
+
+  /**
+   * A set literal is being used in code that is expected to run on versions of
+   * the SDK that did not support them.
+   */
+  static const HintCode SDK_VERSION_SET_LITERAL = const HintCode(
+      'SDK_VERSION_SET_LITERAL',
+      "Set literals were not supported until version 2.2, "
+          "but this code is required to be able to run on earlier versions.",
+      correction: "Try updating the SDK constraints.");
+
+  /**
+   * The type Never is being used in code that is expected to run on versions of
+   * the SDK that did not support it.
+   */
+  static const HintCode SDK_VERSION_NEVER = const HintCode(
+      'SDK_VERSION_NEVER', "The type Never is not yet supported.");
+
+  /**
+   * The for, if or spread element is being used in code that is expected to run
+   * on versions of the SDK that did not support them.
+   */
+  static const HintCode SDK_VERSION_UI_AS_CODE = const HintCode(
+      'SDK_VERSION_UI_AS_CODE',
+      "The for, if and spread elements were not supported until version 2.2.2, "
+          "but this code is required to be able to run on earlier versions.",
+      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.
    */
   static const HintCode SUBTYPE_OF_SEALED_CLASS = const HintCode(
       'SUBTYPE_OF_SEALED_CLASS',
       "The class '{0}' should not be extended, mixed in, or implemented "
-      "because it is sealed.",
+          "because it is sealed.",
       correction:
           "Try composing instead of inheriting, or refer to its documentation "
           "for more information.");
diff --git a/analyzer/lib/src/dart/error/syntactic_errors.dart b/analyzer/lib/src/dart/error/syntactic_errors.dart
index 62e8d17..5110557 100644
--- a/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -65,13 +65,18 @@
 
   static const ParserErrorCode COLON_IN_PLACE_OF_IN = _COLON_IN_PLACE_OF_IN;
 
-  static const ParserErrorCode CONST_AFTER_FACTORY = _CONST_AFTER_FACTORY;
+  static const ParserErrorCode CONFLICTING_MODIFIERS = _CONFLICTING_MODIFIERS;
 
-  static const ParserErrorCode CONST_AND_COVARIANT = _CONST_AND_COVARIANT;
+  // TODO(danrubel): Remove this unused error code
+  static const ParserErrorCode CONST_AFTER_FACTORY = _MODIFIER_OUT_OF_ORDER;
+
+  // TODO(danrubel): Remove this unused error code
+  static const ParserErrorCode CONST_AND_COVARIANT = _CONFLICTING_MODIFIERS;
 
   static const ParserErrorCode CONST_AND_FINAL = _CONST_AND_FINAL;
 
-  static const ParserErrorCode CONST_AND_VAR = _CONST_AND_VAR;
+  // TODO(danrubel): Remove this unused error code
+  static const ParserErrorCode CONST_AND_VAR = _CONFLICTING_MODIFIERS;
 
   static const ParserErrorCode CONST_CLASS = _CONST_CLASS;
 
@@ -101,7 +106,8 @@
   static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE =
       _CONTINUE_WITHOUT_LABEL_IN_CASE;
 
-  static const ParserErrorCode COVARIANT_AFTER_FINAL = _COVARIANT_AFTER_FINAL;
+  // TODO(danrubel): Remove this unused error code
+  static const ParserErrorCode COVARIANT_AFTER_FINAL = _MODIFIER_OUT_OF_ORDER;
 
   static const ParserErrorCode COVARIANT_AFTER_VAR = _COVARIANT_AFTER_VAR;
 
@@ -379,11 +385,17 @@
       "The modifier 'async*' isn't allowed for an expression function body.",
       correction: "Try converting the body to a block.");
 
+  static const ParserErrorCode INVALID_SUPER_IN_INITIALIZER =
+      _INVALID_SUPER_IN_INITIALIZER;
+
   static const ParserErrorCode INVALID_SYNC = const ParserErrorCode(
       'INVALID_SYNC',
       "The modifier 'sync' isn't allowed for an expression function body.",
       correction: "Try converting the body to a block.");
 
+  static const ParserErrorCode INVALID_THIS_IN_INITIALIZER =
+      _INVALID_THIS_IN_INITIALIZER;
+
   static const ParserErrorCode INVALID_UNICODE_ESCAPE = _INVALID_UNICODE_ESCAPE;
 
   static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST =
@@ -515,6 +527,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;
 
@@ -687,6 +701,8 @@
   static const ParserErrorCode TYPE_ARGUMENTS_ON_TYPE_VARIABLE =
       _TYPE_ARGUMENTS_ON_TYPE_VARIABLE;
 
+  static const ParserErrorCode TYPE_BEFORE_FACTORY = _TYPE_BEFORE_FACTORY;
+
   static const ParserErrorCode TYPEDEF_IN_CLASS = _TYPEDEF_IN_CLASS;
 
   /**
@@ -710,7 +726,7 @@
 
   static const ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER =
       const ParserErrorCode('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER',
-          "The default value of a positional parameter should be preceeded by '='.",
+          "The default value of a positional parameter should be preceded by '='.",
           correction: "Try replacing the ':' with '='.");
 
   /**
diff --git a/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index fd3008b..25c445b 100644
--- a/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -63,16 +63,16 @@
   _CLASS_IN_CLASS,
   _COLON_IN_PLACE_OF_IN,
   _CONSTRUCTOR_WITH_RETURN_TYPE,
-  _CONST_AFTER_FACTORY,
-  _CONST_AND_COVARIANT,
+  _MODIFIER_OUT_OF_ORDER,
+  _TYPE_BEFORE_FACTORY,
   _CONST_AND_FINAL,
-  _CONST_AND_VAR,
+  _CONFLICTING_MODIFIERS,
   _CONST_CLASS,
   _VAR_AS_TYPE_NAME,
   _CONST_FACTORY,
   _CONST_METHOD,
   _CONTINUE_WITHOUT_LABEL_IN_CASE,
-  _COVARIANT_AFTER_FINAL,
+  _INVALID_THIS_IN_INITIALIZER,
   _COVARIANT_AND_STATIC,
   _COVARIANT_MEMBER,
   _DEFERRED_AFTER_PREFIX,
@@ -102,6 +102,7 @@
   _MISSING_CATCH_OR_FINALLY,
   _EXPERIMENT_NOT_ENABLED,
   _EXPECTED_ELSE_OR_COMMA,
+  _INVALID_SUPER_IN_INITIALIZER,
 ];
 
 const ParserErrorCode _ABSTRACT_CLASS_MEMBER = const ParserErrorCode(
@@ -134,29 +135,20 @@
     'COLON_IN_PLACE_OF_IN', r"For-in loops use 'in' rather than a colon.",
     correction: "Try replacing the colon with the keyword 'in'.");
 
+const ParserErrorCode _CONFLICTING_MODIFIERS = const ParserErrorCode(
+    'CONFLICTING_MODIFIERS',
+    r"Members can't be declared to be both '#string' and '#string2'.",
+    correction: "Try removing one of the keywords.");
+
 const ParserErrorCode _CONSTRUCTOR_WITH_RETURN_TYPE = const ParserErrorCode(
     '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'.",
-    correction: "Try removing either the 'const' or 'covariant' keyword.");
-
 const ParserErrorCode _CONST_AND_FINAL = const ParserErrorCode(
     'CONST_AND_FINAL',
     r"Members can't be declared to be both 'const' and 'final'.",
     correction: "Try removing either the 'const' or 'final' keyword.");
 
-const ParserErrorCode _CONST_AND_VAR = const ParserErrorCode(
-    'CONST_AND_VAR', r"Members can't be declared to be both 'const' and 'var'.",
-    correction: "Try removing either the 'const' or 'var' keyword.");
-
 const ParserErrorCode _CONST_CLASS = const ParserErrorCode(
     'CONST_CLASS', r"Classes can't be declared to be 'const'.",
     correction:
@@ -182,11 +174,6 @@
     correction:
         "Try adding a label associated with one of the case clauses to the continue statement.");
 
-const ParserErrorCode _COVARIANT_AFTER_FINAL = const ParserErrorCode(
-    'COVARIANT_AFTER_FINAL',
-    r"The modifier 'covariant' should be before the modifier 'final'.",
-    correction: "Try re-ordering the modifiers.");
-
 const ParserErrorCode _COVARIANT_AFTER_VAR = const ParserErrorCode(
     'COVARIANT_AFTER_VAR',
     r"The modifier 'covariant' should be before the modifier 'var'.",
@@ -214,7 +201,7 @@
 
 const ParserErrorCode _DUPLICATED_MODIFIER = const ParserErrorCode(
     'DUPLICATED_MODIFIER', r"The modifier '#lexeme' was already specified.",
-    correction: "Try removing all but one occurance of the modifier.");
+    correction: "Try removing all but one occurence of the modifier.");
 
 const ParserErrorCode _DUPLICATE_DEFERRED = const ParserErrorCode(
     'DUPLICATE_DEFERRED',
@@ -248,13 +235,13 @@
 
 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.");
 
 const ParserErrorCode _EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
     const ParserErrorCode('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE',
-        r"Export directives must preceed part directives.",
+        r"Export directives must precede part directives.",
         correction:
             "Try moving the export directives before the part directives.");
 
@@ -358,7 +345,7 @@
 
 const ParserErrorCode _IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
     const ParserErrorCode('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE',
-        r"Import directives must preceed part directives.",
+        r"Import directives must precede part directives.",
         correction:
             "Try moving the import directives before the part directives.");
 
@@ -386,6 +373,14 @@
         r"The operator '?.' cannot be used with 'super' because 'super' cannot be null.",
         correction: "Try replacing '?.' with '.'");
 
+const ParserErrorCode _INVALID_SUPER_IN_INITIALIZER = const ParserErrorCode(
+    'INVALID_SUPER_IN_INITIALIZER',
+    r"Can only use 'super' in an initializer for calling the superclass constructor (e.g. 'super()' or 'super.namedConstructor()')");
+
+const ParserErrorCode _INVALID_THIS_IN_INITIALIZER = const ParserErrorCode(
+    'INVALID_THIS_IN_INITIALIZER',
+    r"Can only use 'this' in an initializer for field initialization (e.g. 'this.x = something') and constructor redirection (e.g. 'this()' or 'this.namedConstructor())");
+
 const ParserErrorCode _INVALID_UNICODE_ESCAPE = const ParserErrorCode(
     'INVALID_UNICODE_ESCAPE',
     r"An escape sequence starting with '\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.");
@@ -428,7 +423,7 @@
 
 const ParserErrorCode _MISSING_KEYWORD_OPERATOR = const ParserErrorCode(
     'MISSING_KEYWORD_OPERATOR',
-    r"Operator declarations must be preceeded by the keyword 'operator'.",
+    r"Operator declarations must be preceded by the keyword 'operator'.",
     correction: "Try adding the keyword 'operator'.");
 
 const ParserErrorCode _MISSING_PREFIX_IN_DEFERRED_IMPORT =
@@ -439,6 +434,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.",
@@ -540,6 +540,10 @@
     r"Can't use type arguments with type variable '#name'.",
     correction: "Try removing the type arguments.");
 
+const ParserErrorCode _TYPE_BEFORE_FACTORY = const ParserErrorCode(
+    'TYPE_BEFORE_FACTORY', r"Factory constructors cannot have a return type.",
+    correction: "Try removing the type appearing before 'factory'.");
+
 const ParserErrorCode _VAR_AND_TYPE = const ParserErrorCode('VAR_AND_TYPE',
     r"Variables can't be declared using both 'var' and a type name.",
     correction: "Try removing 'var.'");
diff --git a/analyzer/lib/src/dart/resolver/definite_assignment.dart b/analyzer/lib/src/dart/resolver/definite_assignment.dart
index 838c611..bcf3d5e 100644
--- a/analyzer/lib/src/dart/resolver/definite_assignment.dart
+++ b/analyzer/lib/src/dart/resolver/definite_assignment.dart
@@ -530,7 +530,7 @@
     _current = _current.union(continueSet);
   }
 
-  void beginForStatement2(ForStatement2 statement) {
+  void beginForStatement2(ForStatement statement) {
     // Not strongly necessary, because we discard everything anyway.
     // Just for consistency, so that `break` is handled without `null`.
     _statementToStackIndex[statement] = _stack.length;
diff --git a/analyzer/lib/src/dart/resolver/exit_detector.dart b/analyzer/lib/src/dart/resolver/exit_detector.dart
index 432367d..a0d6371 100644
--- a/analyzer/lib/src/dart/resolver/exit_detector.dart
+++ b/analyzer/lib/src/dart/resolver/exit_detector.dart
@@ -231,7 +231,7 @@
   }
 
   @override
-  bool visitForStatement2(ForStatement2 node) {
+  bool visitForStatement(ForStatement node) {
     bool outerBreakValue = _enclosingBlockContainsBreak;
     _enclosingBlockContainsBreak = false;
     ForLoopParts parts = node.forLoopParts;
@@ -393,7 +393,7 @@
 
   @override
   bool visitListLiteral(ListLiteral node) {
-    for (CollectionElement element in node.elements2) {
+    for (CollectionElement element in node.elements) {
       if (_nodeExits(element)) {
         return true;
       }
@@ -464,7 +464,7 @@
 
   @override
   bool visitSetOrMapLiteral(SetOrMapLiteral node) {
-    for (CollectionElement element in node.elements2) {
+    for (CollectionElement element in node.elements) {
       if (_nodeExits(element)) {
         return true;
       }
diff --git a/analyzer/lib/src/dart/resolver/inheritance_manager.dart b/analyzer/lib/src/dart/resolver/inheritance_manager.dart
index 9e54c4c..b1781ea 100644
--- a/analyzer/lib/src/dart/resolver/inheritance_manager.dart
+++ b/analyzer/lib/src/dart/resolver/inheritance_manager.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -359,6 +359,8 @@
       if (r > numOfRequiredParams) {
         r = numOfRequiredParams;
       }
+      // TODO(brianwilkerson) Handle the fact that named parameters can now be
+      //  required.
       namedParametersList.addAll(_getNamedParameterNames(element));
     }
     return _createSyntheticExecutableElement(
@@ -426,6 +428,8 @@
       parameter.parameterKind = ParameterKind.POSITIONAL;
       parameters[i] = parameter;
     }
+    // TODO(brianwilkerson) Handle the fact that named parameters can now be
+    //  required.
     for (int m = 0; m < namedParameters.length; m++, i++) {
       ParameterElementImpl parameter =
           new ParameterElementImpl(namedParameters[m], 0);
diff --git a/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 6471484..844dfd9 100644
--- a/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/dart/resolver/scope.dart b/analyzer/lib/src/dart/resolver/scope.dart
index f1fb360..ccd4a4c 100644
--- a/analyzer/lib/src/dart/resolver/scope.dart
+++ b/analyzer/lib/src/dart/resolver/scope.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -725,6 +726,7 @@
     // which is not possible for `dynamic`.
     if (library.isDartCore) {
       definedNames['dynamic'] = DynamicElementImpl.instance;
+      definedNames['Never'] = BottomTypeImpl.instance.element;
     }
 
     return new Namespace(definedNames);
diff --git a/analyzer/lib/src/dart/scanner/scanner.dart b/analyzer/lib/src/dart/scanner/scanner.dart
index ab852cf..566caf2 100644
--- a/analyzer/lib/src/dart/scanner/scanner.dart
+++ b/analyzer/lib/src/dart/scanner/scanner.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/analysis/features.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
@@ -59,6 +60,12 @@
   bool enableGtGtGt = false;
 
   /**
+   * A flag indicating whether the scanner should recognize the `late` and
+   * `required` keywords.
+   */
+  bool enableNonNullable = false;
+
+  /**
    * Initialize a newly created scanner to scan characters from the given
    * [source]. The given character [reader] will be used to read the characters
    * in the source. The given [_errorListener] will be informed of any errors
@@ -84,6 +91,16 @@
     this._preserveComments = preserveComments;
   }
 
+  /// Configures the scanner appropriately for the given [featureSet].
+  ///
+  /// TODO(paulberry): stop exposing `enableGtGtGt` and `enableNonNullable` so
+  /// that callers are forced to use this API.  Note that this would be a
+  /// breaking change.
+  void configureFeatures(FeatureSet featureSet) {
+    enableGtGtGt = featureSet.isEnabled(Feature.triple_shift);
+    enableNonNullable = featureSet.isEnabled(Feature.non_nullable);
+  }
+
   void reportError(
       ScannerErrorCode errorCode, int offset, List<Object> arguments) {
     _errorListener
@@ -104,7 +121,8 @@
 
   Token tokenize() {
     fasta.ScannerResult result = fasta.scanString(_contents,
-        enableGtGtGt: enableGtGtGt,
+        configuration: fasta.ScannerConfiguration(
+            enableGtGtGt: enableGtGtGt, enableNonNullable: enableNonNullable),
         includeComments: _preserveComments,
         scanLazyAssignmentOperators: scanLazyAssignmentOperators);
 
@@ -133,4 +151,13 @@
     }
     return firstToken;
   }
+
+  /// Return a ScannerConfiguration based upon the specified feature set.
+  static fasta.ScannerConfiguration buildConfig(FeatureSet featureSet) =>
+      featureSet == null
+          ? fasta.ScannerConfiguration()
+          : fasta.ScannerConfiguration(
+              enableGtGtGt: featureSet.isEnabled(Feature.triple_shift),
+              enableGtGtGtEq: featureSet.isEnabled(Feature.triple_shift),
+              enableNonNullable: featureSet.isEnabled(Feature.non_nullable));
 }
diff --git a/analyzer/lib/src/dart/sdk/patch.dart b/analyzer/lib/src/dart/sdk/patch.dart
index 532ae5e..72c191f 100644
--- a/analyzer/lib/src/dart/sdk/patch.dart
+++ b/analyzer/lib/src/dart/sdk/patch.dart
@@ -1,7 +1,8 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/listener.dart';
@@ -58,7 +59,8 @@
             'The patch file ${patchFile.path} for $source does not exist.');
       }
       Source patchSource = patchFile.createSource();
-      CompilationUnit patchUnit = parse(patchSource, errorListener);
+      CompilationUnit patchUnit =
+          parse(patchSource, errorListener, unit.featureSet);
 
       // Prepare for reporting errors.
       _baseDesc = source.toString();
@@ -405,16 +407,17 @@
    * Parse the given [source] into AST.
    */
   @visibleForTesting
-  static CompilationUnit parse(
-      Source source, AnalysisErrorListener errorListener) {
+  static CompilationUnit parse(Source source,
+      AnalysisErrorListener errorListener, FeatureSet featureSet) {
     String code = source.contents.data;
 
     CharSequenceReader reader = new CharSequenceReader(code);
-    Scanner scanner = new Scanner(source, reader, errorListener);
+    Scanner scanner = new Scanner(source, reader, errorListener)
+      ..configureFeatures(featureSet);
     Token token = scanner.tokenize();
     LineInfo lineInfo = new LineInfo(scanner.lineStarts);
 
-    Parser parser = new Parser(source, errorListener);
+    Parser parser = new Parser(source, errorListener, featureSet: featureSet);
     CompilationUnit unit = parser.parseCompilationUnit(token);
     unit.lineInfo = lineInfo;
     return unit;
diff --git a/analyzer/lib/src/dart/sdk/sdk.dart b/analyzer/lib/src/dart/sdk/sdk.dart
index e20937d..22ab2f2 100644
--- a/analyzer/lib/src/dart/sdk/sdk.dart
+++ b/analyzer/lib/src/dart/sdk/sdk.dart
@@ -6,6 +6,7 @@
 import 'dart:convert';
 import 'dart:io' as io;
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/exception/exception.dart';
@@ -20,7 +21,6 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/summary/idl.dart' show PackageBundle;
-import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:yaml/yaml.dart';
 
@@ -86,16 +86,6 @@
       _analysisContext = new SdkAnalysisContext(_analysisOptions);
       SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
       _analysisContext.sourceFactory = factory;
-      if (_useSummary) {
-        PackageBundle sdkBundle = getLinkedBundle();
-        if (sdkBundle != null) {
-          SummaryDataStore dataStore =
-              new SummaryDataStore([], resourceProvider: resourceProvider);
-          dataStore.addBundle(null, sdkBundle);
-          _analysisContext.resultProvider =
-              new InputPackagesResultProvider(_analysisContext, dataStore);
-        }
-      }
     }
     return _analysisContext;
   }
@@ -140,6 +130,16 @@
     });
   }
 
+  /**
+   * Return info for debugging https://github.com/dart-lang/sdk/issues/35226.
+   */
+  Map<String, Object> debugInfo() {
+    return <String, Object>{
+      'runtimeType': '$runtimeType',
+      'libraryMap': libraryMap.debugInfo(),
+    };
+  }
+
   @override
   Source fromFileUri(Uri uri) {
     File file =
@@ -230,16 +230,6 @@
     return source;
   }
 
-  /**
-   * Return info for debugging https://github.com/dart-lang/sdk/issues/35226.
-   */
-  Map<String, Object> debugInfo() {
-    return <String, Object>{
-      'runtimeType': '$runtimeType',
-      'libraryMap': libraryMap.debugInfo(),
-    };
-  }
-
   String _getPath(File file) {
     List<SdkLibrary> libraries = libraryMap.sdkLibraries;
     int length = libraries.length;
@@ -562,16 +552,6 @@
   }
 
   /**
-   * Return info for debugging https://github.com/dart-lang/sdk/issues/35226.
-   */
-  @override
-  Map<String, Object> debugInfo() {
-    var result = super.debugInfo();
-    result['directory'] = _sdkDirectory.path;
-    return result;
-  }
-
-  /**
    * Determine the search order for trying to locate the [_LIBRARIES_FILE].
    */
   Iterable<File> get _libraryMapLocations sync* {
@@ -585,6 +565,16 @@
         .getChildAssumingFile(_LIBRARIES_FILE);
   }
 
+  /**
+   * Return info for debugging https://github.com/dart-lang/sdk/issues/35226.
+   */
+  @override
+  Map<String, Object> debugInfo() {
+    var result = super.debugInfo();
+    result['directory'] = _sdkDirectory.path;
+    return result;
+  }
+
   @override
   String getRelativePathFromFile(File file) {
     String filePath = file.path;
@@ -908,9 +898,13 @@
    */
   LibraryMap readFromSource(Source source, String libraryFileContents) {
     BooleanErrorListener errorListener = new BooleanErrorListener();
+    // TODO(paulberry): initialize the feature set appropriately based on the
+    // version of the SDK we are reading, and enable flags.
+    var featureSet = FeatureSet.fromEnableFlags([]);
     Scanner scanner = new Scanner(
-        source, new CharSequenceReader(libraryFileContents), errorListener);
-    Parser parser = new Parser(source, errorListener);
+        source, new CharSequenceReader(libraryFileContents), errorListener)
+      ..configureFeatures(featureSet);
+    Parser parser = new Parser(source, errorListener, featureSet: featureSet);
     CompilationUnit unit = parser.parseCompilationUnit(scanner.tokenize());
     SdkLibrariesReader_LibraryBuilder libraryBuilder =
         new SdkLibrariesReader_LibraryBuilder(_useDart2jsPaths);
diff --git a/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart b/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart
new file mode 100644
index 0000000..1449906
--- /dev/null
+++ b/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart
@@ -0,0 +1,142 @@
+// 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.
+
+/// Information about the directives found in Dartdoc comments.
+class DartdocDirectiveInfo {
+  // TODO(brianwilkerson) Consider moving the method
+  //  DartUnitHoverComputer.computeDocumentation to this class.
+
+  /// A regular expression used to match a macro directive. There is one group
+  /// that contains the name of the template.
+  static final macroRegExp = new RegExp(r'{@macro\s+([^}]+)}');
+
+  /// A regular expression used to match a template directive. There are two
+  /// groups. The first contains the name of the template, the second contains
+  /// the body of the template.
+  static final templateRegExp = new RegExp(
+      r'[ ]*{@template\s+(.+?)}([\s\S]+?){@endtemplate}[ ]*\n?',
+      multiLine: true);
+
+  /// A regular expression used to match a youtube or animation directive.
+  ///
+  /// These are in the form:
+  /// `{@youtube 560 315 https://www.youtube.com/watch?v=2uaoEDOgk_I}`.
+  static final videoRegExp =
+      new RegExp(r'{@(youtube|animation)\s+[^}]+\s+[^}]+\s+([^}]+)}');
+
+  /// A table mapping the names of templates to the unprocessed bodies of the
+  /// templates.
+  final Map<String, String> templateMap = {};
+
+  /// Initialize a newly created set of information about Dartdoc directives.
+  DartdocDirectiveInfo();
+
+  /// Add corresponding pairs from the [names] and [values] to the set of
+  /// defined templates.
+  void addTemplateNamesAndValues(List<String> names, List<String> values) {
+    int length = names.length;
+    assert(length == values.length);
+    for (int i = 0; i < length; i++) {
+      templateMap[names[i]] = values[i];
+    }
+  }
+
+  /// Process the given Dartdoc [comment], extracting the template directive if
+  /// there is one.
+  void extractTemplate(String comment) {
+    for (Match match in templateRegExp.allMatches(comment)) {
+      String name = match.group(1).trim();
+      String body = match.group(2).trim();
+      templateMap[name] = _stripDelimiters(body).join('\n');
+    }
+  }
+
+  /// Process the given Dartdoc [comment], replacing any known dartdoc
+  /// directives with the associated content.
+  ///
+  /// Macro directives are replaced with the body of the corresponding template.
+  ///
+  /// Youtube and animation directives are replaced with markdown hyperlinks.
+  String processDartdoc(String comment) {
+    List<String> lines = _stripDelimiters(comment);
+    for (int i = lines.length - 1; i >= 0; i--) {
+      String line = lines[i];
+      Match match = macroRegExp.firstMatch(line);
+      if (match != null) {
+        String name = match.group(1);
+        String value = templateMap[name];
+        if (value != null) {
+          lines[i] = value;
+        }
+        continue;
+      }
+
+      match = videoRegExp.firstMatch(line);
+      if (match != null) {
+        String uri = match.group(2);
+        if (uri != null && uri.isNotEmpty) {
+          String label = uri;
+          if (label.startsWith('https://')) {
+            label = label.substring('https://'.length);
+          }
+          lines[i] = '[$label]($uri)';
+        }
+        continue;
+      }
+    }
+    return lines.join('\n');
+  }
+
+  /// Remove the delimiters from the given [comment].
+  List<String> _stripDelimiters(String comment) {
+    if (comment == null) {
+      return null;
+    }
+    //
+    // Remove /** */.
+    //
+    if (comment.startsWith('/**')) {
+      comment = comment.substring(3);
+    }
+    if (comment.endsWith('*/')) {
+      comment = comment.substring(0, comment.length - 2);
+    }
+    comment = comment.trim();
+    //
+    // Remove leading '* ' and '/// '.
+    //
+    List<String> lines = comment.split('\n');
+    int firstNonEmpty = lines.length + 1;
+    int lastNonEmpty = -1;
+    for (var i = 0; i < lines.length; i++) {
+      String line = lines[i];
+      line = line.trim();
+      if (line.startsWith('*')) {
+        line = line.substring(1);
+        if (line.startsWith(' ')) {
+          line = line.substring(1);
+        }
+      } else if (line.startsWith('///')) {
+        line = line.substring(3);
+        if (line.startsWith(' ')) {
+          line = line.substring(1);
+        }
+      }
+      if (line.isNotEmpty) {
+        if (i < firstNonEmpty) {
+          firstNonEmpty = i;
+        }
+        if (i > lastNonEmpty) {
+          lastNonEmpty = i;
+        }
+      }
+      lines[i] = line;
+    }
+    if (lastNonEmpty < firstNonEmpty) {
+      // All of the lines are empty.
+      return <String>[];
+    }
+    return lines.sublist(firstNonEmpty, lastNonEmpty + 1);
+  }
+}
diff --git a/analyzer/lib/src/diagnostic/diagnostic.dart b/analyzer/lib/src/diagnostic/diagnostic.dart
new file mode 100644
index 0000000..d45ad27
--- /dev/null
+++ b/analyzer/lib/src/diagnostic/diagnostic.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.
+
+import 'package:analyzer/diagnostic/diagnostic.dart';
+import 'package:meta/meta.dart';
+
+/// A concrete implementation of a diagnostic message.
+class DiagnosticMessageImpl implements DiagnosticMessage {
+  @override
+  final String filePath;
+
+  @override
+  final int length;
+
+  @override
+  final String message;
+
+  @override
+  final int offset;
+
+  /// Initialize a newly created message to represent a [message] reported in
+  /// the file at the given [filePath] at the given [offset] and with the given
+  /// [length].
+  DiagnosticMessageImpl(
+      {@required this.filePath,
+      @required this.length,
+      @required this.message,
+      @required this.offset});
+}
diff --git a/analyzer/lib/src/diagnostic/diagnostic_factory.dart b/analyzer/lib/src/diagnostic/diagnostic_factory.dart
new file mode 100644
index 0000000..7b359dd
--- /dev/null
+++ b/analyzer/lib/src/diagnostic/diagnostic_factory.dart
@@ -0,0 +1,49 @@
+// 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/dart/element/element.dart';
+import 'package:analyzer/diagnostic/diagnostic.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/// A factory used to create diagnostics.
+class DiagnosticFactory {
+  /// Initialize a newly created diagnostic factory.
+  DiagnosticFactory();
+
+  /// Return a diagnostic indicating that the given [identifier] was referenced
+  /// before it was declared.
+  AnalysisError referencedBeforeDeclaration(
+      Source source, Identifier identifier,
+      {Element element}) {
+    String name = identifier.name;
+    Element staticElement = element ?? identifier.staticElement;
+    List<DiagnosticMessage> contextMessages;
+    int declarationOffset = staticElement.nameOffset;
+    if (declarationOffset >= 0 && staticElement != null) {
+      CompilationUnitElement unit = staticElement
+          .getAncestor((element) => element is CompilationUnitElement);
+      CharacterLocation location = unit.lineInfo.getLocation(declarationOffset);
+      contextMessages = [
+        new DiagnosticMessageImpl(
+            filePath: source.fullName,
+            message:
+                "The declaration of '$name' is on line ${location.lineNumber}.",
+            offset: declarationOffset,
+            length: staticElement.nameLength)
+      ];
+    }
+    return new AnalysisError(
+        source,
+        identifier.offset,
+        identifier.length,
+        CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION,
+        [name],
+        contextMessages);
+  }
+}
diff --git a/analyzer/lib/src/error/codes.dart b/analyzer/lib/src/error/codes.dart
index d6c964c..8a3e142 100644
--- a/analyzer/lib/src/error/codes.dart
+++ b/analyzer/lib/src/error/codes.dart
@@ -8,7 +8,6 @@
 export 'package:analyzer/src/dart/error/hint_codes.dart';
 export 'package:analyzer/src/dart/error/lint_codes.dart';
 export 'package:analyzer/src/dart/error/todo_codes.dart';
-export 'package:analyzer/src/html/error/html_codes.dart';
 
 /**
  * The error codes used for compile time errors caused by constant evaluation
@@ -35,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
@@ -46,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
@@ -65,78 +64,7 @@
       const CheckedModeCompileTimeErrorCode(
           'CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE',
           "The initializer type '{0}' can't be assigned to the field type "
-          "'{1}'.");
-
-  /**
-   * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i>
-   * ... <i>e<sub>n</sub></i>] is evaluated as follows:
-   * * The operator []= is invoked on <i>a</i> with first argument <i>i</i> and
-   *   second argument <i>o<sub>i+1</sub></i><i>, 1 &lt;= i &lt;= n</i>
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
-   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
-   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
-   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
-   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>,
-   * 1 &lt;= j &lt;= m</i>.
-   *
-   * Parameters:
-   * 0: the actual type of the list element
-   * 1: the expected type of the list element
-   */
-  static const CheckedModeCompileTimeErrorCode
-      LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CheckedModeCompileTimeErrorCode(
-          'LIST_ELEMENT_TYPE_NOT_ASSIGNABLE',
-          "The element type '{0}' can't be assigned to the list type '{1}'.");
-
-  /**
-   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt;
-   * [<i>k<sub>1</sub></i> : <i>e<sub>1</sub></i> ... <i>k<sub>n</sub></i> :
-   * <i>e<sub>n</sub></i>] is evaluated as follows:
-   * * The operator []= is invoked on <i>m</i> with first argument
-   *   <i>k<sub>i</sub></i> and second argument <i>e<sub>i</sub></i><i>, 1 &lt;=
-   *   i &lt;= n</i>
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
-   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
-   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
-   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
-   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
-   * &lt;= j &lt;= m</i>.
-   */
-  static const CheckedModeCompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE =
-      const CheckedModeCompileTimeErrorCode('MAP_KEY_TYPE_NOT_ASSIGNABLE',
-          "The element type '{0}' can't be assigned to the map key type '{1}'.");
-
-  /**
-   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt;
-   * [<i>k<sub>1</sub></i> : <i>e<sub>1</sub></i> ... <i>k<sub>n</sub></i> :
-   * <i>e<sub>n</sub></i>] is evaluated as follows:
-   * * The operator []= is invoked on <i>m</i> with first argument
-   *   <i>k<sub>i</sub></i> and second argument <i>e<sub>i</sub></i><i>, 1 &lt;=
-   *   i &lt;= n</i>
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
-   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
-   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
-   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
-   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
-   * &lt;= j &lt;= m</i>.
-   */
-  static const CheckedModeCompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE =
-      const CheckedModeCompileTimeErrorCode(
-          'MAP_VALUE_TYPE_NOT_ASSIGNABLE',
-          "The element type '{0}' can't be assigned to the map value type "
-          "'{1}'.");
-
-  /**
-   * Parameters:
-   * 0: the actual type of the set element
-   * 1: the expected type of the set element
-   */
-  static const CheckedModeCompileTimeErrorCode SET_ELEMENT_TYPE_NOT_ASSIGNABLE =
-      const CheckedModeCompileTimeErrorCode('SET_ELEMENT_TYPE_NOT_ASSIGNABLE',
-          "The element type '{0}' can't be assigned to the set type '{1}'.");
+              "'{1}'.");
 
   /**
    * 16.12.2 Const: It is a compile-time error if evaluation of a constant
@@ -146,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
@@ -194,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
@@ -217,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.");
@@ -227,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).");
@@ -261,18 +189,6 @@
           "An annotation (metadata) can't use type arguments.");
 
   /**
-   * 12.33 Argument Definition Test: It is a compile time error if <i>v</i> does
-   * not denote a formal parameter.
-   *
-   * Parameters:
-   * 0: the name of the identifier in the argument definition test that is not a
-   *    parameter
-   */
-  static const CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER =
-      const CompileTimeErrorCode(
-          'ARGUMENT_DEFINITION_TEST_NON_PARAMETER', "'{0}' isn't a parameter.");
-
-  /**
    * 17.6.3 Asynchronous For-in: It is a compile-time error if an asynchronous
    * for-in statement appears inside a synchronous function.
    */
@@ -359,22 +275,6 @@
           correction: "Try choosing a different name for the type parameter.");
 
   /**
-   * 16.33 Identifier Reference: It is a compile-time error if a built-in
-   * identifier is used as the declared name of a prefix, class, type parameter
-   * or type alias.
-   *
-   * Parameters:
-   * 0: the built-in identifier that is being used
-   *
-   * TODO(scheglov) It would be nice to get more specific errors.
-   * https://github.com/dart-lang/sdk/issues/31811
-   */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_IN_DECLARATION =
-      const CompileTimeErrorCode('BUILT_IN_IDENTIFIER_IN_DECLARATION',
-          "The built-in identifier '{0}' can't be used as a name.",
-          correction: "Try choosing a different name.");
-
-  /**
    * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements
    * the operator <i>==</i>.
    *
@@ -397,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.");
 
   /**
@@ -412,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.");
 
   /**
@@ -429,9 +329,9 @@
       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 conflit.");
+              "renaming the field to a name that doesn't conflict.");
 
   /**
    * 10.10 Superinterfaces: It is a compile-time error if a class `C` has two
@@ -448,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
@@ -464,9 +364,9 @@
       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 conflit.");
+              "renaming the method to a name that doesn't conflict.");
 
   /**
    * 10.11 Class Member Conflicts: Let `C` be a class. It is a compile-time
@@ -482,9 +382,9 @@
       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 conflit.");
+              "Try renaming the member to a name that doesn't conflict.");
 
   /**
    * 7. Classes: It is a compile time error if a generic class declares a type
@@ -498,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.");
 
   /**
@@ -513,15 +413,9 @@
       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.");
 
-  static const CompileTimeErrorCode
-      CONST_CONSTRUCTOR_IN_SUBCLASS_OF_MIXIN_APPLICATION =
-      const CompileTimeErrorCode(
-          'CONST_CONSTRUCTOR_IN_SUBCLASS_OF_MIXIN_APPLICATION',
-          "Can't extend a mixin application and be 'const'.");
-
   /**
    * 16.12.2 Const: It is a compile-time error if evaluation of a constant
    * object results in an uncaught exception being thrown.
@@ -545,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.");
 
@@ -564,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.");
@@ -582,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.");
 
@@ -638,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 "
@@ -675,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.");
 
@@ -699,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.");
 
@@ -712,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,
@@ -723,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
@@ -734,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,
@@ -745,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 *
@@ -757,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
@@ -781,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>,
@@ -800,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.");
@@ -867,7 +761,7 @@
   static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR =
       const CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR',
           "The class '{0}' doesn't have a constant constructor '{1}'.",
-          correction: "Try calling a different contructor.");
+          correction: "Try calling a different constructor.");
 
   /**
    * 16.12.2 Const: It is a compile-time error if <i>T.id</i> is not the name of
@@ -879,7 +773,7 @@
   static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT =
       const CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT',
           "The class '{0}' doesn't have a default constant constructor.",
-          correction: "Try calling a different contructor.");
+          correction: "Try calling a different constructor.");
 
   /**
    * 15.3.1 Typedef: It is a compile-time error if any default values are
@@ -891,6 +785,17 @@
           correction: "Try removing the default value.");
 
   /**
+   * It is an error to call the default List constructor with a length argument
+   * and a type argument which is potentially non-nullable.
+   */
+  static const CompileTimeErrorCode DEFAULT_LIST_CONSTRUCTOR_MISMATCH =
+      const CompileTimeErrorCode(
+          'DEFAULT_LIST_CONSTRUCTOR_MISMATCH',
+          "A list whose values cannot be 'null' cannot be given an initial length "
+              "because the initial values would all be 'null'.",
+          correction: "Try removing the argument.");
+
+  /**
    * 6.2.1 Required Formals: By means of a function signature that names the
    * parameter and describes its type as a function type. It is a compile-time
    * error if any default values are specified in the signature of such a
@@ -910,10 +815,19 @@
       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.");
 
   /**
+   * It is an error if a required named parameter has a default value.
+   */
+  static const CompileTimeErrorCode DEFAULT_VALUE_ON_REQUIRED_PARAMETER =
+      const CompileTimeErrorCode('DEFAULT_VALUE_ON_REQUIRED_PARAMETER',
+          "Required named parameters cannot have a default value.",
+          correction: "Try removing either the default value or the 'required' "
+              "modifier.");
+
+  /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity
    * with the same name declared in the same scope.
    */
@@ -980,6 +894,22 @@
               "correcting one of the names to reference a different named parameter.");
 
   /**
+   * 16.10 Maps: It is a compile-time error if two keys of a constant map
+   * literal are equal according to their `==` operator (16.27).
+   */
+  static const CompileTimeErrorCode EQUAL_KEYS_IN_CONST_MAP =
+      const CompileTimeErrorCode('EQUAL_KEYS_IN_CONST_MAP',
+          "Two keys in a constant map literal can't be equal.");
+
+  /**
+   * 16.11 Sets: It is a compile-time error if two elements of a constant set
+   * literal are equal according to their `==` operator (16.27).
+   */
+  static const CompileTimeErrorCode EQUAL_ELEMENTS_IN_CONST_SET =
+      const CompileTimeErrorCode('EQUAL_ELEMENTS_IN_CONST_SET',
+          "Two values in a constant set can't be equal.");
+
+  /**
    * SDK implementation libraries can be exported only by other SDK libraries.
    *
    * Parameters:
@@ -1128,7 +1058,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.");
 
   /**
@@ -1263,7 +1193,7 @@
   static const CompileTimeErrorCode IMPLEMENTS_REPEATED =
       const CompileTimeErrorCode(
           'IMPLEMENTS_REPEATED', "'{0}' can only be implemented once.",
-          correction: "Try removing all but one occurance of the class name.");
+          correction: "Try removing all but one occurrence of the class name.");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the superclass of a
@@ -1276,7 +1206,7 @@
   static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS =
       const CompileTimeErrorCode('IMPLEMENTS_SUPER_CLASS',
           "'{0}' can't be used in both 'extends' and 'implements' clauses.",
-          correction: "Try removing one of the occurances.");
+          correction: "Try removing one of the occurrences.");
 
   /**
    * 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the
@@ -1363,7 +1293,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.");
@@ -1402,7 +1332,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.");
 
   /**
@@ -1438,7 +1368,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.");
 
   /**
@@ -1486,8 +1416,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}');
@@ -1502,7 +1432,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
@@ -1531,19 +1461,6 @@
           correction: "Try using a top-level variable or a field.");
 
   /**
-   * 15.31 Identifier Reference: It is a compile-time error if any of the
-   * identifiers async, await or yield is used as an identifier in a function
-   * body marked with either async, async* or sync*.
-   */
-  static const CompileTimeErrorCode INVALID_IDENTIFIER_IN_ASYNC =
-      const CompileTimeErrorCode(
-          'INVALID_IDENTIFIER_IN_ASYNC',
-          "The identifier '{0}' can't be used in a function marked with "
-          "'async', 'async*' or 'sync*'.",
-          correction: "Try using a different name, or "
-              "remove the modifier on the function body.");
-
-  /**
    * 9. Functions: It is a compile-time error if an async, async* or sync*
    * modifier is attached to the body of a setter or constructor.
    */
@@ -1587,7 +1504,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',
@@ -1596,6 +1513,20 @@
               "Try using a generic function type (returnType 'Function(' parameters ')').");
 
   /**
+   * It is an error if an optional parameter (named or otherwise) with no
+   * default value has a potentially non-nullable type. This is produced in
+   * cases where there is no valid default value.
+   */
+  static const CompileTimeErrorCode INVALID_OPTIONAL_PARAMETER_TYPE =
+      const CompileTimeErrorCode(
+          'INVALID_OPTIONAL_PARAMETER_TYPE',
+          "The parameter '{0}' cannot have a value of 'null' because of its "
+              "type, but no default value it valid, so it must be a required "
+              "parameter.",
+          correction: "Try making this nullable (by adding a '?') or "
+              "making this a required parameter.");
+
+  /**
    * If a class declaration has a member declaration, the signature of that
    * member declaration becomes the signature in the interface. It's a
    * compile-time error if that signature is not a valid override of all
@@ -1636,7 +1567,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.");
 
@@ -1651,7 +1582,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.");
 
@@ -1659,7 +1590,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.");
 
@@ -1670,7 +1601,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.");
 
   /**
@@ -1746,7 +1677,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.");
 
   /**
@@ -1756,7 +1687,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.");
 
   /**
@@ -1766,7 +1697,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 =
@@ -1775,6 +1706,33 @@
           correction: "Check your Dart SDK installation for completeness.");
 
   /**
+   * It is an error if an optional parameter (named or otherwise) with no
+   * default value has a potentially non-nullable type.
+   */
+  static const CompileTimeErrorCode MISSING_DEFAULT_VALUE_FOR_PARAMETER =
+      const CompileTimeErrorCode(
+          'MISSING_DEFAULT_VALUE_FOR_PARAMETER',
+          "The parameter '{0}' cannot have a value of 'null' because of its "
+              "type, so it must either be a required parameter or have a "
+              "default value.",
+          correction:
+              "Try adding either a default value or the 'required' modifier.");
+
+  /**
+   * It is an error if a named parameter that is marked as being required is
+   * not bound to an argument at a call site.
+   *
+   * Parameters:
+   * 0: the name of the parameter
+   */
+  static const CompileTimeErrorCode MISSING_REQUIRED_ARGUMENT =
+      const CompileTimeErrorCode(
+          'MISSING_REQUIRED_ARGUMENT',
+          "The named parameter '{0}' is required so "
+              "there needs to be a corresponding argument.",
+          correction: "Try adding the required argument.");
+
+  /**
    * It's a compile-time error to apply a mixin containing super-invocations to
    * a class that doesn't have a concrete implementation of the super-invoked
    * members compatible with the super-constraint interface.
@@ -1794,19 +1752,22 @@
       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
-   * implement all the on type requirements of the mixin declaration.
+   * implement all the `on` type requirements of the mixin declaration.
    *
    * Parameters:
-   * 0: the display name of the not implemented type
+   * 0: the display name of the mixin
+   * 1: the display name of the superclass
+   * 2: the display name of the type that is not implemented
    */
   static const CompileTimeErrorCode
       MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE = const CompileTimeErrorCode(
           'MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE',
-          "The class doesn't implement the required class '{0}'.",
+          "'{0}' cannot be mixed onto '{1}' "
+              "because '{1}' does not implement '{2}'.",
           correction: "Try extending the class '{0}'.");
 
   /**
@@ -1822,7 +1783,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
@@ -1835,7 +1796,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
@@ -1864,22 +1825,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
@@ -1892,7 +1853,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.
@@ -1945,7 +1906,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(
@@ -2061,7 +2022,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) {
@@ -2097,7 +2058,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.");
@@ -2122,7 +2083,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.");
@@ -2149,7 +2110,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.");
 
@@ -2173,7 +2134,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.");
 
   /**
@@ -2205,7 +2166,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.");
 
   /**
@@ -2227,38 +2188,38 @@
           correction: "Try removing the keyword 'const' from the set literal.");
 
   static const CompileTimeErrorCode
+      NON_CONSTANT_SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY =
+      const CompileTimeErrorCode(
+          'NON_CONSTANT_SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY',
+          "Constant values from a deferred library can't be spread into a "
+              "const literal.",
+          correction: "Try making the deferred import non-deferred.");
+
+  static const CompileTimeErrorCode
+      NON_CONSTANT_IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY =
+      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.",
+          correction: "Try making the deferred import non-deferred.");
+
+  static const CompileTimeErrorCode
       NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY =
       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.");
 
   /**
-   * 7.6.3 Constant Constructors: Any expression that appears within the
-   * initializer list of a constant constructor must be a potentially constant
-   * expression, or a compile-time error occurs.
+   * This error code is no longer being generated. It should be removed when the
+   * reference to it in the linter has been removed and rolled into the SDK.
    */
+  @deprecated
   static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER =
       const CompileTimeErrorCode('NON_CONSTANT_VALUE_IN_INITIALIZER',
           "Initializer expressions in constant constructors must be constants.");
 
-  /**
-   * 7.6.3 Constant Constructors: Any expression that appears within the
-   * initializer list of a constant constructor must be a potentially constant
-   * expression, or a compile-time error occurs.
-   *
-   * 12.1 Constants: A qualified reference to a static constant variable that is
-   * not qualified by a deferred prefix.
-   */
-  static const CompileTimeErrorCode
-      NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY =
-      const CompileTimeErrorCode(
-          'NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY',
-          "Constant values from a deferred library can't be used as constant "
-          "initializers.",
-          correction: "Try changing the import to not be deferred.");
-
   static const CompileTimeErrorCode NON_SYNC_FACTORY =
       const CompileTimeErrorCode('NON_SYNC_FACTORY',
           "Factory bodies can't use 'async', 'async*', or 'sync*'.");
@@ -2279,6 +2240,18 @@
           "{0} required argument(s) expected, but {1} found.",
           correction: "Try adding the missing arguments.");
 
+  static const CompileTimeErrorCode NOT_ITERABLE_SPREAD =
+      const CompileTimeErrorCode('NOT_ITERABLE_SPREAD',
+          "Spread elements in list or set literals must implement 'Iterable'.");
+
+  static const CompileTimeErrorCode NOT_MAP_SPREAD = const CompileTimeErrorCode(
+      'NOT_MAP_SPREAD',
+      "Spread elements in map literals must implement 'Map'.");
+
+  static const CompileTimeErrorCode NOT_NULL_AWARE_NULL_SPREAD =
+      const CompileTimeErrorCode('NOT_NULL_AWARE_NULL_SPREAD',
+          "The Null typed expression can't be used with a non-null-aware spread.");
+
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the
    * superinitializer appears and let <i>S</i> be the superclass of <i>C</i>.
@@ -2294,6 +2267,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.
    */
@@ -2312,7 +2332,7 @@
   static const CompileTimeErrorCode ON_REPEATED = const CompileTimeErrorCode(
       'ON_REPEATED',
       "'{0}' can only be used in super-class constraints only once.",
-      correction: "Try removing all but one occurance of the class name.");
+      correction: "Try removing all but one occurrence of the class name.");
 
   /**
    * 7.1.1 Operators: It is a compile-time error to declare an optional
@@ -2343,7 +2363,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.");
 
@@ -2355,7 +2375,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.");
@@ -2368,7 +2388,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.");
 
   /**
@@ -2505,7 +2525,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.");
 
   /**
@@ -2516,7 +2536,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.");
 
   /**
@@ -2594,7 +2614,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.");
 
   /**
@@ -2687,7 +2707,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',
@@ -2867,7 +2887,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.");
 
@@ -2879,7 +2899,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.");
 
@@ -2920,7 +2940,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.");
 
   /**
@@ -2931,7 +2951,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.");
 
   /**
@@ -2945,7 +2965,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.");
 
   /**
@@ -2956,7 +2976,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.");
 
@@ -2968,7 +2988,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.");
 
@@ -3248,6 +3268,8 @@
    * 0: the name of the getter
    * 1: the name of the enclosing type where the getter is being looked for
    */
+  // TODO(brianwilkerson) When the "target" is an enum, report
+  //  UNDEFINED_ENUM_CONSTANT instead.
   static const StaticTypeWarningCode UNDEFINED_GETTER =
       const StaticTypeWarningCode('UNDEFINED_GETTER',
           "The getter '{0}' isn't defined for the class '{1}'.",
@@ -3300,7 +3322,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}'.");
 
@@ -3428,7 +3450,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.");
 
   /**
@@ -3458,7 +3480,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.");
 
   /**
@@ -3483,7 +3505,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,
@@ -3511,7 +3533,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
@@ -3673,7 +3695,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.");
 
   /**
@@ -3711,21 +3733,6 @@
           correction: "Try creating an instance of a subtype.");
 
   /**
-   * 12.7 Maps: It is a static warning if the values of any two keys in a map
-   * literal are equal.
-   */
-  static const StaticWarningCode EQUAL_KEYS_IN_MAP = const StaticWarningCode(
-      'EQUAL_KEYS_IN_MAP', "Two keys in a map literal can't be equal.");
-
-  /**
-   * It is a compile-time error if any two of the values in a constant set are
-   * equal according to `==`.
-   */
-  static const StaticWarningCode EQUAL_VALUES_IN_CONST_SET =
-      const StaticWarningCode('EQUAL_VALUES_IN_CONST_SET',
-          "Two values in a constant set can't be equal.");
-
-  /**
    * 14.2 Exports: It is a static warning to export two different libraries with
    * the same name.
    *
@@ -3781,7 +3788,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.");
 
   /**
@@ -3797,7 +3804,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.");
 
   /**
@@ -3907,16 +3914,6 @@
           correction: "Try adding initializers for the fields.");
 
   /**
-   * 15.5 Function Types: It is a static warning if a concrete class implements
-   * Function and does not have a concrete method named call().
-   */
-  static const StaticWarningCode FUNCTION_WITHOUT_CALL = const StaticWarningCode(
-      'FUNCTION_WITHOUT_CALL',
-      "Concrete classes that implement 'Function' must implement the method 'call'.",
-      correction:
-          "Try implementing a 'call' method, or don't implement 'Function'.");
-
-  /**
    * 14.1 Imports: It is a static warning to import two different libraries with
    * the same name.
    *
@@ -3955,7 +3952,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);
 
@@ -3971,84 +3968,11 @@
       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);
 
   /**
-   * 7.1 Instance Methods: It is a static warning if an instance method
-   * <i>m1</i> overrides an instance member <i>m2</i> and <i>m1</i> does not
-   * declare all the named parameters declared by <i>m2</i>.
-   *
-   * Parameters:
-   * 0: the number of named parameters in the overridden member
-   * 1: the signature of the overridden member
-   * 2: the name of the class from the overridden method
-   */
-  static const StaticWarningCode INVALID_OVERRIDE_NAMED =
-      const StaticWarningCode(
-          'INVALID_OVERRIDE_NAMED',
-          "Missing the named parameter '{0}' "
-          "to match the overridden method from '{1}' from '{2}'.",
-          correction: "Try adding the named parameter to this method, or "
-              "removing it from the overridden method.");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method
-   * <i>m1</i> overrides an instance member <i>m2</i> and <i>m1</i> has fewer
-   * positional parameters than <i>m2</i>.
-   *
-   * Parameters:
-   * 0: the number of positional parameters in the overridden member
-   * 1: the signature of the overridden member
-   * 2: the name of the class from the overridden method
-   */
-  static const StaticWarningCode INVALID_OVERRIDE_POSITIONAL =
-      const StaticWarningCode(
-          'INVALID_OVERRIDE_POSITIONAL',
-          "Must have at least {0} parameters "
-          "to match the overridden method '{1}' from '{2}'.",
-          correction: "Try adding the necessary parameters.");
-
-  /**
-   * 7.1 Instance Methods: It is a static warning if an instance method
-   * <i>m1</i> overrides an instance member <i>m2</i> and <i>m1</i> has a
-   * greater number of required parameters than <i>m2</i>.
-   *
-   * Parameters:
-   * 0: the number of required parameters in the overridden member
-   * 1: the signature of the overridden member
-   * 2: the name of the class from the overridden method
-   */
-  static const StaticWarningCode INVALID_OVERRIDE_REQUIRED =
-      const StaticWarningCode(
-          'INVALID_OVERRIDE_REQUIRED',
-          "Must have {0} required parameters or less "
-          "to match the overridden method '{1}' from '{2}'.",
-          correction: "Try removing the extra parameters.");
-
-  /**
-   * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a
-   * setter <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of
-   * <i>m2</i>.
-   *
-   * Parameters:
-   * 0: the name of the actual parameter type
-   * 1: the name of the expected parameter type, not assignable to the actual
-   * parameter type
-   * 2: the name of the class where the overridden setter is declared
-   *
-   * See [INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE].
-   */
-  static const StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE =
-      const StaticWarningCode(
-          'INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE',
-          "The parameter type '{0}' isn't assignable to '{1}' as required by "
-          "the setter it is overriding from '{2}'.",
-          correction:
-              "Try changing the parameter types so that they are compatible.");
-
-  /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i>
    * &hellip; <i>e<sub>n</sub></i>] is evaluated as follows:
    * * The operator []= is invoked on <i>a</i> with first argument <i>i</i> and
@@ -4122,7 +4046,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.");
 
   /**
@@ -4182,7 +4106,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.");
 
   /**
@@ -4540,7 +4464,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
@@ -4664,7 +4588,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.');
 
@@ -4790,29 +4714,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,
@@ -4823,21 +4747,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,
@@ -4847,11 +4771,6 @@
   static const StrongModeCode DYNAMIC_INVOKE = const StrongModeCode(
       ErrorType.HINT, 'DYNAMIC_INVOKE', "'{0}' requires a dynamic invoke.");
 
-  static const StrongModeCode INVALID_FIELD_OVERRIDE = const StrongModeCode(
-      ErrorType.COMPILE_TIME_ERROR,
-      'INVALID_FIELD_OVERRIDE',
-      "Field declaration '{3}.{1}' can't be overridden in '{0}'.");
-
   static const StrongModeCode IMPLICIT_DYNAMIC_PARAMETER = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       'IMPLICIT_DYNAMIC_PARAMETER',
@@ -4914,12 +4833,6 @@
       "Missing type arguments for calling generic function type '{0}'.",
       correction: _implicitDynamicCorrection);
 
-  static const StrongModeCode NO_DEFAULT_BOUNDS = const StrongModeCode(
-      ErrorType.COMPILE_TIME_ERROR,
-      'NO_DEFAULT_BOUNDS',
-      "Type has no default bounds",
-      correction: "Try adding explicit type arguments to type");
-
   static const StrongModeCode NOT_INSTANTIATED_BOUND = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       'NOT_INSTANTIATED_BOUND',
@@ -4956,22 +4869,16 @@
       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}'.");
 
-  static const StrongModeCode TOP_LEVEL_UNSUPPORTED = const StrongModeCode(
-      ErrorType.HINT,
-      'TOP_LEVEL_UNSUPPORTED',
-      "The type of '{0}' can't be inferred because {1} expressions aren't supported.",
-      correction: "Try adding an explicit type for '{0}'.");
-
   @override
   final ErrorType type;
 
diff --git a/analyzer/lib/src/error/literal_element_verifier.dart b/analyzer/lib/src/error/literal_element_verifier.dart
new file mode 100644
index 0000000..89dcdce
--- /dev/null
+++ b/analyzer/lib/src/error/literal_element_verifier.dart
@@ -0,0 +1,220 @@
+// 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/dart/ast/token.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+/// Verifier for [CollectionElement]s in list, set, or map literals.
+class LiteralElementVerifier {
+  final TypeProvider typeProvider;
+  final TypeSystem typeSystem;
+  final ErrorReporter errorReporter;
+  final bool Function(Expression) checkForUseOfVoidResult;
+
+  final bool forList;
+  final bool forSet;
+  final DartType elementType;
+
+  final bool forMap;
+  final DartType mapKeyType;
+  final DartType mapValueType;
+
+  LiteralElementVerifier(
+    this.typeProvider,
+    this.typeSystem,
+    this.errorReporter,
+    this.checkForUseOfVoidResult, {
+    this.forList = false,
+    this.forSet = false,
+    this.elementType,
+    this.forMap = false,
+    this.mapKeyType,
+    this.mapValueType,
+  });
+
+  void verify(CollectionElement element) {
+    _verifyElement(element);
+  }
+
+  /// Check that the given [type] is assignable to the [elementType], otherwise
+  /// report the list or set error on the [errorNode].
+  void _checkAssignableToElementType(DartType type, AstNode errorNode) {
+    if (!typeSystem.isAssignableTo(type, elementType)) {
+      var errorCode = forList
+          ? StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+          : StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE;
+      errorReporter.reportTypeErrorForNode(
+        errorCode,
+        errorNode,
+        [type, elementType],
+      );
+    }
+  }
+
+  /// Verify that the given [element] can be assigned to the [elementType] of
+  /// the enclosing list, set, of map literal.
+  void _verifyElement(CollectionElement element) {
+    if (element is Expression) {
+      if (forList || forSet) {
+        if (!elementType.isVoid && checkForUseOfVoidResult(element)) {
+          return;
+        }
+        _checkAssignableToElementType(element.staticType, element);
+      } else {
+        errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.EXPRESSION_IN_MAP, element);
+      }
+    } else if (element is ForElement) {
+      _verifyElement(element.body);
+    } else if (element is IfElement) {
+      _verifyElement(element.thenElement);
+      _verifyElement(element.elseElement);
+    } else if (element is MapLiteralEntry) {
+      if (forMap) {
+        _verifyMapLiteralEntry(element);
+      } else {
+        errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.MAP_ENTRY_NOT_IN_MAP, element);
+      }
+    } else if (element is SpreadElement) {
+      var isNullAware = element.spreadOperator.type ==
+          TokenType.PERIOD_PERIOD_PERIOD_QUESTION;
+      Expression expression = element.expression;
+      if (forList || forSet) {
+        _verifySpreadForListOrSet(isNullAware, expression);
+      } else if (forMap) {
+        _verifySpreadForMap(isNullAware, expression);
+      }
+    }
+  }
+
+  /// Verify that the [entry]'s key and value are assignable to [mapKeyType]
+  /// and [mapValueType].
+  void _verifyMapLiteralEntry(MapLiteralEntry entry) {
+    if (!mapKeyType.isVoid && checkForUseOfVoidResult(entry.key)) {
+      return;
+    }
+
+    if (!mapValueType.isVoid && checkForUseOfVoidResult(entry.value)) {
+      return;
+    }
+
+    var keyType = entry.key.staticType;
+    if (!typeSystem.isAssignableTo(keyType, mapKeyType)) {
+      errorReporter.reportTypeErrorForNode(
+        StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
+        entry.key,
+        [keyType, mapKeyType],
+      );
+    }
+
+    var valueType = entry.value.staticType;
+    if (!typeSystem.isAssignableTo(valueType, mapValueType)) {
+      errorReporter.reportTypeErrorForNode(
+        StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
+        entry.value,
+        [valueType, mapValueType],
+      );
+    }
+  }
+
+  /// Verify that the type of the elements of the given [expression] can be
+  /// assigned to the [elementType] of the enclosing collection.
+  void _verifySpreadForListOrSet(bool isNullAware, Expression expression) {
+    var expressionType = expression.staticType;
+    if (expressionType.isDynamic) return;
+
+    if (expressionType.isDartCoreNull) {
+      if (!isNullAware) {
+        errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.NOT_NULL_AWARE_NULL_SPREAD,
+          expression,
+        );
+      }
+      return;
+    }
+
+    InterfaceType iterableType;
+    var iterableObjectType = typeProvider.iterableObjectType;
+    if (expressionType is InterfaceTypeImpl &&
+        typeSystem.isSubtypeOf(expressionType, iterableObjectType)) {
+      iterableType = expressionType.asInstanceOf(
+        iterableObjectType.element,
+      );
+    }
+
+    if (iterableType == null) {
+      return errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.NOT_ITERABLE_SPREAD,
+        expression,
+      );
+    }
+
+    var iterableElementType = iterableType.typeArguments[0];
+    if (!typeSystem.isAssignableTo(iterableElementType, elementType)) {
+      var errorCode = forList
+          ? StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+          : StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE;
+      errorReporter.reportTypeErrorForNode(
+        errorCode,
+        expression,
+        [iterableElementType, elementType],
+      );
+    }
+  }
+
+  /// Verify that the [expression] is a subtype of `Map<Object, Object>`, and
+  /// its key and values are assignable to [mapKeyType] and [mapValueType].
+  void _verifySpreadForMap(bool isNullAware, Expression expression) {
+    var expressionType = expression.staticType;
+    if (expressionType.isDynamic) return;
+
+    if (expressionType.isDartCoreNull) {
+      if (!isNullAware) {
+        errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.NOT_NULL_AWARE_NULL_SPREAD,
+          expression,
+        );
+      }
+      return;
+    }
+
+    InterfaceType mapType;
+    var mapObjectObjectType = typeProvider.mapObjectObjectType;
+    if (expressionType is InterfaceTypeImpl &&
+        typeSystem.isSubtypeOf(expressionType, mapObjectObjectType)) {
+      mapType = expressionType.asInstanceOf(mapObjectObjectType.element);
+    }
+
+    if (mapType == null) {
+      return errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.NOT_MAP_SPREAD,
+        expression,
+      );
+    }
+
+    var keyType = mapType.typeArguments[0];
+    if (!typeSystem.isAssignableTo(keyType, mapKeyType)) {
+      errorReporter.reportTypeErrorForNode(
+        StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
+        expression,
+        [keyType, mapKeyType],
+      );
+    }
+
+    var valueType = mapType.typeArguments[1];
+    if (!typeSystem.isAssignableTo(valueType, mapValueType)) {
+      errorReporter.reportTypeErrorForNode(
+        StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
+        expression,
+        [valueType, mapValueType],
+      );
+    }
+  }
+}
diff --git a/analyzer/lib/src/fasta/ast_builder.dart b/analyzer/lib/src/fasta/ast_builder.dart
index 29d4bd9..ccc46ca 100644
--- a/analyzer/lib/src/fasta/ast_builder.dart
+++ b/analyzer/lib/src/fasta/ast_builder.dart
@@ -1,7 +1,8 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/ast_factory.dart' show AstFactory;
 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard;
@@ -29,6 +30,8 @@
         messageFieldInitializerOutsideConstructor,
         messageIllegalAssignmentToNonAssignable,
         messageInterpolationInUri,
+        messageInvalidSuperInInitializer,
+        messageInvalidThisInInitializer,
         messageMissingAssignableSelector,
         messageNativeClauseShouldBeAnnotation,
         messageStaticConstructor,
@@ -102,7 +105,10 @@
 
   bool parseFunctionBodies = true;
 
-  /// `true` if non-nullable behavior is enabled
+  /// `true` if non-nullable behavior is enabled.
+  ///
+  /// When setting this field, be sure to set `scanner.enableNonNullable`
+  /// to the same value.
   bool enableNonNullable = false;
 
   /// `true` if spread-collections behavior is enabled
@@ -111,6 +117,11 @@
   /// `true` if control-flow-collections behavior is enabled
   bool enableControlFlowCollections = false;
 
+  /// `true` if triple-shift behavior is enabled
+  bool enableTripleShift = false;
+
+  FeatureSet _featureSet;
+
   AstBuilder(ErrorReporter errorReporter, this.fileUri, this.isFullAst,
       [Uri uri])
       : this.errorReporter = new FastaErrorReporter(errorReporter),
@@ -162,11 +173,12 @@
   }
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
-      Token varFinalOrConst) {
+  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
+      Token covariantToken, Token varFinalOrConst) {
     push(new _Modifiers()
       ..covariantKeyword = covariantToken
-      ..finalConstOrVarKeyword = varFinalOrConst);
+      ..finalConstOrVarKeyword = varFinalOrConst
+      ..requiredToken = requiredToken);
   }
 
   @override
@@ -248,10 +260,13 @@
   }
 
   @override
-  void beginVariablesDeclaration(Token token, Token varFinalOrConst) {
+  void beginVariablesDeclaration(
+      Token token, Token lateToken, Token varFinalOrConst) {
     debugEvent("beginVariablesDeclaration");
-    if (varFinalOrConst != null) {
-      push(new _Modifiers()..finalConstOrVarKeyword = varFinalOrConst);
+    if (varFinalOrConst != null || lateToken != null) {
+      push(new _Modifiers()
+        ..finalConstOrVarKeyword = varFinalOrConst
+        ..lateToken = lateToken);
     } else {
       push(NullValue.Modifiers);
     }
@@ -269,6 +284,21 @@
     }
   }
 
+  /// Configures the parser appropriately for the given [featureSet].
+  ///
+  /// TODO(paulberry): stop exposing `enableNonNullable`,
+  /// `enableSpreadCollections`, `enableControlFlowCollections`, and
+  /// `enableTripleShift` so that callers are forced to use this API.  Note that
+  /// this will not be a breaking change, because this code is in `lib/src`.
+  void configureFeatures(FeatureSet featureSet) {
+    enableNonNullable = featureSet.isEnabled(Feature.non_nullable);
+    enableSpreadCollections = featureSet.isEnabled(Feature.spread_collections);
+    enableControlFlowCollections =
+        featureSet.isEnabled(Feature.control_flow_collections);
+    enableTripleShift = featureSet.isEnabled(Feature.triple_shift);
+    _featureSet = featureSet;
+  }
+
   @override
   void debugEvent(String name) {
     // printEvent('AstBuilder: $name');
@@ -395,6 +425,13 @@
       Expression left = pop();
       reportErrorIfSuper(right);
       push(ast.binaryExpression(left, operatorToken, right));
+      if (!enableTripleShift && operatorToken.type == TokenType.GT_GT_GT) {
+        handleRecoverableError(
+            templateExperimentNotEnabled
+                .withArguments(EnableString.triple_shift),
+            operatorToken,
+            operatorToken);
+      }
     }
   }
 
@@ -467,10 +504,13 @@
     Token beginToken = pop();
     checkEmpty(endToken.charOffset);
 
-    CompilationUnitImpl unit = ast.compilationUnit(
-            beginToken, scriptTag, directives, declarations, endToken)
-        as CompilationUnitImpl;
-    unit.isNonNullable = enableNonNullable;
+    CompilationUnitImpl unit = ast.compilationUnit2(
+        beginToken: beginToken,
+        scriptTag: scriptTag,
+        directives: directives,
+        declarations: declarations,
+        endToken: endToken,
+        featureSet: _featureSet) as CompilationUnitImpl;
     push(unit);
   }
 
@@ -681,27 +721,27 @@
   }
 
   @override
-  void endFields(Token staticToken, Token covariantToken, Token varFinalOrConst,
-      int count, Token beginToken, Token semicolon) {
+  void endFields(Token staticToken, Token covariantToken, Token lateToken,
+      Token varFinalOrConst, int count, Token beginToken, Token semicolon) {
     assert(optional(';', semicolon));
     debugEvent("Fields");
 
     List<VariableDeclaration> variables = popTypedList(count);
     TypeAnnotation type = pop();
-    _Modifiers modifiers = new _Modifiers()
-      ..staticKeyword = staticToken
-      ..covariantKeyword = covariantToken
-      ..finalConstOrVarKeyword = varFinalOrConst;
-    var variableList = ast.variableDeclarationList(
-        null, null, modifiers?.finalConstOrVarKeyword, type, variables);
-    Token covariantKeyword = modifiers?.covariantKeyword;
+    var variableList = ast.variableDeclarationList2(
+      lateKeyword: lateToken,
+      keyword: varFinalOrConst,
+      type: type,
+      variables: variables,
+    );
+    Token covariantKeyword = covariantToken;
     List<Annotation> metadata = pop();
     Comment comment = _findComment(metadata, beginToken);
     (classDeclaration ?? mixinDeclaration).members.add(ast.fieldDeclaration2(
         comment: comment,
         metadata: metadata,
         covariantKeyword: covariantKeyword,
-        staticKeyword: modifiers?.staticKeyword,
+        staticKeyword: staticToken,
         fieldList: variableList,
         semicolon: semicolon));
   }
@@ -727,7 +767,7 @@
     Token forToken = pop();
     Token awaitToken = pop(NullValue.AwaitToken);
 
-    push(ast.forStatement2(
+    push(ast.forStatement(
       awaitKeyword: awaitToken,
       forKeyword: forToken,
       leftParenthesis: leftParenthesis,
@@ -776,6 +816,10 @@
     _Modifiers modifiers = pop();
     Token keyword = modifiers?.finalConstOrVarKeyword;
     Token covariantKeyword = modifiers?.covariantKeyword;
+    Token requiredKeyword = modifiers?.requiredToken;
+    if (!enableNonNullable) {
+      reportNonNullableModifierError(requiredKeyword);
+    }
     List<Annotation> metadata = pop();
     Comment comment = _findComment(metadata,
         thisKeyword ?? typeOrFunctionTypedParameter?.beginToken ?? nameToken);
@@ -791,6 +835,7 @@
             comment: comment,
             metadata: metadata,
             covariantKeyword: covariantKeyword,
+            requiredKeyword: requiredKeyword,
             returnType: typeOrFunctionTypedParameter.returnType,
             typeParameters: typeOrFunctionTypedParameter.typeParameters,
             parameters: typeOrFunctionTypedParameter.parameters);
@@ -800,6 +845,7 @@
             comment: comment,
             metadata: metadata,
             covariantKeyword: covariantKeyword,
+            requiredKeyword: requiredKeyword,
             type: typeOrFunctionTypedParameter.returnType,
             thisKeyword: thisKeyword,
             period: periodAfterThis,
@@ -813,6 +859,7 @@
             comment: comment,
             metadata: metadata,
             covariantKeyword: covariantKeyword,
+            requiredKeyword: requiredKeyword,
             keyword: keyword,
             type: type,
             identifier: name);
@@ -821,6 +868,7 @@
             comment: comment,
             metadata: metadata,
             covariantKeyword: covariantKeyword,
+            requiredKeyword: requiredKeyword,
             keyword: keyword,
             type: type,
             thisKeyword: thisKeyword,
@@ -829,7 +877,8 @@
       }
     }
 
-    ParameterKind analyzerKind = _toAnalyzerParameterKind(kind);
+    ParameterKind analyzerKind =
+        _toAnalyzerParameterKind(kind, requiredKeyword);
     FormalParameter parameter = node;
     if (analyzerKind != ParameterKind.REQUIRED) {
       parameter = ast.defaultFormalParameter(
@@ -880,7 +929,7 @@
     Token leftParen = pop();
     Token forToken = pop();
 
-    push(ast.forStatement2(
+    push(ast.forStatement(
       forKeyword: forToken,
       leftParenthesis: leftParen,
       forLoopParts: forLoopParts,
@@ -1123,8 +1172,31 @@
               initializerObject.methodName,
               initializerObject.argumentList));
         } else {
-          // Invalid initializer
-          // TODO(danrubel): Capture this in the AST.
+          // Recovery: Invalid initializer
+          if (target is FunctionExpressionInvocation) {
+            var targetFunct = target.function;
+            if (targetFunct is SuperExpression) {
+              initializers.add(ast.superConstructorInvocation(
+                  targetFunct.superKeyword, null, null, target.argumentList));
+              // TODO(danrubel): Consider generating this error in the parser
+              // This error is also reported in the body builder
+              handleRecoverableError(messageInvalidSuperInInitializer,
+                  targetFunct.superKeyword, targetFunct.superKeyword);
+            } else if (targetFunct is ThisExpression) {
+              initializers.add(ast.redirectingConstructorInvocation(
+                  targetFunct.thisKeyword, null, null, target.argumentList));
+              // TODO(danrubel): Consider generating this error in the parser
+              // This error is also reported in the body builder
+              handleRecoverableError(messageInvalidThisInInitializer,
+                  targetFunct.thisKeyword, targetFunct.thisKeyword);
+            } else {
+              throw new UnsupportedError(
+                  'unsupported initializer $initializerObject');
+            }
+          } else {
+            throw new UnsupportedError(
+                'unsupported initializer $initializerObject');
+          }
         }
       } else if (initializerObject is AssignmentExpression) {
         Token thisKeyword;
@@ -1158,6 +1230,36 @@
             initializerObject.rightHandSide));
       } else if (initializerObject is AssertInitializer) {
         initializers.add(initializerObject);
+      } else if (initializerObject is PropertyAccess) {
+        // Recovery: Invalid initializer
+        Expression target = initializerObject.target;
+        if (target is FunctionExpressionInvocation) {
+          var targetFunct = target.function;
+          if (targetFunct is SuperExpression) {
+            initializers.add(ast.superConstructorInvocation(
+                targetFunct.superKeyword, null, null, target.argumentList));
+            // TODO(danrubel): Consider generating this error in the parser
+            // This error is also reported in the body builder
+            handleRecoverableError(messageInvalidSuperInInitializer,
+                targetFunct.superKeyword, targetFunct.superKeyword);
+          } else if (targetFunct is ThisExpression) {
+            initializers.add(ast.redirectingConstructorInvocation(
+                targetFunct.thisKeyword, null, null, target.argumentList));
+            // TODO(danrubel): Consider generating this error in the parser
+            // This error is also reported in the body builder
+            handleRecoverableError(messageInvalidThisInInitializer,
+                targetFunct.thisKeyword, targetFunct.thisKeyword);
+          } else {
+            throw new UnsupportedError(
+                'unsupported initializer $initializerObject');
+          }
+        } else {
+          throw new UnsupportedError(
+              'unsupported initializer $initializerObject');
+        }
+      } else {
+        throw new UnsupportedError('unsupported initializer:'
+            ' ${initializerObject.runtimeType} :: $initializerObject');
       }
     }
 
@@ -1657,20 +1759,25 @@
     debugEvent("TopLevelDeclaration");
   }
 
-  void endTopLevelFields(Token staticToken, Token covariantToken,
-      Token varFinalOrConst, int count, Token beginToken, Token semicolon) {
+  void endTopLevelFields(
+      Token staticToken,
+      Token covariantToken,
+      Token lateToken,
+      Token varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token semicolon) {
     assert(optional(';', semicolon));
     debugEvent("TopLevelFields");
 
     List<VariableDeclaration> variables = popTypedList(count);
     TypeAnnotation type = pop();
-    _Modifiers modifiers = new _Modifiers()
-      ..staticKeyword = staticToken
-      ..covariantKeyword = covariantToken
-      ..finalConstOrVarKeyword = varFinalOrConst;
-    Token keyword = modifiers?.finalConstOrVarKeyword;
-    var variableList =
-        ast.variableDeclarationList(null, null, keyword, type, variables);
+    var variableList = ast.variableDeclarationList2(
+      lateKeyword: lateToken,
+      keyword: varFinalOrConst,
+      type: type,
+      variables: variables,
+    );
     List<Annotation> metadata = pop();
     Comment comment = _findComment(metadata, beginToken);
     declarations.add(ast.topLevelVariableDeclaration(
@@ -1780,8 +1887,14 @@
     Comment comment = _findComment(metadata,
         variables[0].beginToken ?? type?.beginToken ?? modifiers.beginToken);
     push(ast.variableDeclarationStatement(
-        ast.variableDeclarationList(
-            comment, metadata, keyword, type, variables),
+        ast.variableDeclarationList2(
+          comment: comment,
+          metadata: metadata,
+          lateKeyword: modifiers?.lateToken,
+          keyword: keyword,
+          type: type,
+          variables: variables,
+        ),
         semicolon));
   }
 
@@ -1869,6 +1982,12 @@
           messageMissingAssignableSelector, lhs.beginToken, lhs.endToken);
     }
     push(ast.assignmentExpression(lhs, token, rhs));
+    if (!enableTripleShift && token.type == TokenType.GT_GT_GT_EQ) {
+      handleRecoverableError(
+          templateExperimentNotEnabled.withArguments(EnableString.triple_shift),
+          token,
+          token);
+    }
   }
 
   void handleAsyncModifier(Token asyncToken, Token starToken) {
@@ -2080,6 +2199,11 @@
     push(ast.emptyStatement(semicolon));
   }
 
+  @override
+  void handleErrorToken(ErrorToken token) {
+    translateErrorToken(token, errorReporter.reportScannerError);
+  }
+
   void handleExpressionFunctionBody(Token arrowToken, Token semicolon) {
     assert(optional('=>', arrowToken) || optional('=', arrowToken));
     assert(optionalOrNull(';', semicolon));
@@ -2523,9 +2647,13 @@
             }
           }
         }
-        // ignore: deprecated_member_use_from_same_package
-        push(ast.setLiteral(
-            constKeyword, typeArguments, leftBrace, setEntries, rightBrace));
+        push(ast.setOrMapLiteral(
+          constKeyword: constKeyword,
+          typeArguments: typeArguments,
+          leftBracket: leftBrace,
+          elements: setEntries,
+          rightBracket: rightBrace,
+        ));
       } else {
         final mapEntries = <MapLiteralEntry>[];
         if (elements != null) {
@@ -2546,9 +2674,13 @@
             }
           }
         }
-        // ignore: deprecated_member_use_from_same_package
-        push(ast.mapLiteral(
-            constKeyword, typeArguments, leftBrace, mapEntries, rightBrace));
+        push(ast.setOrMapLiteral(
+          constKeyword: constKeyword,
+          typeArguments: typeArguments,
+          leftBracket: leftBrace,
+          elements: mapEntries,
+          rightBracket: rightBrace,
+        ));
       }
     }
   }
@@ -3156,10 +3288,14 @@
     return variableDeclaration;
   }
 
-  ParameterKind _toAnalyzerParameterKind(FormalParameterKind type) {
+  ParameterKind _toAnalyzerParameterKind(
+      FormalParameterKind type, Token requiredKeyword) {
     if (type == FormalParameterKind.optionalPositional) {
       return ParameterKind.POSITIONAL;
     } else if (type == FormalParameterKind.optionalNamed) {
+      if (requiredKeyword != null) {
+        return ParameterKind.NAMED_REQUIRED;
+      }
       return ParameterKind.NAMED;
     } else {
       return ParameterKind.REQUIRED;
@@ -3194,34 +3330,8 @@
   Token finalConstOrVarKeyword;
   Token staticKeyword;
   Token covariantKeyword;
-
-  _Modifiers([List<Token> modifierTokens]) {
-    // No need to check the order and uniqueness of the modifiers, or that
-    // disallowed modifiers are not used; the parser should do that.
-    // TODO(paulberry,ahe): implement the necessary logic in the parser.
-    if (modifierTokens != null) {
-      for (var token in modifierTokens) {
-        var s = token.lexeme;
-        if (identical('abstract', s)) {
-          abstractKeyword = token;
-        } else if (identical('const', s)) {
-          finalConstOrVarKeyword = token;
-        } else if (identical('external', s)) {
-          externalKeyword = token;
-        } else if (identical('final', s)) {
-          finalConstOrVarKeyword = token;
-        } else if (identical('static', s)) {
-          staticKeyword = token;
-        } else if (identical('var', s)) {
-          finalConstOrVarKeyword = token;
-        } else if (identical('covariant', s)) {
-          covariantKeyword = token;
-        } else {
-          unhandled("$s", "modifier", token.charOffset, null);
-        }
-      }
-    }
-  }
+  Token requiredToken;
+  Token lateToken;
 
   /// Return the token that is lexically first.
   Token get beginToken {
@@ -3231,7 +3341,9 @@
       externalKeyword,
       finalConstOrVarKeyword,
       staticKeyword,
-      covariantKeyword
+      covariantKeyword,
+      requiredToken,
+      lateToken,
     ]) {
       if (firstToken == null) {
         firstToken = token;
diff --git a/analyzer/lib/src/fasta/token_utils.dart b/analyzer/lib/src/fasta/token_utils.dart
index 2037396..c5ad5c2 100644
--- a/analyzer/lib/src/fasta/token_utils.dart
+++ b/analyzer/lib/src/fasta/token_utils.dart
@@ -4,45 +4,6 @@
 
 import 'package:front_end/src/scanner/token.dart' show CommentToken, Token;
 
-import 'package:front_end/src/fasta/scanner/token_constants.dart';
-
-import 'package:front_end/src/scanner/errors.dart' show translateErrorToken;
-
-import 'package:front_end/src/scanner/errors.dart' as analyzer
-    show ScannerErrorCode;
-
-/// Class capable of converting a stream of Fasta tokens to a stream of analyzer
-/// tokens.
-///
-/// This is a class rather than an ordinary method so that it can be subclassed
-/// in tests.
-class ToAnalyzerTokenStreamConverter {
-  /// Converts a stream of Fasta tokens (starting with [token] and continuing to
-  /// EOF) to a stream of analyzer tokens. This modifies the fasta token stream
-  /// to be an analyzer token stream by removing error tokens and reporting
-  /// those errors to the associated error listener.
-  Token convertTokens(Token firstToken) {
-    Token token = new Token.eof(-1)..setNext(firstToken);
-    Token next = firstToken;
-    while (!next.isEof) {
-      if (next.type.kind == BAD_INPUT_TOKEN) {
-        translateErrorToken(next, reportError);
-        token.setNext(next.next);
-      } else {
-        token = next;
-      }
-      next = token.next;
-    }
-    return firstToken;
-  }
-
-  /// Handles an error found during [convertTokens].
-  ///
-  /// Intended to be overridden by derived classes; by default, does nothing.
-  void reportError(analyzer.ScannerErrorCode errorCode, int offset,
-      List<Object> arguments) {}
-}
-
 /// Search for the token before [target] starting the search with [start].
 /// Return `null` if [target] is a comment token
 /// or the previous token cannot be found.
diff --git a/analyzer/lib/src/file_system/file_system.dart b/analyzer/lib/src/file_system/file_system.dart
index 183b8d1..28bd8b2 100644
--- a/analyzer/lib/src/file_system/file_system.dart
+++ b/analyzer/lib/src/file_system/file_system.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/src/generated/ast.dart b/analyzer/lib/src/generated/ast.dart
index 3b0eba2..a1900ab 100644
--- a/analyzer/lib/src/generated/ast.dart
+++ b/analyzer/lib/src/generated/ast.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/src/generated/constant.dart b/analyzer/lib/src/generated/constant.dart
index b4a0bda..ea8336f 100644
--- a/analyzer/lib/src/generated/constant.dart
+++ b/analyzer/lib/src/generated/constant.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
@@ -128,9 +129,15 @@
         new ConstantEvaluationEngine(_typeProvider, new DeclaredVariables(),
             typeSystem: _typeSystem),
         errorReporter));
+    List<AnalysisError> errors = errorListener.errors;
+    if (errors.isNotEmpty) {
+      return EvaluationResult.forErrors(errors);
+    }
     if (result != null) {
       return EvaluationResult.forValue(result);
     }
-    return EvaluationResult.forErrors(errorListener.errors);
+    // We should not get here. Either there should be a valid value or there
+    // should be an error explaining why a value could not be generated.
+    return EvaluationResult.forErrors(errors);
   }
 }
diff --git a/analyzer/lib/src/generated/declaration_resolver.dart b/analyzer/lib/src/generated/declaration_resolver.dart
index 7175395..582ab2d 100644
--- a/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/analyzer/lib/src/generated/declaration_resolver.dart
@@ -137,10 +137,7 @@
       });
     }
 
-    bool isFunctionTyped = normalParameter is FunctionTypedFormalParameter ||
-        normalParameter is FieldFormalParameter &&
-            normalParameter.parameters != null;
-    _walk(new ElementWalker.forParameter(element, isFunctionTyped), () {
+    _walk(new ElementWalker.forParameter(element), () {
       normalParameter.accept(this);
     });
 
@@ -202,8 +199,7 @@
     if (node.parent is! DefaultFormalParameter) {
       ParameterElement element =
           _match(node.identifier, _walker.getParameter());
-      bool isFunctionTyped = node.parameters != null;
-      _walk(new ElementWalker.forParameter(element, isFunctionTyped), () {
+      _walk(new ElementWalker.forParameter(element), () {
         super.visitFieldFormalParameter(node);
       });
       resolveMetadata(node, node.metadata, element);
@@ -264,7 +260,7 @@
     if (node.parent is! DefaultFormalParameter) {
       ParameterElement element =
           _match(node.identifier, _walker.getParameter());
-      _walk(new ElementWalker.forParameter(element, true), () {
+      _walk(new ElementWalker.forParameter(element), () {
         super.visitFunctionTypedFormalParameter(node);
       });
       resolveMetadata(node, node.metadata, element);
@@ -405,7 +401,7 @@
           _match(node.identifier, _walker.getParameter());
       (node as SimpleFormalParameterImpl).declaredElement = element;
       _setGenericFunctionType(node.type, element.type);
-      _walk(new ElementWalker.forParameter(element, false), () {
+      _walk(new ElementWalker.forParameter(element), () {
         super.visitSimpleFormalParameter(node);
       });
       resolveMetadata(node, node.metadata, element);
@@ -739,7 +735,7 @@
   /// corresponding type arguments of the [typeArguments].
   static void _applyTypeArgumentsToList(LibraryElement enclosingLibraryElement,
       DartType type, List<TypeAnnotation> typeArguments) {
-    if (type != null && type.isUndefined) {
+    if (type != null && type.isDynamic) {
       for (TypeAnnotation argument in typeArguments) {
         applyToTypeAnnotation(enclosingLibraryElement, type, argument);
       }
@@ -851,18 +847,10 @@
 
   /// Creates an [ElementWalker] which walks the child elements of a parameter
   /// element.
-  ElementWalker.forParameter(ParameterElement element, bool functionTyped)
+  ElementWalker.forParameter(ParameterElement element)
       : element = element,
         _parameters = element.parameters,
-        _typeParameters = element.typeParameters {
-    // If the parameter node is function typed, extract type parameters and
-    // formal parameters from its generic function type element.
-    if (functionTyped) {
-      GenericFunctionTypeElement typeElement = element.type.element;
-      _typeParameters = typeElement.typeParameters;
-      _parameters = typeElement.parameters;
-    }
-  }
+        _typeParameters = element.typeParameters;
 
   /// Creates an [ElementWalker] which walks the child elements of a typedef
   /// element.
diff --git a/analyzer/lib/src/generated/element.dart b/analyzer/lib/src/generated/element.dart
index 5518d7c..da03617 100644
--- a/analyzer/lib/src/generated/element.dart
+++ b/analyzer/lib/src/generated/element.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/src/generated/element_handle.dart b/analyzer/lib/src/generated/element_handle.dart
index 115c44d..4c798bd 100644
--- a/analyzer/lib/src/generated/element_handle.dart
+++ b/analyzer/lib/src/generated/element_handle.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/src/generated/element_resolver.dart b/analyzer/lib/src/generated/element_resolver.dart
index 9a99f54..27097db 100644
--- a/analyzer/lib/src/generated/element_resolver.dart
+++ b/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);
@@ -847,7 +852,7 @@
     // in-lining _resolveArgumentsToFunction below).
     ClassDeclaration declaration =
         node.thisOrAncestorOfType<ClassDeclaration>();
-    Identifier superclassName = declaration.extendsClause?.superclass?.name;
+    Identifier superclassName = declaration?.extendsClause?.superclass?.name;
     if (superclassName != null &&
         _resolver.nameScope.shouldIgnoreUndefined(superclassName)) {
       return;
@@ -953,10 +958,16 @@
   /**
    * Return the name of the method invoked by the given postfix [expression].
    */
-  String _getPostfixOperator(PostfixExpression expression) =>
-      (expression.operator.type == TokenType.PLUS_PLUS)
-          ? TokenType.PLUS.lexeme
-          : TokenType.MINUS.lexeme;
+  String _getPostfixOperator(PostfixExpression expression) {
+    if (expression.operator.type == TokenType.PLUS_PLUS) {
+      return TokenType.PLUS.lexeme;
+    } else if (expression.operator.type == TokenType.MINUS_MINUS) {
+      return TokenType.MINUS.lexeme;
+    } else {
+      throw new UnsupportedError(
+          'Unsupported postfix operator ${expression.operator.lexeme}');
+    }
+  }
 
   /**
    * Return the name of the method invoked by the given postfix [expression].
@@ -1877,13 +1888,8 @@
   @override
   int get offset => targetIdentifier.offset;
 
-  @Deprecated('In the next major release, type will change to `Precedence`.  '
-      'Switch to `precedence2` to prepare for this change.')
   @override
-  int get precedence => SELECTOR_PRECEDENCE;
-
-  @override
-  Precedence get precedence2 => Precedence.primary;
+  Precedence get precedence => Precedence.primary;
 
   @deprecated
   @override
diff --git a/analyzer/lib/src/generated/engine.dart b/analyzer/lib/src/generated/engine.dart
index 55671cc..8f4c1b3 100644
--- a/analyzer/lib/src/generated/engine.dart
+++ b/analyzer/lib/src/generated/engine.dart
@@ -6,6 +6,7 @@
 import 'dart:collection';
 import 'dart:typed_data';
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -28,7 +29,6 @@
 import 'package:analyzer/src/plugin/resolver_provider.dart';
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/summary/api_signature.dart';
-import 'package:analyzer/src/task/api/dart.dart';
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:analyzer/src/task/manager.dart';
 import 'package:front_end/src/fasta/scanner/token.dart';
@@ -39,605 +39,473 @@
 export 'package:analyzer/src/generated/timestamped_data.dart'
     show TimestampedData;
 
-/**
- * Used by [AnalysisOptions] to allow function bodies to be analyzed in some
- * sources but not others.
- */
+/// Used by [AnalysisOptions] to allow function bodies to be analyzed in some
+/// sources but not others.
 typedef bool AnalyzeFunctionBodiesPredicate(Source source);
 
-/**
- * A context in which a single analysis can be performed and incrementally
- * maintained. The context includes such information as the version of the SDK
- * being analyzed against as well as the package-root used to resolve 'package:'
- * URI's. (Both of which are known indirectly through the [SourceFactory].)
- *
- * An analysis context also represents the state of the analysis, which includes
- * knowing which sources have been included in the analysis (either directly or
- * indirectly) and the results of the analysis. Sources must be added and
- * removed from the context using the method [applyChanges], which is also used
- * to notify the context when sources have been modified and, consequently,
- * previously known results might have been invalidated.
- *
- * There are two ways to access the results of the analysis. The most common is
- * to use one of the 'get' methods to access the results. The 'get' methods have
- * the advantage that they will always return quickly, but have the disadvantage
- * that if the results are not currently available they will return either
- * nothing or in some cases an incomplete result. The second way to access
- * results is by using one of the 'compute' methods. The 'compute' methods will
- * always attempt to compute the requested results but might block the caller
- * for a significant period of time.
- *
- * When results have been invalidated, have never been computed (as is the case
- * for newly added sources), or have been removed from the cache, they are
- * <b>not</b> automatically recreated. They will only be recreated if one of the
- * 'compute' methods is invoked.
- *
- * However, this is not always acceptable. Some clients need to keep the
- * analysis results up-to-date. For such clients there is a mechanism that
- * allows them to incrementally perform needed analysis and get notified of the
- * consequent changes to the analysis results. This mechanism is realized by the
- * method [performAnalysisTask].
- *
- * Analysis engine allows for having more than one context. This can be used,
- * for example, to perform one analysis based on the state of files on disk and
- * a separate analysis based on the state of those files in open editors. It can
- * also be used to perform an analysis based on a proposed future state, such as
- * the state after a refactoring.
- */
+/// A context in which a single analysis can be performed and incrementally
+/// maintained. The context includes such information as the version of the SDK
+/// being analyzed against as well as the package-root used to resolve 'package:'
+/// URI's. (Both of which are known indirectly through the [SourceFactory].)
+///
+/// An analysis context also represents the state of the analysis, which includes
+/// knowing which sources have been included in the analysis (either directly or
+/// indirectly) and the results of the analysis. Sources must be added and
+/// removed from the context using the method [applyChanges], which is also used
+/// to notify the context when sources have been modified and, consequently,
+/// previously known results might have been invalidated.
+///
+/// There are two ways to access the results of the analysis. The most common is
+/// to use one of the 'get' methods to access the results. The 'get' methods have
+/// the advantage that they will always return quickly, but have the disadvantage
+/// that if the results are not currently available they will return either
+/// nothing or in some cases an incomplete result. The second way to access
+/// results is by using one of the 'compute' methods. The 'compute' methods will
+/// always attempt to compute the requested results but might block the caller
+/// for a significant period of time.
+///
+/// When results have been invalidated, have never been computed (as is the case
+/// for newly added sources), or have been removed from the cache, they are
+/// <b>not</b> automatically recreated. They will only be recreated if one of the
+/// 'compute' methods is invoked.
+///
+/// However, this is not always acceptable. Some clients need to keep the
+/// analysis results up-to-date. For such clients there is a mechanism that
+/// allows them to incrementally perform needed analysis and get notified of the
+/// consequent changes to the analysis results. This mechanism is realized by the
+/// method [performAnalysisTask].
+///
+/// Analysis engine allows for having more than one context. This can be used,
+/// for example, to perform one analysis based on the state of files on disk and
+/// a separate analysis based on the state of those files in open editors. It can
+/// also be used to perform an analysis based on a proposed future state, such as
+/// the state after a refactoring.
 abstract class AnalysisContext {
-  /**
-   * The file resolver provider used to override the way file URI's are
-   * resolved in some contexts.
-   */
+  /// The file resolver provider used to override the way file URI's are
+  /// resolved in some contexts.
   ResolverProvider fileResolverProvider;
 
-  /**
-   * Return the set of analysis options controlling the behavior of this
-   * context. Clients should not modify the returned set of options.
-   */
+  /// Return the set of analysis options controlling the behavior of this
+  /// context. Clients should not modify the returned set of options.
   AnalysisOptions get analysisOptions;
 
-  /**
-   * Set the set of analysis options controlling the behavior of this context to
-   * the given [options]. Clients can safely assume that all necessary analysis
-   * results have been invalidated.
-   */
+  /// Set the set of analysis options controlling the behavior of this context to
+  /// the given [options]. Clients can safely assume that all necessary analysis
+  /// results have been invalidated.
   void set analysisOptions(AnalysisOptions options);
 
-  /**
-   * Set the order in which sources will be analyzed by [performAnalysisTask] to
-   * match the order of the sources in the given list of [sources]. If a source
-   * that needs to be analyzed is not contained in the list, then it will be
-   * treated as if it were at the end of the list. If the list is empty (or
-   * `null`) then no sources will be given priority over other sources.
-   *
-   * Changes made to the list after this method returns will <b>not</b> be
-   * reflected in the priority order.
-   */
+  /// Set the order in which sources will be analyzed by [performAnalysisTask] to
+  /// match the order of the sources in the given list of [sources]. If a source
+  /// that needs to be analyzed is not contained in the list, then it will be
+  /// treated as if it were at the end of the list. If the list is empty (or
+  /// `null`) then no sources will be given priority over other sources.
+  ///
+  /// Changes made to the list after this method returns will <b>not</b> be
+  /// reflected in the priority order.
   void set analysisPriorityOrder(List<Source> sources);
 
-  /**
-   * Return the set of declared variables used when computing constant values.
-   */
+  /// Return the set of declared variables used when computing constant values.
   DeclaredVariables get declaredVariables;
 
-  /**
-   * Return a list containing all of the sources known to this context that
-   * represent HTML files. The contents of the list can be incomplete.
-   */
+  /// Return a list containing all of the sources known to this context that
+  /// represent HTML files. The contents of the list can be incomplete.
   List<Source> get htmlSources;
 
-  /**
-   * The stream that is notified when a source either starts or stops being
-   * analyzed implicitly.
-   */
+  /// The stream that is notified when a source either starts or stops being
+  /// analyzed implicitly.
   Stream<ImplicitAnalysisEvent> get implicitAnalysisEvents;
 
-  /**
-   * Returns `true` if this context was disposed using [dispose].
-   */
+  /// Returns `true` if this context was disposed using [dispose].
   bool get isDisposed;
 
-  /**
-   * Return a list containing all of the sources known to this context that
-   * represent the defining compilation unit of a library that can be run within
-   * a browser. The sources that are returned represent libraries that have a
-   * 'main' method and are either referenced by an HTML file or import, directly
-   * or indirectly, a client-only library. The contents of the list can be
-   * incomplete.
-   */
+  /// Return a list containing all of the sources known to this context that
+  /// represent the defining compilation unit of a library that can be run within
+  /// a browser. The sources that are returned represent libraries that have a
+  /// 'main' method and are either referenced by an HTML file or import, directly
+  /// or indirectly, a client-only library. The contents of the list can be
+  /// incomplete.
   List<Source> get launchableClientLibrarySources;
 
-  /**
-   * Return a list containing all of the sources known to this context that
-   * represent the defining compilation unit of a library that can be run
-   * outside of a browser. The contents of the list can be incomplete.
-   */
+  /// Return a list containing all of the sources known to this context that
+  /// represent the defining compilation unit of a library that can be run
+  /// outside of a browser. The contents of the list can be incomplete.
   List<Source> get launchableServerLibrarySources;
 
-  /**
-   * Return a list containing all of the sources known to this context that
-   * represent the defining compilation unit of a library. The contents of the
-   * list can be incomplete.
-   */
+  /// Return a list containing all of the sources known to this context that
+  /// represent the defining compilation unit of a library. The contents of the
+  /// list can be incomplete.
   List<Source> get librarySources;
 
-  /**
-   * Return a client-provided name used to identify this context, or `null` if
-   * the client has not provided a name.
-   */
+  /// Return a client-provided name used to identify this context, or `null` if
+  /// the client has not provided a name.
   String get name;
 
-  /**
-   * Set the client-provided name used to identify this context to the given
-   * [name].
-   */
+  /// Set the client-provided name used to identify this context to the given
+  /// [name].
   set name(String name);
 
-  /**
-   * The stream that is notified when sources have been added or removed,
-   * or the source's content has changed.
-   */
+  /// The stream that is notified when sources have been added or removed,
+  /// or the source's content has changed.
   Stream<SourcesChangedEvent> get onSourcesChanged;
 
-  /**
-   * Return the source factory used to create the sources that can be analyzed
-   * in this context.
-   */
+  /// Return the source factory used to create the sources that can be analyzed
+  /// in this context.
   SourceFactory get sourceFactory;
 
-  /**
-   * Set the source factory used to create the sources that can be analyzed in
-   * this context to the given source [factory]. Clients can safely assume that
-   * all analysis results have been invalidated.
-   */
+  /// Set the source factory used to create the sources that can be analyzed in
+  /// this context to the given source [factory]. Clients can safely assume that
+  /// all analysis results have been invalidated.
   void set sourceFactory(SourceFactory factory);
 
-  /**
-   * Return a list containing all of the sources known to this context.
-   */
+  /// Return a list containing all of the sources known to this context.
   List<Source> get sources;
 
-  /**
-   * Return a type provider for this context or throw [AnalysisException] if
-   * either `dart:core` or `dart:async` cannot be resolved.
-   */
+  /// Return a type provider for this context or throw [AnalysisException] if
+  /// either `dart:core` or `dart:async` cannot be resolved.
   TypeProvider get typeProvider;
 
-  /**
-   * Return a type system for this context.
-   */
+  /// Return a type system for this context.
   TypeSystem get typeSystem;
 
-  /**
-   * Add the given [listener] to the list of objects that are to be notified
-   * when various analysis results are produced in this context.
-   */
+  /// Add the given [listener] to the list of objects that are to be notified
+  /// when various analysis results are produced in this context.
   void addListener(AnalysisListener listener);
 
-  /**
-   * Apply the given [delta] to change the level of analysis that will be
-   * performed for the sources known to this context.
-   */
+  /// Apply the given [delta] to change the level of analysis that will be
+  /// performed for the sources known to this context.
   void applyAnalysisDelta(AnalysisDelta delta);
 
-  /**
-   * Apply the changes specified by the given [changeSet] to this context. Any
-   * analysis results that have been invalidated by these changes will be
-   * removed.
-   */
+  /// Apply the changes specified by the given [changeSet] to this context. Any
+  /// analysis results that have been invalidated by these changes will be
+  /// removed.
   void applyChanges(ChangeSet changeSet);
 
-  /**
-   * Return the documentation comment for the given [element] as it appears in
-   * the original source (complete with the beginning and ending delimiters) for
-   * block documentation comments, or lines starting with `"///"` and separated
-   * with `"\n"` characters for end-of-line documentation comments, or `null` if
-   * the element does not have a documentation comment associated with it. This
-   * can be a long-running operation if the information needed to access the
-   * comment is not cached.
-   *
-   * Throws an [AnalysisException] if the documentation comment could not be
-   * determined because the analysis could not be performed.
-   *
-   * <b>Note:</b> This method cannot be used in an async environment.
-   */
+  /// Return the documentation comment for the given [element] as it appears in
+  /// the original source (complete with the beginning and ending delimiters) for
+  /// block documentation comments, or lines starting with `"///"` and separated
+  /// with `"\n"` characters for end-of-line documentation comments, or `null` if
+  /// the element does not have a documentation comment associated with it. This
+  /// can be a long-running operation if the information needed to access the
+  /// comment is not cached.
+  ///
+  /// Throws an [AnalysisException] if the documentation comment could not be
+  /// determined because the analysis could not be performed.
+  ///
+  /// <b>Note:</b> This method cannot be used in an async environment.
   String computeDocumentationComment(Element element);
 
-  /**
-   * Return a list containing all of the errors associated with the given
-   * [source]. If the errors are not already known then the source will be
-   * analyzed in order to determine the errors associated with it.
-   *
-   * Throws an [AnalysisException] if the errors could not be determined because
-   * the analysis could not be performed.
-   *
-   * <b>Note:</b> This method cannot be used in an async environment.
-   *
-   * See [getErrors].
-   */
+  /// Return a list containing all of the errors associated with the given
+  /// [source]. If the errors are not already known then the source will be
+  /// analyzed in order to determine the errors associated with it.
+  ///
+  /// Throws an [AnalysisException] if the errors could not be determined because
+  /// the analysis could not be performed.
+  ///
+  /// <b>Note:</b> This method cannot be used in an async environment.
+  ///
+  /// See [getErrors].
   List<AnalysisError> computeErrors(Source source);
 
-  /**
-   * Return the kind of the given [source], computing it's kind if it is not
-   * already known. Return [SourceKind.UNKNOWN] if the source is not contained
-   * in this context.
-   *
-   * <b>Note:</b> This method cannot be used in an async environment.
-   *
-   * See [getKindOf].
-   */
+  /// Return the kind of the given [source], computing it's kind if it is not
+  /// already known. Return [SourceKind.UNKNOWN] if the source is not contained
+  /// in this context.
+  ///
+  /// <b>Note:</b> This method cannot be used in an async environment.
+  ///
+  /// See [getKindOf].
   SourceKind computeKindOf(Source source);
 
-  /**
-   * Return the element model corresponding to the library defined by the given
-   * [source]. If the element model does not yet exist it will be created. The
-   * process of creating an element model for a library can long-running,
-   * depending on the size of the library and the number of libraries that are
-   * imported into it that also need to have a model built for them.
-   *
-   * Throws an [AnalysisException] if the element model could not be determined
-   * because the analysis could not be performed.
-   *
-   * <b>Note:</b> This method cannot be used in an async environment.
-   *
-   * See [getLibraryElement].
-   */
+  /// Return the element model corresponding to the library defined by the given
+  /// [source]. If the element model does not yet exist it will be created. The
+  /// process of creating an element model for a library can long-running,
+  /// depending on the size of the library and the number of libraries that are
+  /// imported into it that also need to have a model built for them.
+  ///
+  /// Throws an [AnalysisException] if the element model could not be determined
+  /// because the analysis could not be performed.
+  ///
+  /// <b>Note:</b> This method cannot be used in an async environment.
+  ///
+  /// See [getLibraryElement].
   LibraryElement computeLibraryElement(Source source);
 
-  /**
-   * Return the line information for the given [source], or `null` if the source
-   * is not of a recognized kind (neither a Dart nor HTML file). If the line
-   * information was not previously known it will be created. The line
-   * information is used to map offsets from the beginning of the source to line
-   * and column pairs.
-   *
-   * Throws an [AnalysisException] if the line information could not be
-   * determined because the analysis could not be performed.
-   *
-   * <b>Note:</b> This method cannot be used in an async environment.
-   *
-   * See [getLineInfo].
-   */
+  /// Return the line information for the given [source], or `null` if the source
+  /// is not of a recognized kind (neither a Dart nor HTML file). If the line
+  /// information was not previously known it will be created. The line
+  /// information is used to map offsets from the beginning of the source to line
+  /// and column pairs.
+  ///
+  /// Throws an [AnalysisException] if the line information could not be
+  /// determined because the analysis could not be performed.
+  ///
+  /// <b>Note:</b> This method cannot be used in an async environment.
+  ///
+  /// See [getLineInfo].
   LineInfo computeLineInfo(Source source);
 
-  /**
-   * Return a future which will be completed with the fully resolved AST for a
-   * single compilation unit within the given library, once that AST is up to
-   * date.
-   *
-   * If the resolved AST can't be computed for some reason, the future will be
-   * completed with an error.  One possible error is AnalysisNotScheduledError,
-   * which means that the resolved AST can't be computed because the given
-   * source file is not scheduled to be analyzed within the context of the
-   * given library.
-   */
+  /// Return a future which will be completed with the fully resolved AST for a
+  /// single compilation unit within the given library, once that AST is up to
+  /// date.
+  ///
+  /// If the resolved AST can't be computed for some reason, the future will be
+  /// completed with an error.  One possible error is AnalysisNotScheduledError,
+  /// which means that the resolved AST can't be computed because the given
+  /// source file is not scheduled to be analyzed within the context of the
+  /// given library.
   CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync(
       Source source, Source librarySource);
 
-  /**
-   * Perform work until the given [result] has been computed for the given
-   * [target]. Return the computed value.
-   */
+  /// Perform work until the given [result] has been computed for the given
+  /// [target]. Return the computed value.
   V computeResult<V>(AnalysisTarget target, ResultDescriptor<V> result);
 
-  /**
-   * Notifies the context that the client is going to stop using this context.
-   */
+  /// Notifies the context that the client is going to stop using this context.
   void dispose();
 
-  /**
-   * Return `true` if the given [source] exists.
-   *
-   * This method should be used rather than the method [Source.exists] because
-   * contexts can have local overrides of the content of a source that the
-   * source is not aware of and a source with local content is considered to
-   * exist even if there is no file on disk.
-   */
+  /// Return `true` if the given [source] exists.
+  ///
+  /// This method should be used rather than the method [Source.exists] because
+  /// contexts can have local overrides of the content of a source that the
+  /// source is not aware of and a source with local content is considered to
+  /// exist even if there is no file on disk.
   bool exists(Source source);
 
-  /**
-   * Return the element model corresponding to the compilation unit defined by
-   * the given [unitSource] in the library defined by the given [librarySource],
-   * or `null` if the element model does not currently exist or if the library
-   * cannot be analyzed for some reason.
-   */
+  /// Return the element model corresponding to the compilation unit defined by
+  /// the given [unitSource] in the library defined by the given [librarySource],
+  /// or `null` if the element model does not currently exist or if the library
+  /// cannot be analyzed for some reason.
   CompilationUnitElement getCompilationUnitElement(
       Source unitSource, Source librarySource);
 
-  /**
-   * Return configuration data associated with the given key or the [key]'s
-   * default value if no state has been associated.
-   *
-   * See [setConfigurationData].
-   */
+  /// Return configuration data associated with the given key or the [key]'s
+  /// default value if no state has been associated.
+  ///
+  /// See [setConfigurationData].
   @deprecated
   V getConfigurationData<V>(ResultDescriptor<V> key);
 
-  /**
-   * Return the contents and timestamp of the given [source].
-   *
-   * This method should be used rather than the method [Source.getContents]
-   * because contexts can have local overrides of the content of a source that
-   * the source is not aware of.
-   */
+  /// Return the contents and timestamp of the given [source].
+  ///
+  /// This method should be used rather than the method [Source.getContents]
+  /// because contexts can have local overrides of the content of a source that
+  /// the source is not aware of.
   TimestampedData<String> getContents(Source source);
 
-  /**
-   * Return the element referenced by the given [location], or `null` if the
-   * element is not immediately available or if there is no element with the
-   * given location. The latter condition can occur, for example, if the
-   * location describes an element from a different context or if the element
-   * has been removed from this context as a result of some change since it was
-   * originally obtained.
-   */
+  /// Return the element referenced by the given [location], or `null` if the
+  /// element is not immediately available or if there is no element with the
+  /// given location. The latter condition can occur, for example, if the
+  /// location describes an element from a different context or if the element
+  /// has been removed from this context as a result of some change since it was
+  /// originally obtained.
   Element getElement(ElementLocation location);
 
-  /**
-   * Return an analysis error info containing the list of all of the errors and
-   * the line info associated with the given [source]. The list of errors will
-   * be empty if the source is not known to this context or if there are no
-   * errors in the source. The errors contained in the list can be incomplete.
-   *
-   * See [computeErrors].
-   */
+  /// Return an analysis error info containing the list of all of the errors and
+  /// the line info associated with the given [source]. The list of errors will
+  /// be empty if the source is not known to this context or if there are no
+  /// errors in the source. The errors contained in the list can be incomplete.
+  ///
+  /// See [computeErrors].
   AnalysisErrorInfo getErrors(Source source);
 
-  /**
-   * Return the sources for the HTML files that reference the compilation unit
-   * with the given [source]. If the source does not represent a Dart source or
-   * is not known to this context, the returned list will be empty. The contents
-   * of the list can be incomplete.
-   */
+  /// Return the sources for the HTML files that reference the compilation unit
+  /// with the given [source]. If the source does not represent a Dart source or
+  /// is not known to this context, the returned list will be empty. The contents
+  /// of the list can be incomplete.
   List<Source> getHtmlFilesReferencing(Source source);
 
-  /**
-   * Return the kind of the given [source], or `null` if the kind is not known
-   * to this context.
-   *
-   * See [computeKindOf].
-   */
+  /// Return the kind of the given [source], or `null` if the kind is not known
+  /// to this context.
+  ///
+  /// See [computeKindOf].
   SourceKind getKindOf(Source source);
 
-  /**
-   * Return the sources for the defining compilation units of any libraries of
-   * which the given [source] is a part. The list will normally contain a single
-   * library because most Dart sources are only included in a single library,
-   * but it is possible to have a part that is contained in multiple identically
-   * named libraries. If the source represents the defining compilation unit of
-   * a library, then the returned list will contain the given source as its only
-   * element. If the source does not represent a Dart source or is not known to
-   * this context, the returned list will be empty. The contents of the list can
-   * be incomplete.
-   */
+  /// Return the sources for the defining compilation units of any libraries of
+  /// which the given [source] is a part. The list will normally contain a single
+  /// library because most Dart sources are only included in a single library,
+  /// but it is possible to have a part that is contained in multiple identically
+  /// named libraries. If the source represents the defining compilation unit of
+  /// a library, then the returned list will contain the given source as its only
+  /// element. If the source does not represent a Dart source or is not known to
+  /// this context, the returned list will be empty. The contents of the list can
+  /// be incomplete.
   List<Source> getLibrariesContaining(Source source);
 
-  /**
-   * Return the sources for the defining compilation units of any libraries that
-   * depend on the library defined by the given [librarySource]. One library
-   * depends on another if it either imports or exports that library.
-   */
+  /// Return the sources for the defining compilation units of any libraries that
+  /// depend on the library defined by the given [librarySource]. One library
+  /// depends on another if it either imports or exports that library.
   List<Source> getLibrariesDependingOn(Source librarySource);
 
-  /**
-   * Return the sources for the defining compilation units of any libraries that
-   * are referenced from the HTML file defined by the given [htmlSource].
-   */
+  /// Return the sources for the defining compilation units of any libraries that
+  /// are referenced from the HTML file defined by the given [htmlSource].
   List<Source> getLibrariesReferencedFromHtml(Source htmlSource);
 
-  /**
-   * Return the element model corresponding to the library defined by the given
-   * [source], or `null` if the element model does not currently exist or if the
-   * library cannot be analyzed for some reason.
-   */
+  /// Return the element model corresponding to the library defined by the given
+  /// [source], or `null` if the element model does not currently exist or if the
+  /// library cannot be analyzed for some reason.
   LibraryElement getLibraryElement(Source source);
 
-  /**
-   * Return the line information for the given [source], or `null` if the line
-   * information is not known. The line information is used to map offsets from
-   * the beginning of the source to line and column pairs.
-   *
-   * See [computeLineInfo].
-   */
+  /// Return the line information for the given [source], or `null` if the line
+  /// information is not known. The line information is used to map offsets from
+  /// the beginning of the source to line and column pairs.
+  ///
+  /// See [computeLineInfo].
   LineInfo getLineInfo(Source source);
 
-  /**
-   * Return the modification stamp for the [source], or a negative value if the
-   * source does not exist. A modification stamp is a non-negative integer with
-   * the property that if the contents of the source have not been modified
-   * since the last time the modification stamp was accessed then the same value
-   * will be returned, but if the contents of the source have been modified one
-   * or more times (even if the net change is zero) the stamps will be different.
-   *
-   * This method should be used rather than the method
-   * [Source.getModificationStamp] because contexts can have local overrides of
-   * the content of a source that the source is not aware of.
-   */
+  /// Return the modification stamp for the [source], or a negative value if the
+  /// source does not exist. A modification stamp is a non-negative integer with
+  /// the property that if the contents of the source have not been modified
+  /// since the last time the modification stamp was accessed then the same value
+  /// will be returned, but if the contents of the source have been modified one
+  /// or more times (even if the net change is zero) the stamps will be different.
+  ///
+  /// This method should be used rather than the method
+  /// [Source.getModificationStamp] because contexts can have local overrides of
+  /// the content of a source that the source is not aware of.
   int getModificationStamp(Source source);
 
-  /**
-   * Return a fully resolved AST for the compilation unit defined by the given
-   * [unitSource] within the given [library], or `null` if the resolved AST is
-   * not already computed.
-   *
-   * See [resolveCompilationUnit].
-   */
+  /// Return a fully resolved AST for the compilation unit defined by the given
+  /// [unitSource] within the given [library], or `null` if the resolved AST is
+  /// not already computed.
+  ///
+  /// See [resolveCompilationUnit].
   CompilationUnit getResolvedCompilationUnit(
       Source unitSource, LibraryElement library);
 
-  /**
-   * Return a fully resolved AST for the compilation unit defined by the given
-   * [unitSource] within the library defined by the given [librarySource], or
-   * `null` if the resolved AST is not already computed.
-   *
-   * See [resolveCompilationUnit2].
-   */
+  /// Return a fully resolved AST for the compilation unit defined by the given
+  /// [unitSource] within the library defined by the given [librarySource], or
+  /// `null` if the resolved AST is not already computed.
+  ///
+  /// See [resolveCompilationUnit2].
   CompilationUnit getResolvedCompilationUnit2(
       Source unitSource, Source librarySource);
 
-  /**
-   * Return the value of the given [result] for the given [target].
-   *
-   * If the corresponding [target] does not exist, or the [result] is not
-   * computed yet, then the default value is returned.
-   */
+  /// Return the value of the given [result] for the given [target].
+  ///
+  /// If the corresponding [target] does not exist, or the [result] is not
+  /// computed yet, then the default value is returned.
   V getResult<V>(AnalysisTarget target, ResultDescriptor<V> result);
 
-  /**
-   * Return a list of the sources being analyzed in this context whose full path
-   * is equal to the given [path].
-   */
+  /// Return a list of the sources being analyzed in this context whose full path
+  /// is equal to the given [path].
   List<Source> getSourcesWithFullName(String path);
 
-  /**
-   * Invalidates hints in the given [librarySource] and included parts.
-   */
+  /// Invalidates hints in the given [librarySource] and included parts.
   void invalidateLibraryHints(Source librarySource);
 
-  /**
-   * Return `true` if the given [librarySource] is known to be the defining
-   * compilation unit of a library that can be run on a client (references
-   * 'dart:html', either directly or indirectly).
-   *
-   * <b>Note:</b> In addition to the expected case of returning `false` if the
-   * source is known to be a library that cannot be run on a client, this method
-   * will also return `false` if the source is not known to be a library or if
-   * we do not know whether it can be run on a client.
-   */
+  /// Return `true` if the given [librarySource] is known to be the defining
+  /// compilation unit of a library that can be run on a client (references
+  /// 'dart:html', either directly or indirectly).
+  ///
+  /// <b>Note:</b> In addition to the expected case of returning `false` if the
+  /// source is known to be a library that cannot be run on a client, this method
+  /// will also return `false` if the source is not known to be a library or if
+  /// we do not know whether it can be run on a client.
   bool isClientLibrary(Source librarySource);
 
-  /**
-   * Return `true` if the given [librarySource] is known to be the defining
-   * compilation unit of a library that can be run on the server (does not
-   * reference 'dart:html', either directly or indirectly).
-   *
-   * <b>Note:</b> In addition to the expected case of returning `false` if the
-   * source is known to be a library that cannot be run on the server, this
-   * method will also return `false` if the source is not known to be a library
-   * or if we do not know whether it can be run on the server.
-   */
+  /// Return `true` if the given [librarySource] is known to be the defining
+  /// compilation unit of a library that can be run on the server (does not
+  /// reference 'dart:html', either directly or indirectly).
+  ///
+  /// <b>Note:</b> In addition to the expected case of returning `false` if the
+  /// source is known to be a library that cannot be run on the server, this
+  /// method will also return `false` if the source is not known to be a library
+  /// or if we do not know whether it can be run on the server.
   bool isServerLibrary(Source librarySource);
 
-  /**
-   * Return the stream that is notified when a result with the given
-   * [descriptor] is changed, e.g. computed or invalidated.
-   */
+  /// Return the stream that is notified when a result with the given
+  /// [descriptor] is changed, e.g. computed or invalidated.
   Stream<ResultChangedEvent> onResultChanged(ResultDescriptor descriptor);
 
-  /**
-   * Return the stream that is notified when a new value for the given
-   * [descriptor] is computed.
-   */
+  /// Return the stream that is notified when a new value for the given
+  /// [descriptor] is computed.
   @deprecated
   Stream<ComputedResult> onResultComputed(ResultDescriptor descriptor);
 
-  /**
-   * Parse the content of the given [source] to produce an AST structure. The
-   * resulting AST structure may or may not be resolved, and may have a slightly
-   * different structure depending upon whether it is resolved.
-   *
-   * Throws an [AnalysisException] if the analysis could not be performed
-   *
-   * <b>Note:</b> This method cannot be used in an async environment.
-   */
+  /// Parse the content of the given [source] to produce an AST structure. The
+  /// resulting AST structure may or may not be resolved, and may have a slightly
+  /// different structure depending upon whether it is resolved.
+  ///
+  /// Throws an [AnalysisException] if the analysis could not be performed
+  ///
+  /// <b>Note:</b> This method cannot be used in an async environment.
   CompilationUnit parseCompilationUnit(Source source);
 
-  /**
-   * Perform the next unit of work required to keep the analysis results
-   * up-to-date and return information about the consequent changes to the
-   * analysis results. This method can be long running.
-   *
-   * The implementation that uses the task model notifies subscribers of
-   * [onResultChanged] about computed results.
-   *
-   * The following results are computed for Dart sources.
-   *
-   * 1. For explicit and implicit sources:
-   *    [PARSED_UNIT]
-   *    [RESOLVED_UNIT]
-   *
-   * 2. For explicit sources:
-   *    [DART_ERRORS].
-   *
-   * 3. For explicit and implicit library sources:
-   *    [LIBRARY_ELEMENT].
-   */
+  /// Perform the next unit of work required to keep the analysis results
+  /// up-to-date and return information about the consequent changes to the
+  /// analysis results. This method can be long running.
+  ///
+  /// The implementation that uses the task model notifies subscribers of
+  /// [onResultChanged] about computed results.
+  ///
+  /// The following results are computed for Dart sources.
+  ///
+  /// 1. For explicit and implicit sources:
+  ///    [PARSED_UNIT]
+  ///    [RESOLVED_UNIT]
+  ///
+  /// 2. For explicit sources:
+  ///    [DART_ERRORS].
+  ///
+  /// 3. For explicit and implicit library sources:
+  ///    [LIBRARY_ELEMENT].
   AnalysisResult performAnalysisTask();
 
-  /**
-   * Remove the given [listener] from the list of objects that are to be
-   * notified when various analysis results are produced in this context.
-   */
+  /// Remove the given [listener] from the list of objects that are to be
+  /// notified when various analysis results are produced in this context.
   void removeListener(AnalysisListener listener);
 
-  /**
-   * Return a fully resolved AST for the compilation unit defined by the given
-   * [unitSource] within the given [library].
-   *
-   * Throws an [AnalysisException] if the analysis could not be performed.
-   *
-   * <b>Note:</b> This method cannot be used in an async environment.
-   *
-   * See [getResolvedCompilationUnit].
-   */
+  /// Return a fully resolved AST for the compilation unit defined by the given
+  /// [unitSource] within the given [library].
+  ///
+  /// Throws an [AnalysisException] if the analysis could not be performed.
+  ///
+  /// <b>Note:</b> This method cannot be used in an async environment.
+  ///
+  /// See [getResolvedCompilationUnit].
   CompilationUnit resolveCompilationUnit(
       Source unitSource, LibraryElement library);
 
-  /**
-   * Return a fully resolved AST for the compilation unit defined by the given
-   * [unitSource] within the library defined by the given [librarySource].
-   *
-   * Throws an [AnalysisException] if the analysis could not be performed.
-   *
-   * <b>Note:</b> This method cannot be used in an async environment.
-   *
-   * See [getResolvedCompilationUnit2].
-   */
+  /// Return a fully resolved AST for the compilation unit defined by the given
+  /// [unitSource] within the library defined by the given [librarySource].
+  ///
+  /// Throws an [AnalysisException] if the analysis could not be performed.
+  ///
+  /// <b>Note:</b> This method cannot be used in an async environment.
+  ///
+  /// See [getResolvedCompilationUnit2].
   CompilationUnit resolveCompilationUnit2(
       Source unitSource, Source librarySource);
 
-  /**
-   * Set the contents of the given [source] to the given [contents] and mark the
-   * source as having changed. The additional [offset] and [length] information
-   * is used by the context to determine what reanalysis is necessary.
-   */
+  /// Set the contents of the given [source] to the given [contents] and mark the
+  /// source as having changed. The additional [offset] and [length] information
+  /// is used by the context to determine what reanalysis is necessary.
   void setChangedContents(
       Source source, String contents, int offset, int oldLength, int newLength);
 
-  /**
-   * Associate this configuration [data] object with the given descriptor [key].
-   *
-   * See [getConfigurationData].
-   */
+  /// Associate this configuration [data] object with the given descriptor [key].
+  ///
+  /// See [getConfigurationData].
   @deprecated
   void setConfigurationData(ResultDescriptor key, Object data);
 
-  /**
-   * Set the contents of the given [source] to the given [contents] and mark the
-   * source as having changed. This has the effect of overriding the default
-   * contents of the source. If the contents are `null` the override is removed
-   * so that the default contents will be returned.
-   */
+  /// Set the contents of the given [source] to the given [contents] and mark the
+  /// source as having changed. This has the effect of overriding the default
+  /// contents of the source. If the contents are `null` the override is removed
+  /// so that the default contents will be returned.
   void setContents(Source source, String contents);
 }
 
-/**
- * A representation of changes to the types of analysis that should be
- * performed.
- */
+/// A representation of changes to the types of analysis that should be
+/// performed.
 class AnalysisDelta {
-  /**
-   * A mapping from source to what type of analysis should be performed on that
-   * source.
-   */
+  /// A mapping from source to what type of analysis should be performed on that
+  /// source.
   Map<Source, AnalysisLevel> _analysisMap =
       new HashMap<Source, AnalysisLevel>();
 
-  /**
-   * Return a collection of the sources that have been added. This is equivalent
-   * to calling [getAnalysisLevels] and collecting all sources that do not have
-   * an analysis level of [AnalysisLevel.NONE].
-   */
+  /// Return a collection of the sources that have been added. This is equivalent
+  /// to calling [getAnalysisLevels] and collecting all sources that do not have
+  /// an analysis level of [AnalysisLevel.NONE].
   List<Source> get addedSources {
     List<Source> result = new List<Source>();
     _analysisMap.forEach((Source source, AnalysisLevel level) {
@@ -648,15 +516,11 @@
     return result;
   }
 
-  /**
-   * Return a mapping of sources to the level of analysis that should be
-   * performed.
-   */
+  /// Return a mapping of sources to the level of analysis that should be
+  /// performed.
   Map<Source, AnalysisLevel> get analysisLevels => _analysisMap;
 
-  /**
-   * Record that the given [source] should be analyzed at the given [level].
-   */
+  /// Record that the given [source] should be analyzed at the given [level].
   void setAnalysisLevel(Source source, AnalysisLevel level) {
     _analysisMap[source] = level;
   }
@@ -671,10 +535,8 @@
     return buffer.toString();
   }
 
-  /**
-   * Append to the given [buffer] all sources with the given analysis [level],
-   * prefixed with a label and a separator if [needsSeparator] is `true`.
-   */
+  /// Append to the given [buffer] all sources with the given analysis [level],
+  /// prefixed with a label and a separator if [needsSeparator] is `true`.
   bool _appendSources(
       StringBuffer buffer, bool needsSeparator, AnalysisLevel level) {
     bool first = true;
@@ -697,80 +559,55 @@
   }
 }
 
-/**
- * The entry point for the functionality provided by the analysis engine. There
- * is a single instance of this class.
- */
+/// The entry point for the functionality provided by the analysis engine. There
+/// is a single instance of this class.
 class AnalysisEngine {
-  /**
-   * The suffix used for Dart source files.
-   */
+  /// The suffix used for Dart source files.
   static const String SUFFIX_DART = "dart";
 
-  /**
-   * The short suffix used for HTML files.
-   */
+  /// The short suffix used for HTML files.
   static const String SUFFIX_HTM = "htm";
 
-  /**
-   * The long suffix used for HTML files.
-   */
+  /// The long suffix used for HTML files.
   static const String SUFFIX_HTML = "html";
 
-  /**
-   * The deprecated file name used for analysis options files.
-   */
+  /// The deprecated file name used for analysis options files.
   static const String ANALYSIS_OPTIONS_FILE = '.analysis_options';
 
-  /**
-   * The file name used for analysis options files.
-   */
+  /// The file name used for analysis options files.
   static const String ANALYSIS_OPTIONS_YAML_FILE = 'analysis_options.yaml';
 
-  /**
-   * The file name used for pubspec files.
-   */
+  /// The file name used for pubspec files.
   static const String PUBSPEC_YAML_FILE = 'pubspec.yaml';
 
-  /**
-   * The unique instance of this class.
-   */
+  /// The file name used for Android manifest files.
+  static const String ANDROID_MANIFEST_FILE = 'AndroidManifest.xml';
+
+  /// The unique instance of this class.
   static final AnalysisEngine instance = new AnalysisEngine._();
 
-  /**
-   * The logger that should receive information about errors within the analysis
-   * engine.
-   */
+  /// The logger that should receive information about errors within the analysis
+  /// engine.
   Logger _logger = Logger.NULL;
 
-  /**
-   * The instrumentation service that is to be used by this analysis engine.
-   */
+  /// The instrumentation service that is to be used by this analysis engine.
   InstrumentationService _instrumentationService =
       InstrumentationService.NULL_SERVICE;
 
-  /**
-   * The partition manager being used to manage the shared partitions.
-   */
+  /// The partition manager being used to manage the shared partitions.
   final PartitionManager partitionManager = new PartitionManager();
 
-  /**
-   * The task manager used to manage the tasks used to analyze code.
-   */
+  /// The task manager used to manage the tasks used to analyze code.
   TaskManager _taskManager;
 
   AnalysisEngine._();
 
-  /**
-   * Return the instrumentation service that is to be used by this analysis
-   * engine.
-   */
+  /// Return the instrumentation service that is to be used by this analysis
+  /// engine.
   InstrumentationService get instrumentationService => _instrumentationService;
 
-  /**
-   * Set the instrumentation service that is to be used by this analysis engine
-   * to the given [service].
-   */
+  /// Set the instrumentation service that is to be used by this analysis engine
+  /// to the given [service].
   void set instrumentationService(InstrumentationService service) {
     if (service == null) {
       _instrumentationService = InstrumentationService.NULL_SERVICE;
@@ -779,23 +616,17 @@
     }
   }
 
-  /**
-   * Return the logger that should receive information about errors within the
-   * analysis engine.
-   */
+  /// Return the logger that should receive information about errors within the
+  /// analysis engine.
   Logger get logger => _logger;
 
-  /**
-   * Set the logger that should receive information about errors within the
-   * analysis engine to the given [logger].
-   */
+  /// Set the logger that should receive information about errors within the
+  /// analysis engine to the given [logger].
   void set logger(Logger logger) {
     this._logger = logger ?? Logger.NULL;
   }
 
-  /**
-   * Return the task manager used to manage the tasks used to analyze code.
-   */
+  /// Return the task manager used to manage the tasks used to analyze code.
   TaskManager get taskManager {
     if (_taskManager == null) {
       _taskManager = new TaskManager();
@@ -803,34 +634,26 @@
     return _taskManager;
   }
 
-  /**
-   * Clear any caches holding on to analysis results so that a full re-analysis
-   * will be performed the next time an analysis context is created.
-   */
+  /// Clear any caches holding on to analysis results so that a full re-analysis
+  /// will be performed the next time an analysis context is created.
   void clearCaches() {
     partitionManager.clearCache();
     // See https://github.com/dart-lang/sdk/issues/30314.
     StringToken.canonicalizer.clear();
   }
 
-  /**
-   * Create and return a new context in which analysis can be performed.
-   */
+  /// Create and return a new context in which analysis can be performed.
   AnalysisContext createAnalysisContext() {
     return new AnalysisContextImpl();
   }
 
-  /**
-   * A utility method that clients can use to process all of the required
-   * plugins. This method can only be used by clients that do not need to
-   * process any other plugins.
-   */
+  /// A utility method that clients can use to process all of the required
+  /// plugins. This method can only be used by clients that do not need to
+  /// process any other plugins.
   @deprecated
   void processRequiredPlugins() {}
 
-  /**
-   * Return `true` if the given [fileName] is an analysis options file.
-   */
+  /// Return `true` if the given [fileName] is an analysis options file.
   static bool isAnalysisOptionsFileName(String fileName,
       [pathos.Context context]) {
     if (fileName == null) {
@@ -841,10 +664,8 @@
         basename == ANALYSIS_OPTIONS_YAML_FILE;
   }
 
-  /**
-   * Return `true` if the given [fileName] is assumed to contain Dart source
-   * code.
-   */
+  /// Return `true` if the given [fileName] is assumed to contain Dart source
+  /// code.
   static bool isDartFileName(String fileName) {
     if (fileName == null) {
       return false;
@@ -852,85 +673,65 @@
     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);
+  }
 }
 
-/**
- * The analysis errors and line information for the errors.
- */
+/// The analysis errors and line information for the errors.
 abstract class AnalysisErrorInfo {
-  /**
-   * Return the errors that as a result of the analysis, or `null` if there were
-   * no errors.
-   */
+  /// Return the errors that as a result of the analysis, or `null` if there were
+  /// no errors.
   List<AnalysisError> get errors;
 
-  /**
-   * Return the line information associated with the errors, or `null` if there
-   * were no errors.
-   */
+  /// Return the line information associated with the errors, or `null` if there
+  /// were no errors.
   LineInfo get lineInfo;
 }
 
-/**
- * The analysis errors and line info associated with a source.
- */
+/// The analysis errors and line info associated with a source.
 class AnalysisErrorInfoImpl implements AnalysisErrorInfo {
-  /**
-   * The analysis errors associated with a source, or `null` if there are no
-   * errors.
-   */
+  /// The analysis errors associated with a source, or `null` if there are no
+  /// errors.
   @override
   final List<AnalysisError> errors;
 
-  /**
-   * The line information associated with the errors, or `null` if there are no
-   * errors.
-   */
+  /// The line information associated with the errors, or `null` if there are no
+  /// errors.
   final LineInfo lineInfo;
 
-  /**
-   * Initialize an newly created error info with the given [errors] and
-   * [lineInfo].
-   */
+  /// Initialize an newly created error info with the given [errors] and
+  /// [lineInfo].
   AnalysisErrorInfoImpl(this.errors, this.lineInfo);
 }
 
-/**
- * The levels at which a source can be analyzed.
- */
+/// The levels at which a source can be analyzed.
 class AnalysisLevel implements Comparable<AnalysisLevel> {
-  /**
-   * Indicates a source should be fully analyzed.
-   */
+  /// Indicates a source should be fully analyzed.
   static const AnalysisLevel ALL = const AnalysisLevel('ALL', 0);
 
-  /**
-   * Indicates a source should be resolved and that errors, warnings and hints
-   * are needed.
-   */
+  /// Indicates a source should be resolved and that errors, warnings and hints
+  /// are needed.
   static const AnalysisLevel ERRORS = const AnalysisLevel('ERRORS', 1);
 
-  /**
-   * Indicates a source should be resolved, but that errors, warnings and hints
-   * are not needed.
-   */
+  /// Indicates a source should be resolved, but that errors, warnings and hints
+  /// are not needed.
   static const AnalysisLevel RESOLVED = const AnalysisLevel('RESOLVED', 2);
 
-  /**
-   * Indicates a source is not of interest to the client.
-   */
+  /// Indicates a source is not of interest to the client.
   static const AnalysisLevel NONE = const AnalysisLevel('NONE', 3);
 
   static const List<AnalysisLevel> values = const [ALL, ERRORS, RESOLVED, NONE];
 
-  /**
-   * The name of this analysis level.
-   */
+  /// The name of this analysis level.
   final String name;
 
-  /**
-   * The ordinal value of the analysis level.
-   */
+  /// The ordinal value of the analysis level.
   final int ordinal;
 
   const AnalysisLevel(this.name, this.ordinal);
@@ -945,288 +746,207 @@
   String toString() => name;
 }
 
-/**
- * An object that is listening for results being produced by an analysis
- * context.
- */
+/// An object that is listening for results being produced by an analysis
+/// context.
 abstract class AnalysisListener {
-  /**
-   * Reports that a task, described by the given [taskDescription] is about to
-   * be performed by the given [context].
-   */
+  /// Reports that a task, described by the given [taskDescription] is about to
+  /// be performed by the given [context].
   void aboutToPerformTask(AnalysisContext context, String taskDescription);
 
-  /**
-   * Reports that the [errors] associated with the given [source] in the given
-   * [context] has been updated to the given errors. The [lineInfo] is the line
-   * information associated with the source.
-   */
+  /// Reports that the [errors] associated with the given [source] in the given
+  /// [context] has been updated to the given errors. The [lineInfo] is the line
+  /// information associated with the source.
   void computedErrors(AnalysisContext context, Source source,
       List<AnalysisError> errors, LineInfo lineInfo);
 
-  /**
-   * Reports that the given [source] is no longer included in the set of sources
-   * that are being analyzed by the given analysis [context].
-   */
+  /// Reports that the given [source] is no longer included in the set of sources
+  /// that are being analyzed by the given analysis [context].
   void excludedSource(AnalysisContext context, Source source);
 
-  /**
-   * Reports that the given [source] is now included in the set of sources that
-   * are being analyzed by the given analysis [context].
-   */
+  /// Reports that the given [source] is now included in the set of sources that
+  /// are being analyzed by the given analysis [context].
   void includedSource(AnalysisContext context, Source source);
 
-  /**
-   * Reports that the given Dart [source] was parsed in the given [context],
-   * producing the given [unit].
-   */
+  /// Reports that the given Dart [source] was parsed in the given [context],
+  /// producing the given [unit].
   void parsedDart(AnalysisContext context, Source source, CompilationUnit unit);
 
-  /**
-   * Reports that the given Dart [source] was resolved in the given [context].
-   */
+  /// Reports that the given Dart [source] was resolved in the given [context].
   void resolvedDart(
       AnalysisContext context, Source source, CompilationUnit unit);
 }
 
-/**
- * Futures returned by [AnalysisContext] for pending analysis results will
- * complete with this error if it is determined that analysis results will
- * never become available (e.g. because the requested source is not subject to
- * analysis, or because the requested source is a part file which is not a part
- * of any known library).
- */
+/// Futures returned by [AnalysisContext] for pending analysis results will
+/// complete with this error if it is determined that analysis results will
+/// never become available (e.g. because the requested source is not subject to
+/// analysis, or because the requested source is a part file which is not a part
+/// of any known library).
 class AnalysisNotScheduledError implements Exception {}
 
-/**
- * A set of analysis options used to control the behavior of an analysis
- * context.
- */
+/// A set of analysis options used to control the behavior of an analysis
+/// context.
 abstract class AnalysisOptions {
-  /**
-   * The length of the list returned by [signature].
-   */
+  /// The length of the list returned by [signature].
   static const int signatureLength = 4;
 
-  /**
-   * Function that returns `true` if analysis is to parse and analyze function
-   * bodies for a given source.
-   */
+  /// Function that returns `true` if analysis is to parse and analyze function
+  /// bodies for a given source.
   AnalyzeFunctionBodiesPredicate get analyzeFunctionBodiesPredicate;
 
-  /**
-   * Return the maximum number of sources for which AST structures should be
-   * kept in the cache.
-   *
-   * DEPRECATED: This setting no longer has any effect.
-   */
+  /// Return the maximum number of sources for which AST structures should be
+  /// kept in the cache.
+  ///
+  /// DEPRECATED: This setting no longer has any effect.
   @deprecated
   int get cacheSize;
 
-  /**
-   * Return `true` if analysis is to generate dart2js related hint results.
-   */
+  /// A flag indicating whether to run checks on AndroidManifest.xml file to
+  /// see if it is complaint with Chrome OS.
+  bool get chromeOsManifestChecks;
+
+  /// The set of features that are globally enabled for this context.
+  FeatureSet get contextFeatures;
+
+  /// Return `true` if analysis is to generate dart2js related hint results.
   bool get dart2jsHint;
 
-  /**
-   * Return `true` if cache flushing should be disabled.  Setting this option to
-   * `true` can improve analysis speed at the expense of memory usage.  It may
-   * also be useful for working around bugs.
-   *
-   * This option should not be used when the analyzer is part of a long running
-   * process (such as the analysis server) because it has the potential to
-   * prevent memory from being reclaimed.
-   */
+  /// Return `true` if cache flushing should be disabled.  Setting this option to
+  /// `true` can improve analysis speed at the expense of memory usage.  It may
+  /// also be useful for working around bugs.
+  ///
+  /// This option should not be used when the analyzer is part of a long running
+  /// process (such as the analysis server) because it has the potential to
+  /// prevent memory from being reclaimed.
   bool get disableCacheFlushing;
 
-  /**
-   * Return `true` if the parser is to parse asserts in the initializer list of
-   * a constructor.
-   */
+  /// Return `true` if the parser is to parse asserts in the initializer list of
+  /// a constructor.
   @deprecated
   bool get enableAssertInitializer;
 
-  /**
-   * Return `true` to enable custom assert messages (DEP 37).
-   */
+  /// Return `true` to enable custom assert messages (DEP 37).
   @deprecated
   bool get enableAssertMessage;
 
-  /**
-   * Return `true` to if analysis is to enable async support.
-   */
+  /// Return `true` to if analysis is to enable async support.
   @deprecated
   bool get enableAsync;
 
-  /**
-   * Return `true` to enable interface libraries (DEP 40).
-   */
+  /// Return `true` to enable interface libraries (DEP 40).
   @deprecated
   bool get enableConditionalDirectives;
 
-  /**
-   * Return a list containing the names of the experiments that are enabled in
-   * the context associated with these options.
-   *
-   * The process around these experiments is described in this
-   * [doc](https://github.com/dart-lang/sdk/blob/master/docs/process/experimental-flags.md).
-   */
+  /// Return a list containing the names of the experiments that are enabled in
+  /// the context associated with these options.
+  ///
+  /// The process around these experiments is described in this
+  /// [doc](https://github.com/dart-lang/sdk/blob/master/docs/process/experimental-flags.md).
   List<String> get enabledExperiments;
 
-  /**
-   * Return a list of the names of the packages for which, if they define a
-   * plugin, the plugin should be enabled.
-   */
+  /// Return a list of the names of the packages for which, if they define a
+  /// plugin, the plugin should be enabled.
   List<String> get enabledPluginNames;
 
-  /**
-   * Return `true` to enable generic methods (DEP 22).
-   */
+  /// Return `true` to enable generic methods (DEP 22).
   @deprecated
   bool get enableGenericMethods => null;
 
-  /**
-   * Return `true` if access to field formal parameters should be allowed in a
-   * constructor's initializer list.
-   */
+  /// Return `true` if access to field formal parameters should be allowed in a
+  /// constructor's initializer list.
   @deprecated
   bool get enableInitializingFormalAccess;
 
-  /**
-   * Return `true` to enable the lazy compound assignment operators '&&=' and
-   * '||='.
-   */
+  /// Return `true` to enable the lazy compound assignment operators '&&=' and
+  /// '||='.
   bool get enableLazyAssignmentOperators;
 
-  /**
-   * Return `true` if mixins are allowed to inherit from types other than
-   * Object, and are allowed to reference `super`.
-   */
+  /// Return `true` if mixins are allowed to inherit from types other than
+  /// Object, and are allowed to reference `super`.
   @deprecated
   bool get enableSuperMixins;
 
-  /**
-   * Return `true` if timing data should be gathered during execution.
-   */
+  /// Return `true` if timing data should be gathered during execution.
   bool get enableTiming;
 
-  /**
-   * Return `true` to enable the use of URIs in part-of directives.
-   */
+  /// Return `true` to enable the use of URIs in part-of directives.
   @deprecated
   bool get enableUriInPartOf;
 
-  /**
-   * Return a list of error processors that are to be used when reporting
-   * errors in some analysis context.
-   */
+  /// Return a list of error processors that are to be used when reporting
+  /// errors in some analysis context.
   List<ErrorProcessor> get errorProcessors;
 
-  /**
-   * Return a list of exclude patterns used to exclude some sources from
-   * analysis.
-   */
+  /// Return a list of exclude patterns used to exclude some sources from
+  /// analysis.
   List<String> get excludePatterns;
 
-  /**
-   * Return `true` if errors, warnings and hints should be generated for sources
-   * that are implicitly being analyzed. The default value is `true`.
-   */
+  /// Return `true` if errors, warnings and hints should be generated for sources
+  /// that are implicitly being analyzed. The default value is `true`.
   bool get generateImplicitErrors;
 
-  /**
-   * Return `true` if errors, warnings and hints should be generated for sources
-   * in the SDK. The default value is `false`.
-   */
+  /// Return `true` if errors, warnings and hints should be generated for sources
+  /// in the SDK. The default value is `false`.
   bool get generateSdkErrors;
 
-  /**
-   * Return `true` if analysis is to generate hint results (e.g. type inference
-   * based information and pub best practices).
-   */
+  /// Return `true` if analysis is to generate hint results (e.g. type inference
+  /// based information and pub best practices).
   bool get hint;
 
-  /**
-   * Return `true` if analysis is to generate lint warnings.
-   */
+  /// Return `true` if analysis is to generate lint warnings.
   bool get lint;
 
-  /**
-   * Return a list of the lint rules that are to be run in an analysis context
-   * if [lint] returns `true`.
-   */
+  /// Return a list of the lint rules that are to be run in an analysis context
+  /// if [lint] returns `true`.
   List<Linter> get lintRules;
 
-  /**
-   * A mapping from Dart SDK library name (e.g. "dart:core") to a list of paths
-   * to patch files that should be applied to the library.
-   */
+  /// A mapping from Dart SDK library name (e.g. "dart:core") to a list of paths
+  /// to patch files that should be applied to the library.
   Map<String, List<String>> get patchPaths;
 
-  /**
-   * Return `true` if analysis is to parse comments.
-   */
+  /// Return `true` if analysis is to parse comments.
   bool get preserveComments;
 
-  /**
-   * Return `true` if analyzer should enable the use of Dart 2.0 features.
-   *
-   * This getter is deprecated, and is hard-coded to always return true.
-   */
+  /// Return `true` if analyzer should enable the use of Dart 2.0 features.
+  ///
+  /// This getter is deprecated, and is hard-coded to always return true.
   @Deprecated(
       'This getter is deprecated and is hard-coded to always return true.')
   bool get previewDart2;
 
-  /**
-   * The version range for the SDK specified in `pubspec.yaml`, or `null` if
-   * there is no `pubspec.yaml` or if it does not contain an SDK range.
-   */
+  /// The version range for the SDK specified in `pubspec.yaml`, or `null` if
+  /// there is no `pubspec.yaml` or if it does not contain an SDK range.
   VersionConstraint get sdkVersionConstraint;
 
-  /**
-   * Return the opaque signature of the options.
-   *
-   * The length of the list is guaranteed to equal [signatureLength].
-   */
+  /// Return the opaque signature of the options.
+  ///
+  /// The length of the list is guaranteed to equal [signatureLength].
   Uint32List get signature;
 
-  /**
-   * Return `true` if strong mode analysis should be used.
-   *
-   * This getter is deprecated, and is hard-coded to always return true.
-   */
+  /// Return `true` if strong mode analysis should be used.
+  ///
+  /// This getter is deprecated, and is hard-coded to always return true.
   @Deprecated(
       'This getter is deprecated and is hard-coded to always return true.')
   bool get strongMode;
 
-  /**
-   * Return `true` if dependencies between computed results should be tracked
-   * by analysis cache.  This option should only be set to `false` if analysis
-   * is performed in such a way that none of the inputs is ever changed
-   * during the life time of the context.
-   */
+  /// Return `true` if dependencies between computed results should be tracked
+  /// by analysis cache.  This option should only be set to `false` if analysis
+  /// is performed in such a way that none of the inputs is ever changed
+  /// during the life time of the context.
   bool get trackCacheDependencies;
 
-  /**
-   * Return `true` if analyzer should use the Dart 2.0 Front End parser.
-   */
+  /// Return `true` if analyzer should use the Dart 2.0 Front End parser.
   bool get useFastaParser;
 
-  /**
-   * Reset the state of this set of analysis options to its original state.
-   */
+  /// Reset the state of this set of analysis options to its original state.
   void resetToDefaults();
 
-  /**
-   * Set the values of the cross-context options to match those in the given set
-   * of [options].
-   */
+  /// Set the values of the cross-context options to match those in the given set
+  /// of [options].
   @deprecated
   void setCrossContextOptionsFrom(AnalysisOptions options);
 
-  /**
-   * Determine whether two signatures returned by [signature] are equal.
-   */
+  /// Determine whether two signatures returned by [signature] are equal.
   static bool signaturesEqual(Uint32List a, Uint32List b) {
     assert(a.length == signatureLength);
     assert(b.length == signatureLength);
@@ -1242,40 +962,28 @@
   }
 }
 
-/**
- * A set of analysis options used to control the behavior of an analysis
- * context.
- */
+/// A set of analysis options used to control the behavior of an analysis
+/// context.
 class AnalysisOptionsImpl implements AnalysisOptions {
-  /**
-   * DEPRECATED: The maximum number of sources for which data should be kept in
-   * the cache.
-   *
-   * This constant no longer has any effect.
-   */
+  /// DEPRECATED: The maximum number of sources for which data should be kept in
+  /// the cache.
+  ///
+  /// This constant no longer has any effect.
   @deprecated
   static const int DEFAULT_CACHE_SIZE = 64;
 
-  /**
-   * The length of the list returned by [unlinkedSignature].
-   */
+  /// The length of the list returned by [unlinkedSignature].
   static const int unlinkedSignatureLength = 4;
 
-  /**
-   * A predicate indicating whether analysis is to parse and analyze function
-   * bodies.
-   */
+  /// A predicate indicating whether analysis is to parse and analyze function
+  /// bodies.
   AnalyzeFunctionBodiesPredicate _analyzeFunctionBodiesPredicate =
       _analyzeAllFunctionBodies;
 
-  /**
-   * The cached [unlinkedSignature].
-   */
+  /// The cached [unlinkedSignature].
   Uint32List _unlinkedSignature;
 
-  /**
-   * The cached [signature].
-   */
+  /// The cached [signature].
   Uint32List _signature;
 
   @override
@@ -1290,10 +998,7 @@
 
   List<String> _enabledExperiments = const <String>[];
 
-  /**
-   * Parsed [enabledExperiments].
-   */
-  ExperimentStatus _experimentStatus = ExperimentStatus();
+  ExperimentStatus _contextFeatures = ExperimentStatus();
 
   @override
   List<String> enabledPluginNames = const <String>[];
@@ -1304,15 +1009,11 @@
   @override
   bool enableTiming = false;
 
-  /**
-   * A list of error processors that are to be used when reporting errors in
-   * some analysis context.
-   */
+  /// A list of error processors that are to be used when reporting errors in
+  /// some analysis context.
   List<ErrorProcessor> _errorProcessors;
 
-  /**
-   * A list of exclude patterns used to exclude some sources from analysis.
-   */
+  /// A list of exclude patterns used to exclude some sources from analysis.
   List<String> _excludePatterns;
 
   @override
@@ -1327,10 +1028,8 @@
   @override
   bool lint = false;
 
-  /**
-   * The lint rules that are to be run in an analysis context if [lint] returns
-   * `true`.
-   */
+  /// The lint rules that are to be run in an analysis context if [lint] returns
+  /// `true`.
   List<Linter> _lintRules;
 
   Map<String, List<String>> patchPaths = {};
@@ -1338,11 +1037,9 @@
   @override
   bool preserveComments = true;
 
-  /**
-   * A flag indicating whether strong-mode inference hints should be
-   * used.  This flag is not exposed in the interface, and should be
-   * replaced by something more general.
-   */
+  /// A flag indicating whether strong-mode inference hints should be
+  /// used.  This flag is not exposed in the interface, and should be
+  /// replaced by something more general.
   // TODO(leafp): replace this with something more general
   bool strongModeHints = false;
 
@@ -1355,52 +1052,43 @@
   @override
   bool disableCacheFlushing = false;
 
-  /**
-   * A flag indicating whether implicit casts are allowed in [strongMode]
-   * (they are always allowed in Dart 1.0 mode).
-   *
-   * This option is experimental and subject to change.
-   */
+  /// A flag indicating whether implicit casts are allowed in [strongMode]
+  /// (they are always allowed in Dart 1.0 mode).
+  ///
+  /// This option is experimental and subject to change.
   bool implicitCasts = true;
 
-  /**
-   * A flag indicating whether implicit dynamic type is allowed, on by default.
-   *
-   * This flag can be used without necessarily enabling [strongMode], but it is
-   * designed with strong mode's type inference in mind. Without type inference,
-   * it will raise many errors. Also it does not provide type safety without
-   * strong mode.
-   *
-   * This option is experimental and subject to change.
-   */
+  /// A flag indicating whether implicit dynamic type is allowed, on by default.
+  ///
+  /// This flag can be used without necessarily enabling [strongMode], but it is
+  /// designed with strong mode's type inference in mind. Without type inference,
+  /// it will raise many errors. Also it does not provide type safety without
+  /// strong mode.
+  ///
+  /// This option is experimental and subject to change.
   bool implicitDynamic = true;
 
-  /**
-   * A flag indicating whether inference failures are allowed, off by default.
-   *
-   * This option is experimental and subject to change.
-   */
+  /// A flag indicating whether inference failures are allowed, off by default.
+  ///
+  /// This option is experimental and subject to change.
   bool strictInference = false;
 
-  /**
-   * Whether raw types (types without explicit type arguments, such as `List`)
-   * should be reported as potential problems.
-   * 
-   * Raw types are a common source of `dynamic` being introduced implicitly.
-   * This often leads to cast failures later on in the program.
-   */
+  /// Whether raw types (types without explicit type arguments, such as `List`)
+  /// should be reported as potential problems.
+  ///
+  /// Raw types are a common source of `dynamic` being introduced implicitly.
+  /// This often leads to cast failures later on in the program.
   bool strictRawTypes = false;
 
-  /**
-   * Initialize a newly created set of analysis options to have their default
-   * values.
-   */
+  @override
+  bool chromeOsManifestChecks = false;
+
+  /// Initialize a newly created set of analysis options to have their default
+  /// values.
   AnalysisOptionsImpl();
 
-  /**
-   * Initialize a newly created set of analysis options to have the same values
-   * as those in the given set of analysis [options].
-   */
+  /// Initialize a newly created set of analysis options to have the same values
+  /// as those in the given set of analysis [options].
   AnalysisOptionsImpl.from(AnalysisOptions options) {
     analyzeFunctionBodiesPredicate = options.analyzeFunctionBodiesPredicate;
     dart2jsHint = options.dart2jsHint;
@@ -1460,6 +1148,14 @@
     _analyzeFunctionBodiesPredicate = value;
   }
 
+  @override
+  FeatureSet get contextFeatures => _contextFeatures;
+
+  set contextFeatures(FeatureSet featureSet) {
+    _contextFeatures = featureSet;
+    _enabledExperiments = _contextFeatures.toStringList();
+  }
+
   @deprecated
   @override
   bool get enableAssertInitializer => true;
@@ -1481,9 +1177,7 @@
   @deprecated
   void set enableAsync(bool enable) {}
 
-  /**
-   * A flag indicating whether interface libraries are to be supported (DEP 40).
-   */
+  /// A flag indicating whether interface libraries are to be supported (DEP 40).
   bool get enableConditionalDirectives => true;
 
   @deprecated
@@ -1494,7 +1188,7 @@
 
   set enabledExperiments(List<String> enabledExperiments) {
     _enabledExperiments = enabledExperiments;
-    _experimentStatus = ExperimentStatus.fromStrings(enabledExperiments);
+    _contextFeatures = ExperimentStatus.fromStrings(enabledExperiments);
   }
 
   @override
@@ -1531,10 +1225,8 @@
   List<ErrorProcessor> get errorProcessors =>
       _errorProcessors ??= const <ErrorProcessor>[];
 
-  /**
-   * Set the list of error [processors] that are to be used when reporting
-   * errors in some analysis context.
-   */
+  /// Set the list of error [processors] that are to be used when reporting
+  /// errors in some analysis context.
   void set errorProcessors(List<ErrorProcessor> processors) {
     _errorProcessors = processors;
   }
@@ -1542,23 +1234,17 @@
   @override
   List<String> get excludePatterns => _excludePatterns ??= const <String>[];
 
-  /**
-   * Set the exclude patterns used to exclude some sources from analysis to
-   * those in the given list of [patterns].
-   */
+  /// Set the exclude patterns used to exclude some sources from analysis to
+  /// those in the given list of [patterns].
   void set excludePatterns(List<String> patterns) {
     _excludePatterns = patterns;
   }
 
-  /**
-   * The set of enabled experiments.
-   */
-  ExperimentStatus get experimentStatus => _experimentStatus;
+  /// The set of enabled experiments.
+  ExperimentStatus get experimentStatus => _contextFeatures;
 
-  /**
-   * Return `true` to enable mixin declarations.
-   * https://github.com/dart-lang/language/issues/12
-   */
+  /// Return `true` to enable mixin declarations.
+  /// https://github.com/dart-lang/language/issues/12
   @deprecated
   bool get isMixinSupportEnabled => true;
 
@@ -1568,10 +1254,8 @@
   @override
   List<Linter> get lintRules => _lintRules ??= const <Linter>[];
 
-  /**
-   * Set the lint rules that are to be run in an analysis context if [lint]
-   * returns `true`.
-   */
+  /// Set the lint rules that are to be run in an analysis context if [lint]
+  /// returns `true`.
   void set lintRules(List<Linter> rules) {
     _lintRules = rules;
   }
@@ -1641,11 +1325,9 @@
       "The strongMode field is deprecated, and shouldn't be assigned to")
   set strongMode(bool value) {}
 
-  /**
-   * Return the opaque signature of the options that affect unlinked data.
-   *
-   * The length of the list is guaranteed to equal [unlinkedSignatureLength].
-   */
+  /// Return the opaque signature of the options that affect unlinked data.
+  ///
+  /// The length of the list is guaranteed to equal [unlinkedSignatureLength].
   Uint32List get unlinkedSignature {
     if (_unlinkedSignature == null) {
       ApiSignature buffer = new ApiSignature();
@@ -1702,9 +1384,7 @@
     }
   }
 
-  /**
-   * Return whether the given lists of lints are equal.
-   */
+  /// Return whether the given lists of lints are equal.
   static bool compareLints(List<Linter> a, List<Linter> b) {
     if (a.length != b.length) {
       return false;
@@ -1717,175 +1397,129 @@
     return true;
   }
 
-  /**
-   * Predicate used for [analyzeFunctionBodiesPredicate] when
-   * [analyzeFunctionBodies] is set to `true`.
-   */
+  /// Predicate used for [analyzeFunctionBodiesPredicate] when
+  /// [analyzeFunctionBodies] is set to `true`.
   static bool _analyzeAllFunctionBodies(Source _) => true;
 
-  /**
-   * Predicate used for [analyzeFunctionBodiesPredicate] when
-   * [analyzeFunctionBodies] is set to `false`.
-   */
+  /// Predicate used for [analyzeFunctionBodiesPredicate] when
+  /// [analyzeFunctionBodies] is set to `false`.
   static bool _analyzeNoFunctionBodies(Source _) => false;
 }
 
-/**
- *
- */
+///
 class AnalysisResult {
-  /**
-   * The change notices associated with this result, or `null` if there were no
-   * changes and there is no more work to be done.
-   */
+  /// The change notices associated with this result, or `null` if there were no
+  /// changes and there is no more work to be done.
   final List<ChangeNotice> _notices;
 
-  /**
-   * The number of milliseconds required to determine which task was to be
-   * performed.
-   */
+  /// The number of milliseconds required to determine which task was to be
+  /// performed.
   final int getTime;
 
-  /**
-   * The name of the class of the task that was performed.
-   */
+  /// The name of the class of the task that was performed.
   final String taskClassName;
 
-  /**
-   * The number of milliseconds required to perform the task.
-   */
+  /// The number of milliseconds required to perform the task.
   final int performTime;
 
-  /**
-   * Initialize a newly created analysis result to have the given values. The
-   * [notices] is the change notices associated with this result. The [getTime]
-   * is the number of milliseconds required to determine which task was to be
-   * performed. The [taskClassName] is the name of the class of the task that
-   * was performed. The [performTime] is the number of milliseconds required to
-   * perform the task.
-   */
+  /// Initialize a newly created analysis result to have the given values. The
+  /// [notices] is the change notices associated with this result. The [getTime]
+  /// is the number of milliseconds required to determine which task was to be
+  /// performed. The [taskClassName] is the name of the class of the task that
+  /// was performed. The [performTime] is the number of milliseconds required to
+  /// perform the task.
   AnalysisResult(
       this._notices, this.getTime, this.taskClassName, this.performTime);
 
-  /**
-   * Return the change notices associated with this result, or `null` if there
-   * were no changes and there is no more work to be done.
-   */
+  /// Return the change notices associated with this result, or `null` if there
+  /// were no changes and there is no more work to be done.
   List<ChangeNotice> get changeNotices => _notices;
 
-  /**
-   * Return `true` if there is more to be performed after the task that was
-   * performed.
-   */
+  /// Return `true` if there is more to be performed after the task that was
+  /// performed.
   bool get hasMoreWork => _notices != null;
 }
 
-/**
- * Statistics about cache consistency validation.
- */
+/// Statistics about cache consistency validation.
 class CacheConsistencyValidationStatistics {
-  /**
-   * Number of sources which were changed, but the context was not notified
-   * about it, so this fact was detected only during cache consistency
-   * validation.
-   */
+  /// Number of sources which were changed, but the context was not notified
+  /// about it, so this fact was detected only during cache consistency
+  /// validation.
   int numOfChanged = 0;
 
-  /**
-   * Number of sources which stopped existing, but the context was not notified
-   * about it, so this fact was detected only during cache consistency
-   * validation.
-   */
+  /// Number of sources which stopped existing, but the context was not notified
+  /// about it, so this fact was detected only during cache consistency
+  /// validation.
   int numOfRemoved = 0;
 
-  /**
-   * Reset all counters.
-   */
+  /// Reset all counters.
   void reset() {
     numOfChanged = 0;
     numOfRemoved = 0;
   }
 }
 
-/**
- * Interface for cache consistency validation in an [InternalAnalysisContext].
- */
+/// Interface for cache consistency validation in an [InternalAnalysisContext].
 abstract class CacheConsistencyValidator {
-  /**
-   * Return sources for which the contexts needs to know modification times.
-   */
+  /// Return sources for which the contexts needs to know modification times.
   List<Source> getSourcesToComputeModificationTimes();
 
-  /**
-   * Notify the validator that modification [times] were computed for [sources].
-   * If a source does not exist, its modification time is `-1`.
-   *
-   * It's up to the validator and the context how to use this information,
-   * the list of sources the context has might have been changed since the
-   * previous invocation of [getSourcesToComputeModificationTimes].
-   *
-   * Check the cache for any invalid entries (entries whose modification time
-   * does not match the modification time of the source associated with the
-   * entry). Invalid entries will be marked as invalid so that the source will
-   * be re-analyzed. Return `true` if at least one entry was invalid.
-   */
+  /// Notify the validator that modification [times] were computed for [sources].
+  /// If a source does not exist, its modification time is `-1`.
+  ///
+  /// It's up to the validator and the context how to use this information,
+  /// the list of sources the context has might have been changed since the
+  /// previous invocation of [getSourcesToComputeModificationTimes].
+  ///
+  /// Check the cache for any invalid entries (entries whose modification time
+  /// does not match the modification time of the source associated with the
+  /// entry). Invalid entries will be marked as invalid so that the source will
+  /// be re-analyzed. Return `true` if at least one entry was invalid.
   bool sourceModificationTimesComputed(List<Source> sources, List<int> times);
 }
 
-/**
- * The possible states of cached data.
- */
+/// The possible states of cached data.
 class CacheState implements Comparable<CacheState> {
-  /**
-   * The data is not in the cache and the last time an attempt was made to
-   * compute the data an exception occurred, making it pointless to attempt to
-   * compute the data again.
-   *
-   * Valid Transitions:
-   * * [INVALID] if a source was modified that might cause the data to be
-   *   computable
-   */
+  /// The data is not in the cache and the last time an attempt was made to
+  /// compute the data an exception occurred, making it pointless to attempt to
+  /// compute the data again.
+  ///
+  /// Valid Transitions:
+  /// * [INVALID] if a source was modified that might cause the data to be
+  ///   computable
   static const CacheState ERROR = const CacheState('ERROR', 0);
 
-  /**
-   * The data is not in the cache because it was flushed from the cache in order
-   * to control memory usage. If the data is recomputed, results do not need to
-   * be reported.
-   *
-   * Valid Transitions:
-   * * [IN_PROCESS] if the data is being recomputed
-   * * [INVALID] if a source was modified that causes the data to need to be
-   *   recomputed
-   */
+  /// The data is not in the cache because it was flushed from the cache in order
+  /// to control memory usage. If the data is recomputed, results do not need to
+  /// be reported.
+  ///
+  /// Valid Transitions:
+  /// * [IN_PROCESS] if the data is being recomputed
+  /// * [INVALID] if a source was modified that causes the data to need to be
+  ///   recomputed
   static const CacheState FLUSHED = const CacheState('FLUSHED', 1);
 
-  /**
-   * The data might or might not be in the cache but is in the process of being
-   * recomputed.
-   *
-   * Valid Transitions:
-   * * [ERROR] if an exception occurred while trying to compute the data
-   * * [VALID] if the data was successfully computed and stored in the cache
-   */
+  /// The data might or might not be in the cache but is in the process of being
+  /// recomputed.
+  ///
+  /// Valid Transitions:
+  /// * [ERROR] if an exception occurred while trying to compute the data
+  /// * [VALID] if the data was successfully computed and stored in the cache
   static const CacheState IN_PROCESS = const CacheState('IN_PROCESS', 2);
 
-  /**
-   * The data is not in the cache and needs to be recomputed so that results can
-   * be reported.
-   *
-   * Valid Transitions:
-   * * [IN_PROCESS] if an attempt is being made to recompute the data
-   */
+  /// The data is not in the cache and needs to be recomputed so that results can
+  /// be reported.
+  ///
+  /// Valid Transitions:
+  /// * [IN_PROCESS] if an attempt is being made to recompute the data
   static const CacheState INVALID = const CacheState('INVALID', 3);
 
-  /**
-   * The data is in the cache and up-to-date.
-   *
-   * Valid Transitions:
-   * * [FLUSHED] if the data is removed in order to manage memory usage
-   * * [INVALID] if a source was modified in such a way as to invalidate the
-   *   previous data
-   */
+  /// The data is in the cache and up-to-date.
+  ///
+  /// Valid Transitions:
+  /// * [FLUSHED] if the data is removed in order to manage memory usage
+  /// * [INVALID] if a source was modified in such a way as to invalidate the
+  ///   previous data
   static const CacheState VALID = const CacheState('VALID', 4);
 
   static const List<CacheState> values = const [
@@ -1896,14 +1530,10 @@
     VALID
   ];
 
-  /**
-   * The name of this cache state.
-   */
+  /// The name of this cache state.
   final String name;
 
-  /**
-   * The ordinal value of the cache state.
-   */
+  /// The ordinal value of the cache state.
   final int ordinal;
 
   const CacheState(this.name, this.ordinal);
@@ -1918,70 +1548,48 @@
   String toString() => name;
 }
 
-/**
- * An object that represents a change to the analysis results associated with a
- * given source.
- */
+/// An object that represents a change to the analysis results associated with a
+/// given source.
 abstract class ChangeNotice implements AnalysisErrorInfo {
-  /**
-   * The parsed, but maybe not resolved Dart AST that changed as a result of
-   * the analysis, or `null` if the AST was not changed.
-   */
+  /// The parsed, but maybe not resolved Dart AST that changed as a result of
+  /// the analysis, or `null` if the AST was not changed.
   CompilationUnit get parsedDartUnit;
 
-  /**
-   * The fully resolved Dart AST that changed as a result of the analysis, or
-   * `null` if the AST was not changed.
-   */
+  /// The fully resolved Dart AST that changed as a result of the analysis, or
+  /// `null` if the AST was not changed.
   CompilationUnit get resolvedDartUnit;
 
-  /**
-   * Return the source for which the result is being reported.
-   */
+  /// Return the source for which the result is being reported.
   Source get source;
 }
 
-/**
- * An implementation of a [ChangeNotice].
- */
+/// An implementation of a [ChangeNotice].
 class ChangeNoticeImpl implements ChangeNotice {
-  /**
-   * The source for which the result is being reported.
-   */
+  /// The source for which the result is being reported.
   @override
   final Source source;
 
-  /**
-   * The parsed, but maybe not resolved Dart AST that changed as a result of
-   * the analysis, or `null` if the AST was not changed.
-   */
+  /// The parsed, but maybe not resolved Dart AST that changed as a result of
+  /// the analysis, or `null` if the AST was not changed.
   @override
   CompilationUnit parsedDartUnit;
 
-  /**
-   * The fully resolved Dart AST that changed as a result of the analysis, or
-   * `null` if the AST was not changed.
-   */
+  /// The fully resolved Dart AST that changed as a result of the analysis, or
+  /// `null` if the AST was not changed.
   @override
   CompilationUnit resolvedDartUnit;
 
-  /**
-   * The errors that changed as a result of the analysis, or `null` if errors
-   * were not changed.
-   */
+  /// The errors that changed as a result of the analysis, or `null` if errors
+  /// were not changed.
   List<AnalysisError> _errors;
 
-  /**
-   * The line information associated with the source, or `null` if errors were
-   * not changed.
-   */
+  /// The line information associated with the source, or `null` if errors were
+  /// not changed.
   LineInfo _lineInfo;
 
-  /**
-   * Initialize a newly created notice associated with the given source.
-   *
-   * @param source the source for which the change is being reported
-   */
+  /// Initialize a newly created notice associated with the given source.
+  ///
+  /// @param source the source for which the change is being reported
   ChangeNoticeImpl(this.source);
 
   @override
@@ -1990,10 +1598,8 @@
   @override
   LineInfo get lineInfo => _lineInfo;
 
-  /**
-   * Set the errors that changed as a result of the analysis to the given
-   * [errors] and set the line information to the given [lineInfo].
-   */
+  /// Set the errors that changed as a result of the analysis to the given
+  /// [errors] and set the line information to the given [lineInfo].
   void setErrors(List<AnalysisError> errors, LineInfo lineInfo) {
     this._errors = errors;
     this._lineInfo = lineInfo;
@@ -2007,61 +1613,43 @@
   String toString() => "Changes for ${source.fullName}";
 }
 
-/**
- * An indication of which sources have been added, changed, removed, or deleted.
- * In the case of a changed source, there are multiple ways of indicating the
- * nature of the change.
- *
- * No source should be added to the change set more than once, either with the
- * same or a different kind of change. It does not make sense, for example, for
- * a source to be both added and removed, and it is redundant for a source to be
- * marked as changed in its entirety and changed in some specific range.
- */
+/// An indication of which sources have been added, changed, removed, or deleted.
+/// In the case of a changed source, there are multiple ways of indicating the
+/// nature of the change.
+///
+/// No source should be added to the change set more than once, either with the
+/// same or a different kind of change. It does not make sense, for example, for
+/// a source to be both added and removed, and it is redundant for a source to be
+/// marked as changed in its entirety and changed in some specific range.
 class ChangeSet {
-  /**
-   * A list containing the sources that have been added.
-   */
+  /// A list containing the sources that have been added.
   final List<Source> addedSources = new List<Source>();
 
-  /**
-   * A list containing the sources that have been changed.
-   */
+  /// A list containing the sources that have been changed.
   final List<Source> changedSources = new List<Source>();
 
-  /**
-   * A table mapping the sources whose content has been changed to the current
-   * content of those sources.
-   */
+  /// A table mapping the sources whose content has been changed to the current
+  /// content of those sources.
   Map<Source, String> _changedContent = new HashMap<Source, String>();
 
-  /**
-   * A table mapping the sources whose content has been changed within a single
-   * range to the current content of those sources and information about the
-   * affected range.
-   */
+  /// A table mapping the sources whose content has been changed within a single
+  /// range to the current content of those sources and information about the
+  /// affected range.
   final HashMap<Source, ChangeSet_ContentChange> changedRanges =
       new HashMap<Source, ChangeSet_ContentChange>();
 
-  /**
-   * A list containing the sources that have been removed.
-   */
+  /// A list containing the sources that have been removed.
   final List<Source> removedSources = new List<Source>();
 
-  /**
-   * A list containing the source containers specifying additional sources that
-   * have been removed.
-   */
+  /// A list containing the source containers specifying additional sources that
+  /// have been removed.
   final List<SourceContainer> removedContainers = new List<SourceContainer>();
 
-  /**
-   * Return a table mapping the sources whose content has been changed to the
-   * current content of those sources.
-   */
+  /// Return a table mapping the sources whose content has been changed to the
+  /// current content of those sources.
   Map<Source, String> get changedContents => _changedContent;
 
-  /**
-   * Return `true` if this change set does not contain any changes.
-   */
+  /// Return `true` if this change set does not contain any changes.
   bool get isEmpty =>
       addedSources.isEmpty &&
       changedSources.isEmpty &&
@@ -2070,57 +1658,45 @@
       removedSources.isEmpty &&
       removedContainers.isEmpty;
 
-  /**
-   * Record that the specified [source] has been added and that its content is
-   * the default contents of the source.
-   */
+  /// Record that the specified [source] has been added and that its content is
+  /// the default contents of the source.
   void addedSource(Source source) {
     addedSources.add(source);
   }
 
-  /**
-   * Record that the specified [source] has been changed and that its content is
-   * the given [contents].
-   */
+  /// Record that the specified [source] has been changed and that its content is
+  /// the given [contents].
   void changedContent(Source source, String contents) {
     _changedContent[source] = contents;
   }
 
-  /**
-   * Record that the specified [source] has been changed and that its content is
-   * the given [contents]. The [offset] is the offset into the current contents.
-   * The [oldLength] is the number of characters in the original contents that
-   * were replaced. The [newLength] is the number of characters in the
-   * replacement text.
-   */
+  /// Record that the specified [source] has been changed and that its content is
+  /// the given [contents]. The [offset] is the offset into the current contents.
+  /// The [oldLength] is the number of characters in the original contents that
+  /// were replaced. The [newLength] is the number of characters in the
+  /// replacement text.
   void changedRange(Source source, String contents, int offset, int oldLength,
       int newLength) {
     changedRanges[source] =
         new ChangeSet_ContentChange(contents, offset, oldLength, newLength);
   }
 
-  /**
-   * Record that the specified [source] has been changed. If the content of the
-   * source was previously overridden, this has no effect (the content remains
-   * overridden). To cancel (or change) the override, use [changedContent]
-   * instead.
-   */
+  /// Record that the specified [source] has been changed. If the content of the
+  /// source was previously overridden, this has no effect (the content remains
+  /// overridden). To cancel (or change) the override, use [changedContent]
+  /// instead.
   void changedSource(Source source) {
     changedSources.add(source);
   }
 
-  /**
-   * Record that the specified source [container] has been removed.
-   */
+  /// Record that the specified source [container] has been removed.
   void removedContainer(SourceContainer container) {
     if (container != null) {
       removedContainers.add(container);
     }
   }
 
-  /**
-   * Record that the specified [source] has been removed.
-   */
+  /// Record that the specified [source] has been removed.
   void removedSource(Source source) {
     if (source != null) {
       removedSources.add(source);
@@ -2158,11 +1734,9 @@
     return buffer.toString();
   }
 
-  /**
-   * Append the given [sources] to the given [buffer], prefixed with the given
-   * [label] and a separator if [needsSeparator] is `true`. Return `true` if
-   * future lists of sources will need a separator.
-   */
+  /// Append the given [sources] to the given [buffer], prefixed with the given
+  /// [label] and a separator if [needsSeparator] is `true`. Return `true` if
+  /// future lists of sources will need a separator.
   bool _appendSources(StringBuffer buffer, List<Source> sources,
       bool needsSeparator, String label) {
     if (sources.isEmpty) {
@@ -2181,11 +1755,9 @@
     return true;
   }
 
-  /**
-   * Append the given [sources] to the given [builder], prefixed with the given
-   * [label] and a separator if [needsSeparator] is `true`. Return `true` if
-   * future lists of sources will need a separator.
-   */
+  /// Append the given [sources] to the given [builder], prefixed with the given
+  /// [label] and a separator if [needsSeparator] is `true`. Return `true` if
+  /// future lists of sources will need a separator.
   bool _appendSources2(StringBuffer buffer, Map<Source, dynamic> sources,
       bool needsSeparator, String label) {
     if (sources.isEmpty) {
@@ -2205,64 +1777,42 @@
   }
 }
 
-/**
- * A change to the content of a source.
- */
+/// A change to the content of a source.
 class ChangeSet_ContentChange {
-  /**
-   * The new contents of the source.
-   */
+  /// The new contents of the source.
   final String contents;
 
-  /**
-   * The offset into the current contents.
-   */
+  /// The offset into the current contents.
   final int offset;
 
-  /**
-   * The number of characters in the original contents that were replaced
-   */
+  /// The number of characters in the original contents that were replaced
   final int oldLength;
 
-  /**
-   * The number of characters in the replacement text.
-   */
+  /// The number of characters in the replacement text.
   final int newLength;
 
-  /**
-   * Initialize a newly created change object to represent a change to the
-   * content of a source. The [contents] is the new contents of the source. The
-   * [offset] is the offset into the current contents. The [oldLength] is the
-   * number of characters in the original contents that were replaced. The
-   * [newLength] is the number of characters in the replacement text.
-   */
+  /// Initialize a newly created change object to represent a change to the
+  /// content of a source. The [contents] is the new contents of the source. The
+  /// [offset] is the offset into the current contents. The [oldLength] is the
+  /// number of characters in the original contents that were replaced. The
+  /// [newLength] is the number of characters in the replacement text.
   ChangeSet_ContentChange(
       this.contents, this.offset, this.oldLength, this.newLength);
 }
 
-/**
- * [ComputedResult] describes a value computed for a [ResultDescriptor].
- */
+/// [ComputedResult] describes a value computed for a [ResultDescriptor].
 @deprecated
 class ComputedResult<V> {
-  /**
-   * The context in which the value was computed.
-   */
+  /// The context in which the value was computed.
   final AnalysisContext context;
 
-  /**
-   * The descriptor of the result which was computed.
-   */
+  /// The descriptor of the result which was computed.
   final ResultDescriptor<V> descriptor;
 
-  /**
-   * The target for which the result was computed.
-   */
+  /// The target for which the result was computed.
   final AnalysisTarget target;
 
-  /**
-   * The computed value.
-   */
+  /// The computed value.
   final V value;
 
   ComputedResult(this.context, this.descriptor, this.target, this.value);
@@ -2271,25 +1821,17 @@
   String toString() => 'Computed $descriptor of $target in $context';
 }
 
-/**
- * An event indicating when a source either starts or stops being implicitly
- * analyzed.
- */
+/// An event indicating when a source either starts or stops being implicitly
+/// analyzed.
 class ImplicitAnalysisEvent {
-  /**
-   * The source whose status has changed.
-   */
+  /// The source whose status has changed.
   final Source source;
 
-  /**
-   * A flag indicating whether the source is now being analyzed.
-   */
+  /// A flag indicating whether the source is now being analyzed.
   final bool isAnalyzed;
 
-  /**
-   * Initialize a newly created event to indicate that the given [source] has
-   * changed it status to match the [isAnalyzed] flag.
-   */
+  /// Initialize a newly created event to indicate that the given [source] has
+  /// changed it status to match the [isAnalyzed] flag.
   ImplicitAnalysisEvent(this.source, this.isAnalyzed);
 
   @override
@@ -2297,225 +1839,156 @@
       '${isAnalyzed ? '' : 'not '}analyzing ${source.fullName}';
 }
 
-/**
- * Additional behavior for an analysis context that is required by internal
- * users of the context.
- */
+/// Additional behavior for an analysis context that is required by internal
+/// users of the context.
 abstract class InternalAnalysisContext implements AnalysisContext {
-  /**
-   * The result provider for [aboutToComputeResult].
-   */
-  ResultProvider resultProvider;
-
-  /**
-   * A table mapping the sources known to the context to the information known
-   * about the source.
-   */
+  /// A table mapping the sources known to the context to the information known
+  /// about the source.
   AnalysisCache get analysisCache;
 
-  /**
-   * The cache consistency validator for this context.
-   */
+  /// The cache consistency validator for this context.
   CacheConsistencyValidator get cacheConsistencyValidator;
 
-  /**
-   * Allow the client to supply its own content cache.  This will take the
-   * place of the content cache created by default, allowing clients to share
-   * the content cache between contexts.
-   */
+  /// Allow the client to supply its own content cache.  This will take the
+  /// place of the content cache created by default, allowing clients to share
+  /// the content cache between contexts.
   set contentCache(ContentCache value);
 
-  /**
-   * Get the [EmbedderYamlLocator] for this context.
-   */
+  /// Get the [EmbedderYamlLocator] for this context.
   @deprecated
   EmbedderYamlLocator get embedderYamlLocator;
 
-  /**
-   * Return a list of the explicit targets being analyzed by this context.
-   */
+  /// Return a list of the explicit targets being analyzed by this context.
   List<AnalysisTarget> get explicitTargets;
 
-  /**
-   * Return `true` if the context is active, i.e. is being analyzed now.
-   */
+  /// Return `true` if the context is active, i.e. is being analyzed now.
   bool get isActive;
 
-  /**
-   * Specify whether the context is active, i.e. is being analyzed now.
-   */
+  /// Specify whether the context is active, i.e. is being analyzed now.
   set isActive(bool value);
 
-  /**
-   * Return the [StreamController] reporting [InvalidatedResult]s for everything
-   * in this context's cache.
-   */
+  /// Return the [StreamController] reporting [InvalidatedResult]s for everything
+  /// in this context's cache.
   ReentrantSynchronousStream<InvalidatedResult> get onResultInvalidated;
 
-  /**
-   * Return a list containing all of the sources that have been marked as
-   * priority sources. Clients must not modify the returned list.
-   */
+  /// Return a list containing all of the sources that have been marked as
+  /// priority sources. Clients must not modify the returned list.
   List<Source> get prioritySources;
 
-  /**
-   * Return a list of the priority targets being analyzed by this context.
-   */
+  /// Return a list of the priority targets being analyzed by this context.
   List<AnalysisTarget> get priorityTargets;
 
-  /**
-   * The partition that contains analysis results that are not shared with other
-   * contexts.
-   */
+  /// The partition that contains analysis results that are not shared with other
+  /// contexts.
   CachePartition get privateAnalysisCachePartition;
 
-  /**
-   * Sets the [TypeProvider] for this context.
-   */
+  /// Sets the [TypeProvider] for this context.
   void set typeProvider(TypeProvider typeProvider);
 
-  /**
-   * A list of all [WorkManager]s used by this context.
-   */
+  /// A list of all [WorkManager]s used by this context.
   List<WorkManager> get workManagers;
 
-  /**
-   * This method is invoked when the state of the [result] of the [entry] is
-   * [CacheState.INVALID], so it is about to be computed.
-   *
-   * If the context knows how to provide the value, it sets the value into
-   * the [entry] with all required dependencies, and returns `true`.
-   *
-   * Otherwise, it returns `false` to indicate that the result should be
-   * computed as usually.
-   */
+  /// This method is invoked when the state of the [result] of the [entry] is
+  /// [CacheState.INVALID], so it is about to be computed.
+  ///
+  /// If the context knows how to provide the value, it sets the value into
+  /// the [entry] with all required dependencies, and returns `true`.
+  ///
+  /// Otherwise, it returns `false` to indicate that the result should be
+  /// computed as usually.
   bool aboutToComputeResult(CacheEntry entry, ResultDescriptor result);
 
-  /**
-   * Return a list containing the sources of the libraries that are exported by
-   * the library with the given [source]. The list will be empty if the given
-   * source is invalid, if the given source does not represent a library, or if
-   * the library does not export any other libraries.
-   *
-   * Throws an [AnalysisException] if the exported libraries could not be
-   * computed.
-   */
+  /// Return a list containing the sources of the libraries that are exported by
+  /// the library with the given [source]. The list will be empty if the given
+  /// source is invalid, if the given source does not represent a library, or if
+  /// the library does not export any other libraries.
+  ///
+  /// Throws an [AnalysisException] if the exported libraries could not be
+  /// computed.
   List<Source> computeExportedLibraries(Source source);
 
-  /**
-   * Return a list containing the sources of the libraries that are imported by
-   * the library with the given [source]. The list will be empty if the given
-   * source is invalid, if the given source does not represent a library, or if
-   * the library does not import any other libraries.
-   *
-   * Throws an [AnalysisException] if the imported libraries could not be
-   * computed.
-   */
+  /// Return a list containing the sources of the libraries that are imported by
+  /// the library with the given [source]. The list will be empty if the given
+  /// source is invalid, if the given source does not represent a library, or if
+  /// the library does not import any other libraries.
+  ///
+  /// Throws an [AnalysisException] if the imported libraries could not be
+  /// computed.
   List<Source> computeImportedLibraries(Source source);
 
-  /**
-   * Return all the resolved [CompilationUnit]s for the given [source] if not
-   * flushed, otherwise return `null` and ensures that the [CompilationUnit]s
-   * will be eventually returned to the client from [performAnalysisTask].
-   */
+  /// Return all the resolved [CompilationUnit]s for the given [source] if not
+  /// flushed, otherwise return `null` and ensures that the [CompilationUnit]s
+  /// will be eventually returned to the client from [performAnalysisTask].
   List<CompilationUnit> ensureResolvedDartUnits(Source source);
 
-  /**
-   * Return the cache entry associated with the given [target].
-   */
+  /// Return the cache entry associated with the given [target].
   CacheEntry getCacheEntry(AnalysisTarget target);
 
-  /**
-   * Return context that owns the given [source].
-   */
+  /// Return context that owns the given [source].
   InternalAnalysisContext getContextFor(Source source);
 
-  /**
-   * Return a change notice for the given [source], creating one if one does not
-   * already exist.
-   */
+  /// Return a change notice for the given [source], creating one if one does not
+  /// already exist.
   ChangeNoticeImpl getNotice(Source source);
 
-  /**
-   * Return a namespace containing mappings for all of the public names defined
-   * by the given [library].
-   */
+  /// Return a namespace containing mappings for all of the public names defined
+  /// by the given [library].
   Namespace getPublicNamespace(LibraryElement library);
 
-  /**
-   * Respond to a change which has been made to the given [source] file.
-   * [originalContents] is the former contents of the file, and [newContents]
-   * is the updated contents.  If [notify] is true, a source changed event is
-   * triggered.
-   *
-   * Normally it should not be necessary for clients to call this function,
-   * since it will be automatically invoked in response to a call to
-   * [applyChanges] or [setContents].  However, if this analysis context is
-   * sharing its content cache with other contexts, then the client must
-   * manually update the content cache and call this function for each context.
-   *
-   * Return `true` if the change was significant to this context (i.e. [source]
-   * is either implicitly or explicitly analyzed by this context, and a change
-   * actually occurred).
-   */
+  /// Respond to a change which has been made to the given [source] file.
+  /// [originalContents] is the former contents of the file, and [newContents]
+  /// is the updated contents.  If [notify] is true, a source changed event is
+  /// triggered.
+  ///
+  /// Normally it should not be necessary for clients to call this function,
+  /// since it will be automatically invoked in response to a call to
+  /// [applyChanges] or [setContents].  However, if this analysis context is
+  /// sharing its content cache with other contexts, then the client must
+  /// manually update the content cache and call this function for each context.
+  ///
+  /// Return `true` if the change was significant to this context (i.e. [source]
+  /// is either implicitly or explicitly analyzed by this context, and a change
+  /// actually occurred).
   bool handleContentsChanged(
       Source source, String originalContents, String newContents, bool notify);
 
-  /**
-   * Given an [elementMap] mapping the source for the libraries represented by
-   * the corresponding elements to the elements representing the libraries,
-   * record those mappings.
-   */
+  /// Given an [elementMap] mapping the source for the libraries represented by
+  /// the corresponding elements to the elements representing the libraries,
+  /// record those mappings.
   void recordLibraryElements(Map<Source, LibraryElement> elementMap);
 
-  /**
-   * Return `true` if errors should be produced for the given [source].
-   */
+  /// Return `true` if errors should be produced for the given [source].
   bool shouldErrorsBeAnalyzed(Source source);
 
-  /**
-   * For testing only: flush all representations of the AST (both resolved and
-   * unresolved) for the given [source] out of the cache.
-   */
+  /// For testing only: flush all representations of the AST (both resolved and
+  /// unresolved) for the given [source] out of the cache.
   void test_flushAstStructures(Source source);
 
-  /**
-   * Visit all entries of the content cache.
-   */
+  /// Visit all entries of the content cache.
   void visitContentCache(ContentCacheVisitor visitor);
 }
 
-/**
- * An object that can be used to receive information about errors within the
- * analysis engine. Implementations usually write this information to a file,
- * but can also record the information for later use (such as during testing) or
- * even ignore the information.
- */
+/// An object that can be used to receive information about errors within the
+/// analysis engine. Implementations usually write this information to a file,
+/// but can also record the information for later use (such as during testing) or
+/// even ignore the information.
 abstract class Logger {
-  /**
-   * A logger that ignores all logging.
-   */
+  /// A logger that ignores all logging.
   static final Logger NULL = new NullLogger();
 
-  /**
-   * Log the given message as an error. The [message] is expected to be an
-   * explanation of why the error occurred or what it means. The [exception] is
-   * expected to be the reason for the error. At least one argument must be
-   * provided.
-   */
+  /// Log the given message as an error. The [message] is expected to be an
+  /// explanation of why the error occurred or what it means. The [exception] is
+  /// expected to be the reason for the error. At least one argument must be
+  /// provided.
   void logError(String message, [CaughtException exception]);
 
-  /**
-   * Log the given informational message. The [message] is expected to be an
-   * explanation of why the error occurred or what it means. The [exception] is
-   * expected to be the reason for the error.
-   */
+  /// Log the given informational message. The [message] is expected to be an
+  /// explanation of why the error occurred or what it means. The [exception] is
+  /// expected to be the reason for the error.
   void logInformation(String message, [CaughtException exception]);
 }
 
-/**
- * An implementation of [Logger] that does nothing.
- */
+/// An implementation of [Logger] that does nothing.
 class NullLogger implements Logger {
   @override
   void logError(String message, [CaughtException exception]) {}
@@ -2524,109 +1997,71 @@
   void logInformation(String message, [CaughtException exception]) {}
 }
 
-/**
- * An exception created when an analysis attempt fails because a source was
- * deleted between the time the analysis started and the time the results of the
- * analysis were ready to be recorded.
- */
+/// An exception created when an analysis attempt fails because a source was
+/// deleted between the time the analysis started and the time the results of the
+/// analysis were ready to be recorded.
 class ObsoleteSourceAnalysisException extends AnalysisException {
-  /**
-   * The source that was removed while it was being analyzed.
-   */
+  /// The source that was removed while it was being analyzed.
   Source _source;
 
-  /**
-   * Initialize a newly created exception to represent the removal of the given
-   * [source].
-   */
+  /// Initialize a newly created exception to represent the removal of the given
+  /// [source].
   ObsoleteSourceAnalysisException(Source source)
       : super(
             "The source '${source.fullName}' was removed while it was being analyzed") {
     this._source = source;
   }
 
-  /**
-   * Return the source that was removed while it was being analyzed.
-   */
+  /// Return the source that was removed while it was being analyzed.
   Source get source => _source;
 }
 
-/**
- * Container with global [AnalysisContext] performance statistics.
- */
+/// Container with global [AnalysisContext] performance statistics.
 class PerformanceStatistics {
-  /**
-   * The [PerformanceTag] for `package:analyzer`.
-   */
+  /// The [PerformanceTag] for `package:analyzer`.
   static PerformanceTag analyzer = new PerformanceTag('analyzer');
 
-  /**
-   * The [PerformanceTag] for time spent in reading files.
-   */
+  /// The [PerformanceTag] for time spent in reading files.
   static PerformanceTag io = analyzer.createChild('io');
 
-  /**
-   * The [PerformanceTag] for general phases of analysis.
-   */
+  /// The [PerformanceTag] for general phases of analysis.
   static PerformanceTag analysis = analyzer.createChild('analysis');
 
-  /**
-   * The [PerformanceTag] for time spent in scanning.
-   */
+  /// The [PerformanceTag] for time spent in scanning.
   static PerformanceTag scan = analyzer.createChild('scan');
 
-  /**
-   * The [PerformanceTag] for time spent in parsing.
-   */
+  /// The [PerformanceTag] for time spent in parsing.
   static PerformanceTag parse = analyzer.createChild('parse');
 
-  /**
-   * The [PerformanceTag] for time spent in resolving.
-   */
+  /// The [PerformanceTag] for time spent in resolving.
   static PerformanceTag resolve = new PerformanceTag('resolve');
 
-  /**
-   * The [PerformanceTag] for time spent in error verifier.
-   */
+  /// The [PerformanceTag] for time spent in error verifier.
   static PerformanceTag errors = analysis.createChild('errors');
 
-  /**
-   * The [PerformanceTag] for time spent in hints generator.
-   */
+  /// The [PerformanceTag] for time spent in hints generator.
   static PerformanceTag hints = analysis.createChild('hints');
 
-  /**
-   * The [PerformanceTag] for time spent in linting.
-   */
+  /// The [PerformanceTag] for time spent in linting.
   static PerformanceTag lints = analysis.createChild('lints');
 
-  /**
-   * The [PerformanceTag] for time spent computing cycles.
-   */
+  /// The [PerformanceTag] for time spent computing cycles.
   static PerformanceTag cycles = new PerformanceTag('cycles');
 
-  /**
-   * The [PerformanceTag] for time spent in summaries support.
-   */
+  /// The [PerformanceTag] for time spent in summaries support.
   static PerformanceTag summary = analyzer.createChild('summary');
 
-  /**
-   * Statistics about cache consistency validation.
-   */
+  /// Statistics about cache consistency validation.
   static final CacheConsistencyValidationStatistics
       cacheConsistencyValidationStatistics =
       new CacheConsistencyValidationStatistics();
 }
 
-/**
- * An visitor that removes any resolution information from an AST structure when
- * used to visit that structure.
- */
+/// An visitor that removes any resolution information from an AST structure when
+/// used to visit that structure.
 class ResolutionEraser extends GeneralizingAstVisitor<void> {
-  /**
-   * A flag indicating whether the elements associated with declarations should
-   * be erased.
-   */
+  /// A flag indicating whether the elements associated with declarations should
+  /// be erased.
   bool eraseDeclarations = true;
 
   @override
@@ -2748,9 +2183,7 @@
     super.visitSuperConstructorInvocation(node);
   }
 
-  /**
-   * Remove any resolution information from the given AST structure.
-   */
+  /// Remove any resolution information from the given AST structure.
   static void erase(AstNode node, {bool eraseDeclarations: true}) {
     ResolutionEraser eraser = new ResolutionEraser();
     eraser.eraseDeclarations = eraseDeclarations;
@@ -2758,48 +2191,32 @@
   }
 }
 
-/**
- * [ResultChangedEvent] describes a change to an analysis result.
- */
+/// [ResultChangedEvent] describes a change to an analysis result.
 class ResultChangedEvent<V> {
-  /**
-   * The context in which the result was changed.
-   */
+  /// The context in which the result was changed.
   final AnalysisContext context;
 
-  /**
-   * The target for which the result was changed.
-   */
+  /// The target for which the result was changed.
   final AnalysisTarget target;
 
-  /**
-   * The descriptor of the result which was changed.
-   */
+  /// The descriptor of the result which was changed.
   final ResultDescriptor<V> descriptor;
 
-  /**
-   * If the result [wasComputed], the new value of the result. If the result
-   * [wasInvalidated], the value of before it was invalidated, may be the
-   * default value if the result was flushed.
-   */
+  /// If the result [wasComputed], the new value of the result. If the result
+  /// [wasInvalidated], the value of before it was invalidated, may be the
+  /// default value if the result was flushed.
   final V value;
 
-  /**
-   * Is `true` if the result was computed, or `false` is is was invalidated.
-   */
+  /// Is `true` if the result was computed, or `false` is is was invalidated.
   final bool _wasComputed;
 
   ResultChangedEvent(this.context, this.target, this.descriptor, this.value,
       this._wasComputed);
 
-  /**
-   * Returns `true` if the result was computed.
-   */
+  /// Returns `true` if the result was computed.
   bool get wasComputed => _wasComputed;
 
-  /**
-   * Returns `true` if the result was invalidated.
-   */
+  /// Returns `true` if the result was invalidated.
   bool get wasInvalidated => !_wasComputed;
 
   @override
@@ -2809,34 +2226,24 @@
   }
 }
 
-/**
- * [SourcesChangedEvent] indicates which sources have been added, removed,
- * or whose contents have changed.
- */
+/// [SourcesChangedEvent] indicates which sources have been added, removed,
+/// or whose contents have changed.
 class SourcesChangedEvent {
-  /**
-   * The internal representation of what has changed. Clients should not access
-   * this field directly.
-   */
+  /// The internal representation of what has changed. Clients should not access
+  /// this field directly.
   final ChangeSet _changeSet;
 
-  /**
-   * Construct an instance representing the given changes.
-   */
+  /// Construct an instance representing the given changes.
   SourcesChangedEvent(ChangeSet changeSet) : _changeSet = changeSet;
 
-  /**
-   * Construct an instance representing a source content change.
-   */
+  /// Construct an instance representing a source content change.
   factory SourcesChangedEvent.changedContent(Source source, String contents) {
     ChangeSet changeSet = new ChangeSet();
     changeSet.changedContent(source, contents);
     return new SourcesChangedEvent(changeSet);
   }
 
-  /**
-   * Construct an instance representing a source content change.
-   */
+  /// Construct an instance representing a source content change.
   factory SourcesChangedEvent.changedRange(Source source, String contents,
       int offset, int oldLength, int newLength) {
     ChangeSet changeSet = new ChangeSet();
@@ -2844,9 +2251,7 @@
     return new SourcesChangedEvent(changeSet);
   }
 
-  /**
-   * Return the collection of sources for which content has changed.
-   */
+  /// Return the collection of sources for which content has changed.
   Iterable<Source> get changedSources {
     List<Source> changedSources = new List.from(_changeSet.changedSources);
     changedSources.addAll(_changeSet.changedContents.keys);
@@ -2854,14 +2259,10 @@
     return changedSources;
   }
 
-  /**
-   * Return `true` if any sources were added.
-   */
+  /// Return `true` if any sources were added.
   bool get wereSourcesAdded => _changeSet.addedSources.length > 0;
 
-  /**
-   * Return `true` if any sources were removed or deleted.
-   */
+  /// Return `true` if any sources were removed or deleted.
   bool get wereSourcesRemoved =>
       _changeSet.removedSources.length > 0 ||
       _changeSet.removedContainers.length > 0;
diff --git a/analyzer/lib/src/generated/error.dart b/analyzer/lib/src/generated/error.dart
index 3d71368..fe431d2 100644
--- a/analyzer/lib/src/generated/error.dart
+++ b/analyzer/lib/src/generated/error.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/src/generated/error_verifier.dart b/analyzer/lib/src/generated/error_verifier.dart
index 9bd55f1..8eb5579 100644
--- a/analyzer/lib/src/generated/error_verifier.dart
+++ b/analyzer/lib/src/generated/error_verifier.dart
@@ -14,13 +14,16 @@
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/diagnostic/diagnostic_factory.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/error/literal_element_verifier.dart';
 import 'package:analyzer/src/error/pending_error.dart';
 import 'package:analyzer/src/generated/element_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -472,6 +475,7 @@
     try {
       _isInCatchClause = true;
       _checkForTypeAnnotationDeferredClass(node.exceptionType);
+      _checkForPotentiallyNullableType(node.exceptionType);
       super.visitCatchClause(node);
     } finally {
       _isInCatchClause = previousIsInCatchClause;
@@ -743,6 +747,7 @@
   void visitFormalParameterList(FormalParameterList node) {
     _checkDuplicateDefinitionInParameterList(node);
     _checkUseOfCovariantInParameters(node);
+    _checkUseOfDefaultValuesInParameters(node);
     super.visitFormalParameterList(node);
   }
 
@@ -837,6 +842,8 @@
     }
     _checkForImplicitDynamicInvoke(node);
     _checkForNullableDereference(node.function);
+    _checkForMissingRequiredParam(
+        node.staticInvokeType, node.argumentList, node);
     super.visitFunctionExpressionInvocation(node);
   }
 
@@ -872,7 +879,7 @@
       }
 
       // TODO(paulberry): remove this once dartbug.com/28515 is fixed.
-      if (node.typeParameters != null) {
+      if (node.typeParameters != null && !AnalysisDriver.useSummary2) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.GENERIC_FUNCTION_TYPED_PARAM_UNSUPPORTED,
             node);
@@ -944,6 +951,8 @@
         _checkForConstOrNewWithAbstractClass(node, typeName, type);
         _checkForConstOrNewWithEnum(node, typeName, type);
         _checkForConstOrNewWithMixin(node, typeName, type);
+        _checkForMissingRequiredParam(
+            node.staticElement?.type, node.argumentList, node.constructorName);
         if (_isInConstInstanceCreation) {
           _checkForConstWithNonConst(node);
           _checkForConstWithUndefinedConstructor(
@@ -952,6 +961,7 @@
         } else {
           _checkForNewWithUndefinedConstructor(node, constructorName, typeName);
         }
+        _checkForListConstructor(node, type);
       }
       _checkForImplicitDynamicType(typeName);
       super.visitInstanceCreationExpression(node);
@@ -993,7 +1003,7 @@
       _checkTypeArgumentCount(typeArguments, 1,
           StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS);
     }
-    _checkForRawTypedLiteral(node);
+    _checkForInferenceFailureOnCollectionLiteral(node);
     _checkForImplicitDynamicTypedLiteral(node);
     _checkForListElementTypeNotAssignable(node);
 
@@ -1043,6 +1053,8 @@
     }
     _checkTypeArguments(node);
     _checkForImplicitDynamicInvoke(node);
+    _checkForMissingRequiredParam(
+        node.staticInvokeType, node.argumentList, node.methodName);
     if (node.operator?.type != TokenType.QUESTION_PERIOD &&
         methodName.name != 'toString' &&
         methodName.name != 'noSuchMethod') {
@@ -1102,9 +1114,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);
   }
 
@@ -1160,6 +1174,11 @@
   @override
   void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
+    DartType type =
+        resolutionMap.staticElementForConstructorReference(node)?.type;
+    if (type != null) {
+      _checkForMissingRequiredParam(type, node.argumentList, node);
+    }
     _isInConstructorInitializer = true;
     try {
       super.visitRedirectingConstructorInvocation(node);
@@ -1200,11 +1219,10 @@
         _checkTypeArgumentCount(typeArguments, 2,
             StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
       }
-      _checkForRawTypedLiteral(node);
+      _checkForInferenceFailureOnCollectionLiteral(node);
       _checkForImplicitDynamicTypedLiteral(node);
       _checkForMapTypeNotAssignable(node);
       _checkForNonConstMapAsExpressionStatement3(node);
-      _checkForExpressions(node.elements2);
     } else if (node.isSet) {
       if (typeArguments != null) {
         if (node.isConst) {
@@ -1217,10 +1235,9 @@
         _checkTypeArgumentCount(typeArguments, 1,
             StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS);
       }
-      _checkForRawTypedLiteral(node);
+      _checkForInferenceFailureOnCollectionLiteral(node);
       _checkForImplicitDynamicTypedLiteral(node);
       _checkForSetElementTypeNotAssignable3(node);
-      _checkForMapEntries(node.elements2);
     }
     super.visitSetOrMapLiteral(node);
   }
@@ -1256,6 +1273,11 @@
 
   @override
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    DartType type =
+        resolutionMap.staticElementForConstructorReference(node)?.type;
+    if (type != null) {
+      _checkForMissingRequiredParam(type, node.argumentList, node);
+    }
     _isInConstructorInitializer = true;
     try {
       super.visitSuperConstructorInvocation(node);
@@ -1316,7 +1338,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);
   }
 
@@ -1924,7 +1951,7 @@
     List<FieldElement> notInitFinalFields = <FieldElement>[];
     fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) {
       if (state == INIT_STATE.NOT_INIT) {
-        if (fieldElement.isFinal) {
+        if (fieldElement.isFinal && !fieldElement.isLate) {
           notInitFinalFields.add(fieldElement);
         }
       }
@@ -2229,63 +2256,6 @@
   }
 
   /**
-   * Verify that the type of the elements of the given [spreadExpression] (the
-   * [spreadExpressionType]) can be assigned to the element type of the
-   * enclosing collection (the [elementType]). If not, report an error with the
-   * given [errorCode].
-   */
-  void _checkForArgumentTypeNotAssignableInSpread(
-      Expression spreadExpression,
-      DartType spreadExpressionType,
-      DartType elementType,
-      ErrorCode errorCode) {
-    if (spreadExpressionType != null && elementType != null) {
-      if (!elementType.isVoid && _checkForUseOfVoidResult(spreadExpression)) {
-        return;
-      }
-      if (spreadExpressionType is InterfaceType) {
-        if (_typeSystem.isSubtypeOf(
-            spreadExpressionType, _typeProvider.iterableObjectType)) {
-          InterfaceType iterableType =
-              (spreadExpressionType as InterfaceTypeImpl)
-                  .asInstanceOf(_typeProvider.iterableType.element);
-          if (iterableType != null) {
-            // The `iterableType` will be `null` when `spreadExpressionType` is
-            // `Null`. Fall through in that case to perform the default type
-            // check.
-            List<DartType> typeArguments = iterableType.typeArguments;
-            if (typeArguments.length == 1) {
-              _checkForAssignableExpressionAtType(
-                  spreadExpression, typeArguments[0], elementType, errorCode);
-              return;
-            }
-          }
-        } else if (_typeSystem.isSubtypeOf(
-            spreadExpressionType, _typeProvider.mapObjectObjectType)) {
-          // TODO(brianwilkerson) Handle spreads involving maps? This method
-          //  isn't currently called for maps, but might be if it's reworked as
-          //  expected.
-//          InterfaceType mapType =
-//              (spreadExpressionType as InterfaceTypeImpl)
-//                  .asInstanceOf(_typeProvider.mapType.element);
-//          if (mapType != null) {
-//            List<DartType> typeArguments = mapType.typeArguments;
-//            if (typeArguments.length == 2) {
-//              _checkForAssignableExpressionAtType(
-//                  spreadExpression, typeArguments[0], keyType, errorCode);
-//              _checkForAssignableExpressionAtType(
-//                  spreadExpression, typeArguments[1], valueType, errorCode);
-//              return;
-//            }
-//          }
-        }
-      }
-      _checkForAssignableExpressionAtType(
-          spreadExpression, spreadExpressionType, elementType, errorCode);
-    }
-  }
-
-  /**
    * Verify that the given [expression] can be assigned to its corresponding
    * parameters. The [expectedStaticType] is the expected static type.
    *
@@ -2544,34 +2514,6 @@
   }
 
   /**
-   * Verify that the given [element] can be assigned to the [elementType] of the
-   * enclosing list or set literal. Report an error with the given [errorCode]
-   * if not.
-   *
-   * This method corresponds to
-   * [BestPracticesVerifier.checkForArgumentTypeNotAssignableWithExpectedTypes].
-   */
-  void _checkForCollectionElementTypeNotAssignableWithElementType(
-      CollectionElement element, DartType elementType, ErrorCode errorCode) {
-    if (element is ForElement) {
-      _checkForCollectionElementTypeNotAssignableWithElementType(
-          element.body, elementType, errorCode);
-    } else if (element is IfElement) {
-      _checkForCollectionElementTypeNotAssignableWithElementType(
-          element.thenElement, elementType, errorCode);
-      _checkForCollectionElementTypeNotAssignableWithElementType(
-          element.elseElement, elementType, errorCode);
-    } else if (element is Expression) {
-      _checkForArgumentTypeNotAssignable(
-          element, elementType, getStaticType(element), errorCode);
-    } else if (element is SpreadElement) {
-      Expression expression = element.expression;
-      _checkForArgumentTypeNotAssignableInSpread(
-          expression, getStaticType(expression), elementType, errorCode);
-    }
-  }
-
-  /**
    * Verify that the [_enclosingClass] does not have a method and getter pair
    * with the same name on, via inheritance.
    *
@@ -2609,8 +2551,8 @@
         _errorReporter.reportErrorForElement(
             CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD, method, [
           _enclosingClass.displayName,
-          inherited.enclosingElement.displayName,
-          name
+          name,
+          inherited.enclosingElement.displayName
         ]);
       }
     }
@@ -3063,7 +3005,7 @@
 
     AstNode parent = node.parent;
     Token awaitKeyword;
-    if (parent is ForStatement2) {
+    if (parent is ForStatement) {
       awaitKeyword = parent.awaitKeyword;
     } else if (parent is ForElement) {
       awaitKeyword = parent.awaitKeyword;
@@ -3175,32 +3117,6 @@
   }
 
   /**
-   * Create a diagnostic if any of the leaf elements in the given collection of
-   * [elements] is an expression.
-   */
-  void _checkForExpression(CollectionElement element) {
-    if (element is ForElement) {
-      _checkForExpression(element.body);
-    } else if (element is IfElement) {
-      _checkForExpression(element.thenElement);
-      _checkForExpression(element.elseElement);
-    } else if (element is Expression) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.EXPRESSION_IN_MAP, element);
-    }
-  }
-
-  /**
-   * Create a diagnostic if any of the leaf elements in the given collection of
-   * [elements] is an expression.
-   */
-  void _checkForExpressions(NodeList<CollectionElement> elements) {
-    for (CollectionElement element in elements) {
-      _checkForExpression(element);
-    }
-  }
-
-  /**
    * Verify that the given extends [clause] does not extend a deferred class.
    *
    * See [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS].
@@ -3398,7 +3314,7 @@
               CompileTimeErrorCode.CONST_NOT_INITIALIZED,
               variable.name,
               [variable.name.name]);
-        } else {
+        } else if (!_isNonNullable || !variable.isLate) {
           _errorReporter.reportErrorForNode(
               StaticWarningCode.FINAL_NOT_INITIALIZED,
               variable.name,
@@ -3778,6 +3694,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.
@@ -3954,6 +3910,17 @@
     }
   }
 
+  void _checkForListConstructor(
+      InstanceCreationExpression node, InterfaceType type) {
+    if (node.argumentList.arguments.length == 1 &&
+        _isDartCoreList(type) &&
+        _typeSystem.isPotentiallyNonNullable(type.typeArguments[0])) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH,
+          node.constructorName);
+    }
+  }
+
   /**
    * Verify that the elements of the given list [literal] are subtypes of the
    * list's static type.
@@ -3975,85 +3942,16 @@
     DartType listElementType = typeArguments[0];
 
     // Check every list element.
-    for (CollectionElement element in literal.elements2) {
-      _checkForCollectionElementTypeNotAssignableWithElementType(element,
-          listElementType, StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE);
-    }
-  }
-
-  /**
-   * Verify that the given [element] can be assigned to the [elementType] of the
-   * enclosing list or set literal. Report an error with the given [errorCode]
-   * if not.
-   *
-   * This method corresponds to
-   * [BestPracticesVerifier.checkForArgumentTypeNotAssignableWithExpectedTypes].
-   */
-  void _checkForMapElementTypeNotAssignableWithKeyOrValueType(
-      CollectionElement element,
-      DartType keyType,
-      DartType valueType,
-      ErrorCode keyErrorCode,
-      ErrorCode valueErrorCode) {
-    if (element is ForElement) {
-      _checkForMapElementTypeNotAssignableWithKeyOrValueType(
-          element.body, keyType, valueType, keyErrorCode, valueErrorCode);
-    } else if (element is IfElement) {
-      _checkForMapElementTypeNotAssignableWithKeyOrValueType(
-          element.thenElement,
-          keyType,
-          valueType,
-          keyErrorCode,
-          valueErrorCode);
-      _checkForMapElementTypeNotAssignableWithKeyOrValueType(
-          element.elseElement,
-          keyType,
-          valueType,
-          keyErrorCode,
-          valueErrorCode);
-    } else if (element is MapLiteralEntry) {
-      _checkForArgumentTypeNotAssignableWithExpectedTypes(
-          element.key, keyType, keyErrorCode);
-      _checkForArgumentTypeNotAssignableWithExpectedTypes(
-          element.value, valueType, valueErrorCode);
-    } else if (element is SpreadElement) {
-      Expression expression = element.expression;
-      DartType expressionType = getStaticType(expression);
-      if (expressionType is ParameterizedType) {
-        List<DartType> typeArguments = expressionType.typeArguments;
-        if (typeArguments.length == 2) {
-          _checkForArgumentTypeNotAssignable(
-              expression, keyType, typeArguments[0], keyErrorCode);
-          _checkForArgumentTypeNotAssignable(
-              expression, valueType, typeArguments[1], valueErrorCode);
-        }
-      }
-    }
-  }
-
-  /**
-   * Create a diagnostic if any of the leaf elements in the given collection of
-   * [elements] is a map entry.
-   */
-  void _checkForMapEntries(NodeList<CollectionElement> elements) {
-    for (CollectionElement element in elements) {
-      _checkForMapEntry(element);
-    }
-  }
-
-  /**
-   * Create a diagnostic if any of the leaf elements in the given collection of
-   * [elements] is a map entry.
-   */
-  void _checkForMapEntry(CollectionElement element) {
-    if (element is ForElement) {
-      _checkForMapEntry(element.body);
-    } else if (element is IfElement) {
-      _checkForMapEntry(element.thenElement);
-      _checkForMapEntry(element.elseElement);
-    } else if (element is MapLiteralEntry) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.MAP_ENTRY_NOT_IN_MAP, element);
+    var verifier = LiteralElementVerifier(
+      _typeProvider,
+      _typeSystem,
+      _errorReporter,
+      _checkForUseOfVoidResult,
+      forList: true,
+      elementType: listElementType,
+    );
+    for (CollectionElement element in literal.elements) {
+      verifier.verify(element);
     }
   }
 
@@ -4078,14 +3976,17 @@
       DartType keyType = typeArguments[0];
       DartType valueType = typeArguments[1];
 
-      NodeList<CollectionElement> entries = literal.elements2;
-      for (CollectionElement entry in entries) {
-        _checkForMapElementTypeNotAssignableWithKeyOrValueType(
-            entry,
-            keyType,
-            valueType,
-            StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
-            StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE);
+      var verifier = LiteralElementVerifier(
+        _typeProvider,
+        _typeSystem,
+        _errorReporter,
+        _checkForUseOfVoidResult,
+        forMap: true,
+        mapKeyType: keyType,
+        mapValueType: valueType,
+      );
+      for (CollectionElement element in literal.elements) {
+        verifier.verify(element);
       }
     }
   }
@@ -4230,6 +4131,24 @@
     }
   }
 
+  void _checkForMissingRequiredParam(
+      DartType type, ArgumentList argumentList, AstNode node) {
+    if (type is FunctionType) {
+      for (ParameterElement parameter in type.parameters) {
+        if (parameter.isRequiredNamed) {
+          String parameterName = parameter.name;
+          if (!RequiredConstantsComputer._containsNamedExpression(
+              argumentList, parameterName)) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT,
+                node,
+                [parameterName]);
+          }
+        }
+      }
+    }
+  }
+
   /**
    * Verify that the given function [body] does not contain return statements
    * that both have and do not have return values.
@@ -4340,8 +4259,11 @@
       if (!isSatisfied) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
-            mixinName.name,
-            [constraint.displayName]);
+            mixinName.name, [
+          mixinName.type.displayName,
+          _enclosingClass.supertype,
+          constraint.displayName
+        ]);
         return true;
       }
     }
@@ -4488,7 +4410,7 @@
       return;
     }
     MethodElement element = _findOverriddenMemberThatMustCallSuper(node);
-    if (element != null) {
+    if (element != null && _hasConcreteSuperMethod(node)) {
       _InvocationCollector collector = new _InvocationCollector();
       node.accept(collector);
       if (!collector.superCalls.contains(element.name)) {
@@ -4727,8 +4649,8 @@
     if (expression == null ||
         !_isNonNullable ||
         expression.staticType == null ||
-        (expression.staticType as TypeImpl).nullability !=
-            Nullability.nullable) {
+        (expression.staticType as TypeImpl).nullabilitySuffix !=
+            NullabilitySuffix.question) {
       return false;
     }
 
@@ -4849,6 +4771,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].
@@ -4870,69 +4804,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.metadata.isNotEmpty) {
-        for (var annotation in element.metadata) {
-          var e = annotation.element;
-          // TODO(jmesserly): similar "package:meta" annotations are added to
-          // the element as boolean getters, that may be worth considering.
-          if (e?.name == 'optionalTypeArgs' &&
-              e.librarySource.uri.toString() == 'package:meta/meta.dart') {
-            // Type is marked with `@optionalTypeArgs`: not an error.
-            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.
   ///
@@ -4945,16 +4816,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);
   }
 
   /**
@@ -5129,10 +4995,8 @@
         _hiddenElements != null &&
         _hiddenElements.contains(node.staticElement) &&
         node.parent is! CommentReference) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION,
-          node,
-          [node.name]);
+      _errorReporter.reportError(new DiagnosticFactory()
+          .referencedBeforeDeclaration(_errorReporter.source, node));
     }
   }
 
@@ -5298,9 +5162,16 @@
       DartType setElementType = typeArguments[0];
 
       // Check every set element.
-      for (CollectionElement element in literal.elements2) {
-        _checkForCollectionElementTypeNotAssignableWithElementType(element,
-            setElementType, StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE);
+      var verifier = LiteralElementVerifier(
+        _typeProvider,
+        _typeSystem,
+        _errorReporter,
+        _checkForUseOfVoidResult,
+        forSet: true,
+        elementType: setElementType,
+      );
+      for (CollectionElement element in literal.elements) {
+        verifier.verify(element);
       }
     }
   }
@@ -5387,7 +5258,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].
    */
@@ -5425,6 +5296,8 @@
         // should be unnecessary.
         FunctionTypeAliasElement typedefElement = element.enclosingElement;
         parameterElements = typedefElement.typeParameters;
+      } else if (type is FunctionType) {
+        parameterElements = type.typeFormals;
       } else {
         // There are no other kinds of parameterized types.
         throw new UnimplementedError(
@@ -5594,8 +5467,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, []);
     }
@@ -5792,7 +5665,7 @@
     }
 
     NodeList<FormalParameter> parameters = parameterList.parameters;
-    if (parameters.length != 1 || !parameters[0].isRequired) {
+    if (parameters.length != 1 || !parameters[0].isRequiredPositional) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
           setterName);
@@ -6035,6 +5908,59 @@
     }
   }
 
+  void _checkUseOfDefaultValuesInParameters(FormalParameterList node) {
+    AstNode parent = node.parent;
+    if (parent is FieldFormalParameter ||
+        parent is FunctionTypeAlias ||
+        parent is FunctionTypedFormalParameter ||
+        parent is GenericFunctionType) {
+      // These locations are not allowed to have default values.
+      return;
+    }
+    NodeList<FormalParameter> parameters = node.parameters;
+    int length = parameters.length;
+    for (int i = 0; i < length; i++) {
+      FormalParameter parameter = parameters[i];
+      if (parameter.isOptional) {
+        DartType type = parameter.declaredElement.type;
+        if (type.isDartAsyncFutureOr) {
+          type = (type as ParameterizedType).typeArguments[0];
+        }
+        if ((parameter as DefaultFormalParameter).defaultValue == null) {
+          if (_typeSystem.isPotentiallyNonNullable(type)) {
+            SimpleIdentifier parameterName = _parameterName(parameter);
+            if (type is TypeParameterType) {
+              _errorReporter.reportErrorForNode(
+                  CompileTimeErrorCode.INVALID_OPTIONAL_PARAMETER_TYPE,
+                  parameterName ?? parameter,
+                  [parameterName?.name ?? '?']);
+            } else {
+              _errorReporter.reportErrorForNode(
+                  CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER,
+                  parameterName ?? parameter,
+                  [parameterName?.name ?? '?']);
+            }
+          }
+        } else if (!_typeSystem.isNonNullable(type) &&
+            _typeSystem.isPotentiallyNonNullable(type)) {
+          // If the type is both potentially non-nullable and not
+          // non-nullable, then it cannot be used for an optional parameter.
+          SimpleIdentifier parameterName = _parameterName(parameter);
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.INVALID_OPTIONAL_PARAMETER_TYPE,
+              parameterName ?? parameter,
+              [parameterName?.name ?? '?']);
+        }
+      } else if (parameter.isRequiredNamed) {
+        if ((parameter as DefaultFormalParameter).defaultValue != null) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER,
+              _parameterName(parameter) ?? parameter);
+        }
+      }
+    }
+  }
+
   InterfaceType _findInterfaceTypeForMixin(TypeName mixin,
       InterfaceType supertypeConstraint, List<InterfaceType> interfaceTypes) {
     var element = supertypeConstraint.element;
@@ -6080,20 +6006,40 @@
     return result;
   }
 
+  /// Find a method which is overridden by [node] and which is annotated with
+  /// `@mustCallSuper`.
+  ///
+  /// As per the definition of `mustCallSuper` [1], every method which overrides
+  /// a method annotated with `@mustCallSuper` is implicitly annotated with
+  /// `@mustCallSuper`.
+  ///
+  /// [1] https://pub.dartlang.org/documentation/meta/latest/meta/mustCallSuper-constant.html
   MethodElement _findOverriddenMemberThatMustCallSuper(MethodDeclaration node) {
-    ExecutableElement overriddenMember =
-        _getOverriddenMember(node.declaredElement);
-    List<ExecutableElement> seen = <ExecutableElement>[];
-    while (
-        overriddenMember is MethodElement && !seen.contains(overriddenMember)) {
-      for (ElementAnnotation annotation in overriddenMember.metadata) {
-        if (annotation.isMustCallSuper) {
-          return overriddenMember;
-        }
+    Element member = node.declaredElement;
+    ClassElement classElement = member.enclosingElement;
+    String name = member.name;
+
+    // Walk up the type hierarchy from [classElement], ignoring direct interfaces.
+    Queue<ClassElement> superclasses =
+        Queue.of(classElement.mixins.map((i) => i.element))
+          ..addAll(classElement.superclassConstraints.map((i) => i.element))
+          ..add(classElement.supertype?.element);
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    while (superclasses.isNotEmpty) {
+      ClassElement ancestor = superclasses.removeFirst();
+      if (ancestor == null || !visitedClasses.add(ancestor)) {
+        continue;
       }
-      seen.add(overriddenMember);
-      // Keep looking up the chain.
-      overriddenMember = _getOverriddenMember(overriddenMember);
+      ExecutableElement member = ancestor.getMethod(name) ??
+          ancestor.getGetter(name) ??
+          ancestor.getSetter(name);
+      if (member is MethodElement && member.hasMustCallSuper) {
+        return member;
+      }
+      superclasses
+        ..addAll(ancestor.mixins.map((i) => i.element))
+        ..addAll(ancestor.superclassConstraints.map((i) => i.element))
+        ..add(ancestor.supertype?.element);
     }
     return null;
   }
@@ -6200,23 +6146,6 @@
     return buffer.toString();
   }
 
-  ExecutableElement _getOverriddenMember(Element member) {
-    ClassElement classElement = member.enclosingElement;
-    String name = member.name;
-    ClassElement superclass = classElement.supertype?.element;
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
-    while (superclass != null && visitedClasses.add(superclass)) {
-      ExecutableElement member = superclass.getMethod(name) ??
-          superclass.getGetter(name) ??
-          superclass.getSetter(name);
-      if (member != null) {
-        return member;
-      }
-      superclass = superclass.supertype?.element;
-    }
-    return null;
-  }
-
   /**
    * Return the type of the first and only parameter of the given [setter].
    */
@@ -6230,6 +6159,19 @@
     return setterParameters[0].type;
   }
 
+  /// Returns whether [node] overrides a concrete method.
+  bool _hasConcreteSuperMethod(MethodDeclaration node) {
+    ClassElement classElement = node.declaredElement.enclosingElement;
+    String name = node.declaredElement.name;
+
+    Queue<ClassElement> superclasses =
+        Queue.of(classElement.mixins.map((i) => i.element))
+          ..addAll(classElement.superclassConstraints.map((i) => i.element))
+          ..add(classElement.supertype?.element);
+    return superclasses.any(
+        (parent) => parent.lookUpConcreteMethod(name, parent.library) != null);
+  }
+
   /**
    * Return `true` if the given [constructor] redirects to itself, directly or
    * indirectly.
@@ -6261,6 +6203,9 @@
     if (element == null) {
       return false;
     }
+    if (element is GenericTypeAliasElementImpl && element.linkedNode != null) {
+      return element.hasSelfReference;
+    }
     var visitor = new _HasTypedefSelfReferenceVisitor(element.function);
     element.accept(visitor);
     return visitor.hasSelfReference;
@@ -6278,6 +6223,14 @@
     }
   }
 
+  bool _isDartCoreList(InterfaceType type) {
+    ClassElement element = type.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "List" && element.library.isDartCore;
+  }
+
   bool _isFunctionType(DartType type) {
     if (type.isDynamic || type.isDartCoreNull) {
       return true;
@@ -6291,6 +6244,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.
    */
@@ -6343,6 +6336,17 @@
     return false;
   }
 
+  /// Return the name of the [parameter], or `null` if the parameter does not
+  /// have a name.
+  SimpleIdentifier _parameterName(FormalParameter parameter) {
+    if (parameter is NormalFormalParameter) {
+      return parameter.identifier;
+    } else if (parameter is DefaultFormalParameter) {
+      return parameter.parameter.identifier;
+    }
+    return null;
+  }
+
   /// Determines if the given [typeName] occurs in a context where super-bounded
   /// types are allowed.
   bool _shouldAllowSuperBoundedTypes(TypeName typeName) {
@@ -6557,7 +6561,7 @@
       DartType type, ArgumentList argumentList, AstNode node) {
     if (type is FunctionType) {
       for (ParameterElement parameter in type.parameters) {
-        if (parameter.isNamed) {
+        if (parameter.isOptionalNamed) {
           ElementAnnotationImpl annotation = _getRequiredAnnotation(parameter);
           if (annotation != null) {
             String parameterName = parameter.name;
@@ -6572,7 +6576,11 @@
     }
   }
 
-  bool _containsNamedExpression(ArgumentList args, String name) {
+  ElementAnnotationImpl _getRequiredAnnotation(ParameterElement param) => param
+      .metadata
+      .firstWhere((ElementAnnotation e) => e.isRequired, orElse: () => null);
+
+  static bool _containsNamedExpression(ArgumentList args, String name) {
     NodeList<Expression> arguments = args.arguments;
     for (int i = arguments.length - 1; i >= 0; i--) {
       Expression expression = arguments[i];
@@ -6584,10 +6592,6 @@
     }
     return false;
   }
-
-  ElementAnnotationImpl _getRequiredAnnotation(ParameterElement param) => param
-      .metadata
-      .firstWhere((ElementAnnotation e) => e.isRequired, orElse: () => null);
 }
 
 class _HasTypedefSelfReferenceVisitor extends GeneralizingElementVisitor<void> {
diff --git a/analyzer/lib/src/generated/parser.dart b/analyzer/lib/src/generated/parser.dart
index cd39326..21a62ae 100644
--- a/analyzer/lib/src/generated/parser.dart
+++ b/analyzer/lib/src/generated/parser.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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.
 
@@ -7,6 +7,7 @@
 import 'dart:collection';
 import "dart:math" as math;
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -194,18 +195,37 @@
 
   bool allowNativeClause;
 
+  FeatureSet _featureSet;
+
   /// Initialize a newly created parser to parse tokens in the given [_source]
   /// and to report any errors that are found to the given [_errorListener].
+  ///
+  /// In a future major version release of the analyzer, the [featureSet]
+  /// argument will be required.
   factory Parser(Source source, AnalysisErrorListener errorListener,
-      {bool useFasta}) {
+      {bool useFasta, FeatureSet featureSet}) {
     if (useFasta ?? Parser.useFasta) {
-      return new _Parser2(source, errorListener, allowNativeClause: true);
+      var parser = new _Parser2(source, errorListener, allowNativeClause: true);
+      if (featureSet != null) {
+        parser.configureFeatures(featureSet);
+      }
+      return parser;
     } else {
-      return new Parser.withoutFasta(source, errorListener);
+      return new Parser.withoutFasta(source, errorListener,
+          featureSet: featureSet);
     }
   }
 
-  Parser.withoutFasta(this._source, this._errorListener);
+  /// Creates a parser using the old (legacy) analyzer parsing logic.
+  ///
+  /// In a future major version release of the analyzer, the [featureSet]
+  /// argument will be required.
+  Parser.withoutFasta(this._source, this._errorListener,
+      {FeatureSet featureSet}) {
+    if (featureSet != null) {
+      _configureFeatures(featureSet);
+    }
+  }
 
   /// Return the current token.
   Token get currentToken => _currentToken;
@@ -226,6 +246,7 @@
   void set enableAssertInitializer(bool enable) {}
 
   /// Enables or disables parsing of control flow collections.
+  @Deprecated('Pass a FeatureSet to the constructor instead')
   void set enableControlFlowCollections(bool value) {
     if (value) {
       throw new UnimplementedError('control_flow_collections experiment'
@@ -234,6 +255,7 @@
   }
 
   /// Enables or disables non-nullable by default.
+  @Deprecated('Pass a FeatureSet to the constructor instead')
   void set enableNonNullable(bool value) {
     if (value) {
       throw new UnimplementedError(
@@ -258,6 +280,7 @@
   }
 
   /// Enables or disables parsing of spread collections.
+  @Deprecated('Pass a FeatureSet to the constructor instead')
   void set enableSpreadCollections(bool value) {
     if (value) {
       throw new UnimplementedError(
@@ -265,6 +288,15 @@
     }
   }
 
+  /// Enables or disables parsing of the triple shift operators.
+  @Deprecated('Pass a FeatureSet to the constructor instead')
+  void set enableTripleShift(bool value) {
+    if (value) {
+      throw new UnimplementedError('triple_shift experiment'
+          ' not supported by analyzer parser');
+    }
+  }
+
   /// Return `true` if the parser is to allow URI's in part-of directives.
   @deprecated
   bool get enableUriInPartOf => true;
@@ -331,6 +363,12 @@
     return buffer.toString();
   }
 
+  /// Configures the parser appropriately for the given [featureSet].
+  @Deprecated('Pass a FeatureSet to the constructor instead')
+  void configureFeatures(FeatureSet featureSet) {
+    _configureFeatures(featureSet);
+  }
+
   /// Return a synthetic identifier.
   SimpleIdentifier createSyntheticIdentifier({bool isDeclaration: false}) {
     Token syntheticToken;
@@ -1612,7 +1650,8 @@
     try {
       BooleanErrorListener listener = new BooleanErrorListener();
       Scanner scanner = new Scanner(
-          null, new SubSequenceReader(referenceSource, sourceOffset), listener);
+          null, new SubSequenceReader(referenceSource, sourceOffset), listener)
+        ..configureFeatures(_featureSet);
       scanner.setSourceStart(1, 1);
       Token firstToken = scanner.tokenize();
       if (listener.errorReported) {
@@ -1898,7 +1937,8 @@
         } on _TooDeepTreeError {
           _reportErrorForToken(ParserErrorCode.STACK_OVERFLOW, _currentToken);
           Token eof = new Token.eof(0);
-          return astFactory.compilationUnit(eof, null, null, null, eof);
+          return astFactory.compilationUnit2(
+              beginToken: eof, endToken: eof, featureSet: _featureSet);
         }
         if (member != null) {
           declarations.add(member);
@@ -1947,8 +1987,13 @@
 //        }
       }
     }
-    return astFactory.compilationUnit(
-        firstToken, scriptTag, directives, declarations, _currentToken);
+    return astFactory.compilationUnit2(
+        beginToken: firstToken,
+        scriptTag: scriptTag,
+        directives: directives,
+        declarations: declarations,
+        endToken: _currentToken,
+        featureSet: _featureSet);
   }
 
   /// Parse a compilation unit member. The [commentAndMetadata] is the metadata
@@ -2398,12 +2443,20 @@
         while (!_matches(TokenType.EOF)) {
           _advance();
         }
-        return astFactory.compilationUnit(
-            firstToken, scriptTag, directives, null, _currentToken);
+        return astFactory.compilationUnit2(
+            beginToken: firstToken,
+            scriptTag: scriptTag,
+            directives: directives,
+            endToken: _currentToken,
+            featureSet: _featureSet);
       }
     }
-    return astFactory.compilationUnit(
-        firstToken, scriptTag, directives, null, _currentToken);
+    return astFactory.compilationUnit2(
+        beginToken: firstToken,
+        scriptTag: scriptTag,
+        directives: directives,
+        endToken: _currentToken,
+        featureSet: _featureSet);
   }
 
   /// Parse a documentation comment based on the given list of documentation
@@ -2962,7 +3015,7 @@
                 inKeyword: inKeyword,
                 iterable: iterator);
           }
-          return astFactory.forStatement2(
+          return astFactory.forStatement(
               forKeyword: forKeyword,
               leftParenthesis: leftParenthesis,
               forLoopParts: forLoopParts,
@@ -3002,7 +3055,7 @@
       }
       Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
       Statement body = parseStatement2();
-      return astFactory.forStatement2(
+      return astFactory.forStatement(
           forKeyword: forKeyword,
           leftParenthesis: leftParenthesis,
           forLoopParts: forLoopParts,
@@ -3679,9 +3732,11 @@
       Token modifier, TypeArgumentList typeArguments) {
     Token leftBracket = getAndAdvance();
     if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
-      // ignore: deprecated_member_use_from_same_package
-      return astFactory.mapLiteral(
-          modifier, typeArguments, leftBracket, null, getAndAdvance());
+      return astFactory.setOrMapLiteral(
+          constKeyword: modifier,
+          typeArguments: typeArguments,
+          leftBracket: leftBracket,
+          rightBracket: getAndAdvance());
     }
     bool wasInInitializer = _inInitializer;
     _inInitializer = false;
@@ -3689,16 +3744,22 @@
       List<MapLiteralEntry> entries = <MapLiteralEntry>[parseMapLiteralEntry()];
       while (_optional(TokenType.COMMA)) {
         if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
-          // ignore: deprecated_member_use_from_same_package
-          return astFactory.mapLiteral(
-              modifier, typeArguments, leftBracket, entries, getAndAdvance());
+          return astFactory.setOrMapLiteral(
+              constKeyword: modifier,
+              typeArguments: typeArguments,
+              leftBracket: leftBracket,
+              elements: entries,
+              rightBracket: getAndAdvance());
         }
         entries.add(parseMapLiteralEntry());
       }
       Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
-      // ignore: deprecated_member_use_from_same_package
-      return astFactory.mapLiteral(
-          modifier, typeArguments, leftBracket, entries, rightBracket);
+      return astFactory.setOrMapLiteral(
+          constKeyword: modifier,
+          typeArguments: typeArguments,
+          leftBracket: leftBracket,
+          elements: entries,
+          rightBracket: rightBracket);
     } finally {
       _inInitializer = wasInInitializer;
     }
@@ -4032,7 +4093,7 @@
         _tokenMatchesKeyword(_peek(), Keyword.FOR)) {
       Token awaitToken = _currentToken;
       Statement statement = parseForStatement();
-      if (!(statement is ForStatement2 && statement.forLoopParts is ForParts)) {
+      if (!(statement is ForStatement && statement.forLoopParts is ForParts)) {
         _reportErrorForToken(
             CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT, awaitToken);
       }
@@ -5535,6 +5596,26 @@
     return false;
   }
 
+  void _configureFeatures(FeatureSet featureSet) {
+    if (featureSet.isEnabled(Feature.control_flow_collections)) {
+      throw new UnimplementedError('control_flow_collections experiment'
+          ' not supported by analyzer parser');
+    }
+    if (featureSet.isEnabled(Feature.non_nullable)) {
+      throw new UnimplementedError(
+          'non-nullable experiment not supported by analyzer parser');
+    }
+    if (featureSet.isEnabled(Feature.spread_collections)) {
+      throw new UnimplementedError(
+          'spread_collections experiment not supported by analyzer parser');
+    }
+    if (featureSet.isEnabled(Feature.triple_shift)) {
+      throw new UnimplementedError('triple_shift experiment'
+          ' not supported by analyzer parser');
+    }
+    _featureSet = featureSet;
+  }
+
   /// Convert the given [method] declaration into the nearest valid top-level
   /// function declaration (that is, the function declaration that most closely
   /// captures the components of the given method declaration).
diff --git a/analyzer/lib/src/generated/parser_fasta.dart b/analyzer/lib/src/generated/parser_fasta.dart
index b93eb52..f7c72e0 100644
--- a/analyzer/lib/src/generated/parser_fasta.dart
+++ b/analyzer/lib/src/generated/parser_fasta.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -24,12 +24,15 @@
   final AstBuilder astBuilder;
 
   ParserAdapter(this.currentToken, ErrorReporter errorReporter, Uri fileUri,
-      {bool allowNativeClause: false})
+      {bool allowNativeClause: false, FeatureSet featureSet})
       : fastaParser = new fasta.Parser(null),
         astBuilder = new AstBuilder(errorReporter, fileUri, true) {
     fastaParser.listener = astBuilder;
     astBuilder.parser = fastaParser;
     astBuilder.allowNativeClause = allowNativeClause;
+    if (featureSet != null) {
+      astBuilder.configureFeatures(featureSet);
+    }
   }
 
   @override
@@ -37,6 +40,16 @@
     astBuilder.allowNativeClause = value;
   }
 
+  @override
+  void set enableControlFlowCollections(bool value) {
+    if (IsExpired.control_flow_collections &&
+        value != IsEnabledByDefault.control_flow_collections) {
+      throw new StateError('control_flow_collections may only be set'
+          ' to ${IsEnabledByDefault.control_flow_collections}');
+    }
+    astBuilder.enableControlFlowCollections = value;
+  }
+
   /// Enables or disables non-nullable by default.
   void set enableNonNullable(bool value) {
     if (IsExpired.non_nullable && value != IsEnabledByDefault.non_nullable) {
@@ -69,13 +82,12 @@
   }
 
   @override
-  void set enableControlFlowCollections(bool value) {
-    if (IsExpired.control_flow_collections &&
-        value != IsEnabledByDefault.control_flow_collections) {
-      throw new StateError('control_flow_collections may only be set'
-          ' to ${IsEnabledByDefault.control_flow_collections}');
+  void set enableTripleShift(bool value) {
+    if (IsExpired.triple_shift && value != IsEnabledByDefault.triple_shift) {
+      throw new StateError('triple_shift may only be set'
+          ' to ${IsEnabledByDefault.triple_shift}');
     }
-    astBuilder.enableControlFlowCollections = value;
+    astBuilder.enableTripleShift = value;
   }
 
   @override
@@ -99,6 +111,11 @@
   }
 
   @override
+  void configureFeatures(FeatureSet featureSet) {
+    astBuilder.configureFeatures(featureSet);
+  }
+
+  @override
   Expression parseAdditiveExpression() => parseExpression2();
 
   @override
diff --git a/analyzer/lib/src/generated/resolver.dart b/analyzer/lib/src/generated/resolver.dart
index 88fce5b..94b83c9 100644
--- a/analyzer/lib/src/generated/resolver.dart
+++ b/analyzer/lib/src/generated/resolver.dart
@@ -4,6 +4,7 @@
 
 import 'dart:collection';
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/ast_factory.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
@@ -26,6 +27,7 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/exit_detector.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
+import 'package:analyzer/src/diagnostic/diagnostic_factory.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/element_resolver.dart';
@@ -298,7 +300,9 @@
   BestPracticesVerifier(
     this._errorReporter,
     TypeProvider typeProvider,
-    this._currentLibrary, {
+    this._currentLibrary,
+    CompilationUnit unit,
+    String content, {
     TypeSystem typeSystem,
     ResourceProvider resourceProvider,
     DeclaredVariables declaredVariables,
@@ -317,7 +321,7 @@
     _workspacePackage = workspace.findPackageFor(libraryPath);
     _linterContext = LinterContextImpl(
         null /* allUnits */,
-        null /* currentUnit */,
+        new LinterContextUnit(content, unit),
         declaredVariables,
         typeProvider,
         _typeSystem,
@@ -743,15 +747,6 @@
       return false;
     }
 
-    bool isLibraryInWorkspacePackage(LibraryElement library) {
-      if (_workspacePackage == null || library == null) {
-        // Better to not make a big claim that they _are_ in the same package,
-        // if we were unable to determine what package [_currentLibrary] is in.
-        return false;
-      }
-      return _workspacePackage.contains(library.source.fullName);
-    }
-
     if (!_inDeprecatedMember &&
         element != null &&
         isDeprecated(element) &&
@@ -776,7 +771,7 @@
       }
       LibraryElement library =
           element is LibraryElement ? element : element.library;
-      HintCode hintCode = isLibraryInWorkspacePackage(library)
+      HintCode hintCode = _isLibraryInWorkspacePackage(library)
           ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
           : HintCode.DEPRECATED_MEMBER_USE;
       _errorReporter.reportErrorForNode(hintCode, node, [displayName]);
@@ -972,8 +967,7 @@
 
   void _checkForInvalidSealedSuperclass(NamedCompilationUnitMember node) {
     bool currentPackageContains(Element element) {
-      String elementLibraryPath = element.library.source.fullName;
-      return _workspacePackage.contains(elementLibraryPath);
+      return _isLibraryInWorkspacePackage(element.library);
     }
 
     // [NamedCompilationUnitMember.declaredElement] is not necessarily a
@@ -1278,6 +1272,15 @@
     }
   }
 
+  bool _isLibraryInWorkspacePackage(LibraryElement library) {
+    if (_workspacePackage == null || library == null) {
+      // Better to not make a big claim that they _are_ in the same package,
+      // if we were unable to determine what package [_currentLibrary] is in.
+      return false;
+    }
+    return _workspacePackage.contains(library.source);
+  }
+
   /// Check for the passed class declaration for the
   /// [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE] hint code.
   ///
@@ -1833,7 +1836,7 @@
   }
 
   void _checkForDeadNullCoalesce(TypeImpl lhsType, Expression rhs) {
-    if (lhsType.nullability == Nullability.nonNullable) {
+    if (_isNonNullableUnit && _typeSystem.isNonNullable(lhsType)) {
       _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, rhs, []);
     }
   }
@@ -3331,9 +3334,10 @@
       Source source,
       TypeProvider typeProvider,
       AnalysisErrorListener errorListener,
+      FeatureSet featureSet,
       {Scope nameScope})
       : super(inheritance, definingLibrary, source, typeProvider, errorListener,
-            nameScope: nameScope);
+            featureSet: featureSet, nameScope: nameScope);
 
   /// Resolve the instance fields in the given compilation unit [node].
   void resolveCompilationUnit(CompilationUnit node) {
@@ -3509,9 +3513,10 @@
       Source source,
       TypeProvider typeProvider,
       AnalysisErrorListener errorListener,
+      FeatureSet featureSet,
       {Scope nameScope})
       : super(inheritance, definingLibrary, source, typeProvider, errorListener,
-            nameScope: nameScope);
+            featureSet: featureSet, nameScope: nameScope);
 
   @override
   void visitBlockFunctionBody(BlockFunctionBody node) {
@@ -3622,10 +3627,6 @@
       const ResolverErrorCode('CONTINUE_LABEL_ON_SWITCH',
           "A continue label resolves to switch, must be loop or switch member");
 
-  static const ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART =
-      const ResolverErrorCode('MISSING_LIBRARY_DIRECTIVE_WITH_PART',
-          "Libraries that have parts must have a library directive");
-
   /// Parts: It is a static warning if the referenced part declaration
   /// <i>p</i> names a library that does not have a library tag.
   ///
@@ -3636,7 +3637,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.");
@@ -3665,6 +3666,8 @@
 
   final AnalysisOptionsImpl _analysisOptions;
 
+  final bool _uiAsCodeEnabled;
+
   /// The object used to resolve the element associated with the current node.
   ElementResolver elementResolver;
 
@@ -3722,16 +3725,45 @@
   /// the node that will first be visited.  If `null` or unspecified, a new
   /// [LibraryScope] will be created based on [definingLibrary] and
   /// [typeProvider].
+  ///
+  /// TODO(paulberry): make [featureSet] a required parameter (this will be a
+  /// breaking change).
   ResolverVisitor(
+      InheritanceManager2 inheritance,
+      LibraryElement definingLibrary,
+      Source source,
+      TypeProvider typeProvider,
+      AnalysisErrorListener errorListener,
+      {FeatureSet featureSet,
+      Scope nameScope,
+      bool propagateTypes: true,
+      reportConstEvaluationErrors: true})
+      : this._(
+            inheritance,
+            definingLibrary,
+            source,
+            typeProvider,
+            errorListener,
+            featureSet ??
+                definingLibrary.context.analysisOptions.contextFeatures,
+            nameScope,
+            propagateTypes,
+            reportConstEvaluationErrors);
+
+  ResolverVisitor._(
       this.inheritance,
       LibraryElement definingLibrary,
       Source source,
       TypeProvider typeProvider,
       AnalysisErrorListener errorListener,
-      {Scope nameScope,
-      bool propagateTypes: true,
-      reportConstEvaluationErrors: true})
+      FeatureSet featureSet,
+      Scope nameScope,
+      bool propagateTypes,
+      reportConstEvaluationErrors)
       : _analysisOptions = definingLibrary.context.analysisOptions,
+        _uiAsCodeEnabled =
+            featureSet.isEnabled(Feature.control_flow_collections) ||
+                featureSet.isEnabled(Feature.spread_collections),
         super(definingLibrary, source, typeProvider, errorListener,
             nameScope: nameScope) {
     this.elementResolver = new ElementResolver(this,
@@ -3855,6 +3887,17 @@
     // TODO(brianwilkerson) Remove this method.
   }
 
+  /// Set information about enclosing declarations.
+  void prepareEnclosingDeclarations({
+    ClassElement enclosingClassElement,
+    ExecutableElement enclosingExecutableElement,
+  }) {
+    _enclosingClassDeclaration = null;
+    enclosingClass = enclosingClassElement;
+    typeAnalyzer.thisType = enclosingClass?.type;
+    _enclosingFunction = enclosingExecutableElement;
+  }
+
   /// A client is about to resolve a member in the given class declaration.
   void prepareToResolveMembersInClass(ClassDeclaration node) {
     _enclosingClassDeclaration = node;
@@ -4377,7 +4420,7 @@
   }
 
   @override
-  void visitForStatement2InScope(ForStatement2 node) {
+  void visitForStatementInScope(ForStatement node) {
     ForLoopParts forLoopParts = node.forLoopParts;
     if (forLoopParts is ForParts) {
       if (forLoopParts is ForPartsWithDeclarations) {
@@ -4623,7 +4666,7 @@
       DartType elementType = listType.typeArguments[0];
       DartType iterableType =
           typeProvider.iterableType.instantiate([elementType]);
-      _pushCollectionTypesDownToAll(node.elements2,
+      _pushCollectionTypesDownToAll(node.elements,
           elementType: elementType, iterableType: iterableType);
       InferenceContext.setType(node, listType);
     } else {
@@ -4633,7 +4676,6 @@
   }
 
   @override
-  @override
   void visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     FunctionBody outerFunctionBody = _currentFunctionBody;
@@ -4798,31 +4840,19 @@
         DartType elementType = literalType.typeArguments[0];
         DartType iterableType =
             typeProvider.iterableType.instantiate([elementType]);
-        _pushCollectionTypesDownToAll(node.elements2,
+        _pushCollectionTypesDownToAll(node.elements,
             elementType: elementType, iterableType: iterableType);
-        if (!_analysisOptions.experimentStatus.spread_collections &&
-            !_analysisOptions.experimentStatus.control_flow_collections &&
-            node.elements2.isEmpty &&
+        if (!_uiAsCodeEnabled &&
+            node.elements.isEmpty &&
             node.typeArguments == null &&
             node.isMap) {
           // The node is really an empty set literal with no type arguments.
-          // Rewrite the AST.
-          // ignore: deprecated_member_use_from_same_package
-          SetOrMapLiteral setLiteral = new AstFactoryImpl().setLiteral(
-              node.constKeyword,
-              null,
-              node.leftBracket,
-              null,
-              node.rightBracket);
-          InferenceContext.setType(
-              setLiteral, InferenceContext.getContext(node));
-          NodeReplacer.replace(node, setLiteral);
-          node = setLiteral;
+          (node as SetOrMapLiteralImpl).becomeMap();
         }
       } else if (typeArguments.length == 2) {
         DartType keyType = typeArguments[0];
         DartType valueType = typeArguments[1];
-        _pushCollectionTypesDownToAll(node.elements2,
+        _pushCollectionTypesDownToAll(node.elements,
             iterableType: literalType, keyType: keyType, valueType: valueType);
       }
       (node as SetOrMapLiteralImpl).contextType = literalType;
@@ -4954,7 +4984,13 @@
         InterfaceType wrapperType = _enclosingFunction.isSynchronous
             ? typeProvider.iterableType
             : typeProvider.streamType;
-        type = typeSystem.mostSpecificTypeArgument(type, wrapperType);
+        if (type is InterfaceType) {
+          var asInstanceType =
+              (type as InterfaceTypeImpl).asInstanceOf(wrapperType.element);
+          if (asInstanceType != null) {
+            type = asInstanceType.typeArguments[0];
+          }
+        }
       }
       if (type != null) {
         inferenceContext.addReturnOrYieldType(type);
@@ -5029,7 +5065,7 @@
         _fromTypeArguments(literal.typeArguments);
     DartType contextType = InferenceContext.getContext(literal);
     _LiteralResolution contextResolution = _fromContextType(contextType);
-    _LeafElements elementCounts = new _LeafElements(literal.elements2);
+    _LeafElements elementCounts = new _LeafElements(literal.elements);
     _LiteralResolution elementResolution = elementCounts.resolution;
 
     List<_LiteralResolution> unambiguousResolutions = [];
@@ -5070,7 +5106,7 @@
           : unambiguousResolutions[0];
     } else if (unambiguousResolutions.length == 1) {
       return unambiguousResolutions[0];
-    } else if (literal.elements2.isEmpty) {
+    } else if (literal.elements.isEmpty) {
       return _LiteralResolution(
           _LiteralResolutionKind.map,
           typeProvider.mapType.instantiate(
@@ -5163,7 +5199,7 @@
 
   FunctionType _inferArgumentTypesForGeneric(AstNode inferenceNode,
       DartType uninstantiatedType, TypeArgumentList typeArguments,
-      {AstNode errorNode}) {
+      {AstNode errorNode, bool isConst: false}) {
     errorNode ??= inferenceNode;
     TypeSystem ts = typeSystem;
     if (typeArguments == null &&
@@ -5176,6 +5212,7 @@
           const <DartType>[],
           InferenceContext.getContext(inferenceNode),
           downwards: true,
+          isConst: isConst,
           errorReporter: errorReporter,
           errorNode: errorNode);
     }
@@ -5217,7 +5254,7 @@
 
       inferred = _inferArgumentTypesForGeneric(
           node, constructorType, constructor.type.typeArguments,
-          errorNode: node.constructorName);
+          isConst: node.isConst, errorNode: node.constructorName);
 
       if (inferred != null) {
         ArgumentList arguments = node.argumentList;
@@ -5427,7 +5464,7 @@
     int length = parameters.length;
     for (int i = 0; i < length; i++) {
       ParameterElement parameter = parameters[i];
-      if (parameter.isNotOptional) {
+      if (parameter.isRequiredPositional) {
         unnamedParameters.add(parameter);
         unnamedParameterCount++;
         requiredParameterCount++;
@@ -5835,13 +5872,13 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement(ForStatement node) {
     Scope outerNameScope = nameScope;
     ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
     try {
       nameScope = new EnclosedScope(nameScope);
       _implicitLabelScope = _implicitLabelScope.nest(node);
-      visitForStatement2InScope(node);
+      visitForStatementInScope(node);
     } finally {
       nameScope = outerNameScope;
       _implicitLabelScope = outerImplicitScope;
@@ -5851,7 +5888,7 @@
   /// Visit the given [node] after it's scope has been created. This replaces
   /// the normal call to the inherited visit method so that ResolverVisitor can
   /// intervene when type propagation is enabled.
-  void visitForStatement2InScope(ForStatement2 node) {
+  void visitForStatementInScope(ForStatement node) {
     // TODO(brianwilkerson) Investigate the possibility of removing the
     //  visit...InScope methods now that type propagation is no longer done.
     node.forLoopParts?.accept(this);
@@ -5946,8 +5983,7 @@
             new CaughtException(new AnalysisException(), null));
       } else {
         nameScope = new EnclosedScope(nameScope);
-        GenericFunctionTypeElement typeElement = parameterElement.type.element;
-        List<TypeParameterElement> typeParameters = typeElement.typeParameters;
+        var typeParameters = parameterElement.typeParameters;
         int length = typeParameters.length;
         for (int i = 0; i < length; i++) {
           nameScope.define(typeParameters[i]);
@@ -6254,7 +6290,6 @@
 class TypeNameResolver {
   final TypeSystem typeSystem;
   final DartType dynamicType;
-  final DartType undefinedType;
   final bool isNonNullableUnit;
   final AnalysisOptionsImpl analysisOptions;
   final LibraryElement definingLibrary;
@@ -6279,7 +6314,6 @@
       this.errorListener,
       {this.shouldUseWithClauseInferredTypes: true})
       : dynamicType = typeProvider.dynamicType,
-        undefinedType = typeProvider.undefinedType,
         analysisOptions = definingLibrary.context.analysisOptions;
 
   /// Report an error with the given error code and arguments.
@@ -6321,8 +6355,8 @@
         return;
       }
       if (nameScope.shouldIgnoreUndefined(typeName)) {
-        typeName.staticType = undefinedType;
-        node.type = undefinedType;
+        typeName.staticType = dynamicType;
+        node.type = dynamicType;
         return;
       }
       //
@@ -6342,8 +6376,8 @@
           element = nameScope.lookup(prefix, definingLibrary);
           if (element is PrefixElement) {
             if (nameScope.shouldIgnoreUndefined(typeName)) {
-              typeName.staticType = undefinedType;
-              node.type = undefinedType;
+              typeName.staticType = dynamicType;
+              node.type = dynamicType;
               return;
             }
             AstNode grandParent = parent.parent;
@@ -6381,8 +6415,8 @@
         }
       }
       if (nameScope.shouldIgnoreUndefined(typeName)) {
-        typeName.staticType = undefinedType;
-        node.type = undefinedType;
+        typeName.staticType = dynamicType;
+        node.type = dynamicType;
         return;
       }
     }
@@ -6499,8 +6533,8 @@
       if (element is MultiplyDefinedElement) {
         _setElement(typeName, element);
       }
-      typeName.staticType = undefinedType;
-      node.type = undefinedType;
+      typeName.staticType = dynamicType;
+      node.type = dynamicType;
       return;
     }
 
@@ -6513,6 +6547,9 @@
     if (element == DynamicElementImpl.instance) {
       _setElement(typeName, element);
       type = DynamicTypeImpl.instance;
+    } else if (element is NeverElementImpl) {
+      _setElement(typeName, element);
+      type = element.type;
     } else if (element is FunctionTypeAliasElement) {
       _setElement(typeName, element);
       type = element.type as TypeImpl;
@@ -6558,8 +6595,8 @@
         } else if (element is LocalVariableElement ||
             (element is FunctionElement &&
                 element.enclosingElement is ExecutableElement)) {
-          reportErrorForNode(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION,
-              typeName, [typeName.name]);
+          errorListener.onError(new DiagnosticFactory()
+              .referencedBeforeDeclaration(source, typeName, element: element));
         } else {
           reportErrorForNode(
               StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]);
@@ -6638,16 +6675,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;
   }
@@ -6673,7 +6710,7 @@
   DartType _getType(TypeAnnotation annotation) {
     DartType type = annotation.type;
     if (type == null) {
-      return undefinedType;
+      return dynamicType;
     }
     return type;
   }
@@ -6791,6 +6828,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);
@@ -6830,19 +6886,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) {
@@ -7168,6 +7227,9 @@
   /// Return the type representing the built-in type 'Map'.
   InterfaceType get mapType;
 
+  /// Return the type representing the built-in type 'Never'.
+  DartType get neverType;
+
   /// Return a list containing all of the types that cannot be either extended
   /// or implemented.
   List<InterfaceType> get nonSubtypableTypes;
@@ -7205,9 +7267,6 @@
   /// Return the type representing the built-in type 'Type'.
   InterfaceType get typeType;
 
-  /// Return the type representing typenames that can't be resolved.
-  DartType get undefinedType;
-
   /// Return 'true' if [id] is the name of a getter on
   /// the Object type.
   bool isObjectGetter(String id);
@@ -7226,11 +7285,11 @@
 abstract class TypeProviderBase implements TypeProvider {
   @override
   List<InterfaceType> get nonSubtypableTypes => <InterfaceType>[
+        boolType,
+        doubleType,
+        intType,
         nullType,
         numType,
-        intType,
-        doubleType,
-        boolType,
         stringType
       ];
 
@@ -7259,18 +7318,12 @@
   /// The type representing the built-in type 'bool'.
   InterfaceType _boolType;
 
-  /// The type representing the type 'bottom'.
-  DartType _bottomType;
-
   /// The type representing the built-in type 'double'.
   InterfaceType _doubleType;
 
   /// The type representing the built-in type 'Deprecated'.
   InterfaceType _deprecatedType;
 
-  /// The type representing the built-in type 'dynamic'.
-  DartType _dynamicType;
-
   /// The type representing the built-in type 'Function'.
   InterfaceType _functionType;
 
@@ -7313,9 +7366,6 @@
   /// An shared object representing the value 'null'.
   DartObjectImpl _nullObject;
 
-  /// The type representing the type 'Set'.
-  InterfaceType _setType;
-
   /// The type representing the type 'Null'.
   InterfaceType _nullType;
 
@@ -7325,6 +7375,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;
 
@@ -7343,31 +7396,17 @@
   /// The type representing the built-in type 'Type'.
   InterfaceType _typeType;
 
-  /// The type representing typenames that can't be resolved.
-  DartType _undefinedType;
-
   /// 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
   InterfaceType get boolType => _boolType;
 
   @override
-  DartType get bottomType => _bottomType;
+  DartType get bottomType => BottomTypeImpl.instance;
 
   @override
   InterfaceType get deprecatedType => _deprecatedType;
@@ -7376,7 +7415,7 @@
   InterfaceType get doubleType => _doubleType;
 
   @override
-  DartType get dynamicType => _dynamicType;
+  DartType get dynamicType => DynamicTypeImpl.instance;
 
   @override
   InterfaceType get functionType => _functionType;
@@ -7418,6 +7457,9 @@
   InterfaceType get mapType => _mapType;
 
   @override
+  DartType get neverType => BottomTypeImpl.instance;
+
+  @override
   DartObjectImpl get nullObject {
     if (_nullObject == null) {
       _nullObject = new DartObjectImpl(nullType, NullState.NULL_STATE);
@@ -7455,15 +7497,8 @@
   @override
   InterfaceType get typeType => _typeType;
 
-  @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
+  /// 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) {
@@ -7476,36 +7511,39 @@
 
   /// Initialize the types provided by this type provider from the given
   /// [Namespace]s.
-  void _initializeFrom(Namespace coreNamespace, Namespace asyncNamespace) {
-    _boolType = _getType(coreNamespace, "bool");
-    _bottomType = BottomTypeImpl.instance;
-    _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");
-    _undefinedType = UndefinedTypeImpl.instance;
-    _futureDynamicType = _futureType.instantiate(<DartType>[_dynamicType]);
+  void _initializeFrom(
+      LibraryElement coreLibrary, LibraryElement asyncLibrary) {
+    Namespace coreNamespace =
+        new NamespaceBuilder().createPublicNamespaceForLibrary(coreLibrary);
+    Namespace asyncNamespace =
+        new NamespaceBuilder().createPublicNamespaceForLibrary(asyncLibrary);
+
+    _boolType = _getType(coreNamespace, 'bool');
+    _deprecatedType = _getType(coreNamespace, 'Deprecated');
+    _doubleType = _getType(coreNamespace, 'double');
+    _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');
+    _futureDynamicType = _futureType.instantiate(<DartType>[dynamicType]);
     _futureNullType = _futureType.instantiate(<DartType>[_nullType]);
-    _iterableDynamicType = _iterableType.instantiate(<DartType>[_dynamicType]);
+    _iterableDynamicType = _iterableType.instantiate(<DartType>[dynamicType]);
     _iterableObjectType = _iterableType.instantiate(<DartType>[_objectType]);
     _mapObjectObjectType =
         _mapType.instantiate(<DartType>[_objectType, _objectType]);
-    _streamDynamicType = _streamType.instantiate(<DartType>[_dynamicType]);
+    _streamDynamicType = _streamType.instantiate(<DartType>[dynamicType]);
     // FutureOr<T> is still fairly new, so if we're analyzing an SDK that
     // doesn't have it yet, create an element for it.
     _futureOrType ??= createPlaceholderFutureOr(_futureType, _objectType);
@@ -7517,6 +7555,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']);
@@ -7550,9 +7590,6 @@
   /// The type representing the type 'dynamic'.
   DartType _dynamicType;
 
-  /// The type representing typenames that can't be resolved.
-  DartType _undefinedType;
-
   /// The flag specifying if currently visited class references 'super'
   /// expression.
   bool _hasReferenceToSuper = false;
@@ -7608,7 +7645,6 @@
       : super(definingLibrary, source, typeProvider, errorListener,
             nameScope: nameScope) {
     _dynamicType = typeProvider.dynamicType;
-    _undefinedType = typeProvider.undefinedType;
     _typeSystem = TypeSystem.create(definingLibrary.context);
     _typeNameResolver = new TypeNameResolver(_typeSystem, typeProvider,
         isNonNullableUnit, definingLibrary, source, errorListener,
@@ -8278,7 +8314,10 @@
       TypeAnnotation returnType, FormalParameterList parameterList) {
     DartType type = parameter.type;
     GenericFunctionTypeElementImpl typeElement = type.element;
-    typeElement.returnType = _computeReturnType(returnType);
+    // With summary2 we use synthetic FunctionType(s).
+    if (typeElement != null) {
+      typeElement.returnType = _computeReturnType(returnType);
+    }
   }
 }
 
@@ -8545,8 +8584,9 @@
   /// created based on [definingLibrary] and [typeProvider].
   VariableResolverVisitor(LibraryElement definingLibrary, Source source,
       TypeProvider typeProvider, AnalysisErrorListener errorListener,
-      {Scope nameScope})
-      : super(definingLibrary, source, typeProvider, errorListener,
+      {Scope nameScope, LocalVariableInfo localVariableInfo})
+      : _localVariableInfo = localVariableInfo,
+        super(definingLibrary, source, typeProvider, errorListener,
             nameScope: nameScope);
 
   @override
diff --git a/analyzer/lib/src/generated/scanner.dart b/analyzer/lib/src/generated/scanner.dart
index 3b21b2f..e1d6904 100644
--- a/analyzer/lib/src/generated/scanner.dart
+++ b/analyzer/lib/src/generated/scanner.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/src/generated/sdk_io.dart b/analyzer/lib/src/generated/sdk_io.dart
index cbdb6fe..86ef733 100644
--- a/analyzer/lib/src/generated/sdk_io.dart
+++ b/analyzer/lib/src/generated/sdk_io.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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.
 
@@ -7,6 +7,7 @@
 
 import 'dart:collection';
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/context/context.dart';
@@ -277,9 +278,13 @@
    */
   LibraryMap readFromSource(Source source, String libraryFileContents) {
     BooleanErrorListener errorListener = new BooleanErrorListener();
+    // TODO(paulberry): initialize the feature set appropriately based on the
+    // version of the SDK we are reading, and enable flags.
+    var featureSet = FeatureSet.fromEnableFlags([]);
     Scanner scanner = new Scanner(
-        source, new CharSequenceReader(libraryFileContents), errorListener);
-    Parser parser = new Parser(source, errorListener);
+        source, new CharSequenceReader(libraryFileContents), errorListener)
+      ..configureFeatures(featureSet);
+    Parser parser = new Parser(source, errorListener, featureSet: featureSet);
     CompilationUnit unit = parser.parseCompilationUnit(scanner.tokenize());
     SdkLibrariesReader_LibraryBuilder libraryBuilder =
         new SdkLibrariesReader_LibraryBuilder(_useDart2jsPaths);
diff --git a/analyzer/lib/src/generated/source.dart b/analyzer/lib/src/generated/source.dart
index f2d604f..1152e24 100644
--- a/analyzer/lib/src/generated/source.dart
+++ b/analyzer/lib/src/generated/source.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/src/generated/static_type_analyzer.dart b/analyzer/lib/src/generated/static_type_analyzer.dart
index 377affe..eb5a7a8 100644
--- a/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -10,10 +10,12 @@
 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/analysis/driver.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' show ConstructorMember;
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -123,9 +125,9 @@
       List<ParameterElement> parameters = node.parameterElements;
       {
         Iterator<ParameterElement> positional =
-            parameters.where((p) => !p.isNamed).iterator;
+            parameters.where((p) => p.isPositional).iterator;
         Iterator<ParameterElement> fnPositional =
-            functionType.parameters.where((p) => !p.isNamed).iterator;
+            functionType.parameters.where((p) => p.isPositional).iterator;
         while (positional.moveNext() && fnPositional.moveNext()) {
           inferType(positional.current, fnPositional.current.type);
         }
@@ -161,7 +163,7 @@
       parameters = [];
     } else {
       // Also use upwards information to infer the type.
-      elementTypes = node.elements2
+      elementTypes = node.elements
           .map((element) => _computeElementType(element))
           .where((t) => t != null)
           .toList();
@@ -175,6 +177,7 @@
     InterfaceType inferred = ts.inferGenericFunctionOrType<InterfaceType>(
         _typeProvider.listType, parameters, elementTypes, contextType,
         downwards: downwards,
+        isConst: node.isConst,
         errorReporter: _resolver.errorReporter,
         errorNode: node);
     return inferred;
@@ -190,6 +193,7 @@
     ParameterizedType inferred = ts.inferGenericFunctionOrType(
         _typeProvider.mapType, [], [], contextType,
         downwards: true,
+        isConst: node.isConst,
         errorReporter: _resolver.errorReporter,
         errorNode: node);
     return inferred;
@@ -204,6 +208,7 @@
     DartType inferred = ts.inferGenericFunctionOrType<InterfaceType>(
         _typeProvider.setType, [], [], contextType,
         downwards: true,
+        isConst: node.isConst,
         errorReporter: _resolver.errorReporter,
         errorNode: node);
     return inferred;
@@ -723,13 +728,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);
@@ -1467,7 +1478,7 @@
       Expression iterable;
       if (parent is ForEachPartsWithDeclaration) {
         AstNode parentParent = parent.parent;
-        if (parentParent is ForStatement2Impl) {
+        if (parentParent is ForStatementImpl) {
           awaitKeyword = parentParent.awaitKeyword;
         } else if (parentParent is ForElement) {
           awaitKeyword = parentParent.awaitKeyword;
@@ -1519,8 +1530,7 @@
   void _inferGenericInvocationExpression(InvocationExpression node) {
     ArgumentList arguments = node.argumentList;
     var type = node.function.staticType;
-    var freshType =
-        type is FunctionType ? new FunctionTypeImpl.fresh(type) : type;
+    var freshType = _getFreshType(type);
 
     FunctionType inferred = _inferGenericInvoke(
         node, freshType, node.typeArguments, arguments, node.function);
@@ -1546,7 +1556,8 @@
       DartType fnType,
       TypeArgumentList typeArguments,
       ArgumentList argumentList,
-      AstNode errorNode) {
+      AstNode errorNode,
+      {bool isConst: false}) {
     TypeSystem ts = _typeSystem;
     if (typeArguments == null &&
         fnType is FunctionType &&
@@ -1568,7 +1579,9 @@
       }
       return ts.inferGenericFunctionOrType(
           fnType, params, argTypes, InferenceContext.getContext(node),
-          errorReporter: _resolver.errorReporter, errorNode: errorNode);
+          isConst: isConst,
+          errorReporter: _resolver.errorReporter,
+          errorNode: errorNode);
     }
     return null;
   }
@@ -1606,7 +1619,8 @@
 
     ArgumentList arguments = node.argumentList;
     FunctionType inferred = _inferGenericInvoke(node, constructorType,
-        constructor.type.typeArguments, arguments, node.constructorName);
+        constructor.type.typeArguments, arguments, node.constructorName,
+        isConst: node.isConst);
 
     if (inferred != null && inferred != originalElement.type) {
       // Fix up the parameter elements based on inferred method.
@@ -1780,7 +1794,7 @@
     var literalImpl = literal as SetOrMapLiteralImpl;
     DartType contextType = literalImpl.contextType;
     literalImpl.contextType = null; // Not needed anymore.
-    NodeList<CollectionElement> elements = literal.elements2;
+    NodeList<CollectionElement> elements = literal.elements;
     List<_InferredCollectionElementTypeInformation> inferredTypes = [];
     bool canBeAMap = true;
     bool mustBeAMap = false;
@@ -1888,7 +1902,9 @@
       ..addAll(valueTypes);
     return (_typeSystem as Dart2TypeSystem).inferGenericFunctionOrType(
         _typeProvider.mapType, typeParameters, elementTypes, contextType,
-        errorReporter: _resolver.errorReporter, errorNode: node);
+        isConst: node.isConst,
+        errorReporter: _resolver.errorReporter,
+        errorNode: node);
   }
 
   DartType _toSetType(SetOrMapLiteral node, DartType contextType,
@@ -1908,7 +1924,9 @@
         growable: true);
     return (_typeSystem as Dart2TypeSystem).inferGenericFunctionOrType(
         _typeProvider.setType, parameters, elementTypes, contextType,
-        errorReporter: _resolver.errorReporter, errorNode: node);
+        isConst: node.isConst,
+        errorReporter: _resolver.errorReporter,
+        errorNode: node);
   }
 
   /**
@@ -1945,6 +1963,19 @@
     function.type = new FunctionTypeImpl(function);
     return new FunctionTypeImpl.fresh(function.type);
   }
+
+  static DartType _getFreshType(DartType type) {
+    if (type is FunctionType) {
+      if (AnalysisDriver.useSummary2) {
+        var parameters = getFreshTypeParameters(type.typeFormals);
+        return parameters.applyToFunctionType(type);
+      } else {
+        return new FunctionTypeImpl.fresh(type);
+      }
+    } else {
+      return type;
+    }
+  }
 }
 
 class _InferredCollectionElementTypeInformation {
diff --git a/analyzer/lib/src/generated/testing/ast_test_factory.dart b/analyzer/lib/src/generated/testing/ast_test_factory.dart
index a2e6994..ab12e27 100644
--- a/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -275,14 +275,16 @@
           String scriptTag,
           List<Directive> directives,
           List<CompilationUnitMember> declarations) =>
-      astFactory.compilationUnit(
-          TokenFactory.tokenFromType(TokenType.EOF),
-          scriptTag == null ? null : AstTestFactory.scriptTag(scriptTag),
-          directives == null ? new List<Directive>() : directives,
-          declarations == null
+      astFactory.compilationUnit2(
+          beginToken: TokenFactory.tokenFromType(TokenType.EOF),
+          scriptTag:
+              scriptTag == null ? null : AstTestFactory.scriptTag(scriptTag),
+          directives: directives == null ? new List<Directive>() : directives,
+          declarations: declarations == null
               ? new List<CompilationUnitMember>()
               : declarations,
-          TokenFactory.tokenFromType(TokenType.EOF));
+          endToken: TokenFactory.tokenFromType(TokenType.EOF),
+          featureSet: null);
 
   static ConditionalExpression conditionalExpression(Expression condition,
           Expression thenExpression, Expression elseExpression) =>
@@ -494,29 +496,29 @@
   static FieldFormalParameter fieldFormalParameter2(String identifier) =>
       fieldFormalParameter(null, null, identifier);
 
-  @Deprecated('Use forStatement2')
-  static ForStatement2 forEachStatement(DeclaredIdentifier loopVariable,
-          Expression iterator, Statement body) =>
-      astFactory.forStatement2(
-          forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
-          leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-          forLoopParts: astFactory.forEachPartsWithDeclaration(
-              loopVariable: loopVariable,
-              inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
-              iterable: iterator),
-          rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
-          body: body);
+  static ForEachPartsWithDeclaration forEachPartsWithDeclaration(
+          DeclaredIdentifier loopVariable, Expression iterable) =>
+      astFactory.forEachPartsWithDeclaration(
+          loopVariable: loopVariable,
+          inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
+          iterable: iterable);
 
-  @Deprecated('Use forStatement2')
-  static ForStatement2 forEachStatement2(
-          SimpleIdentifier identifier, Expression iterator, Statement body) =>
-      astFactory.forStatement2(
+  static ForEachPartsWithIdentifier forEachPartsWithIdentifier(
+          SimpleIdentifier identifier, Expression iterable) =>
+      astFactory.forEachPartsWithIdentifier(
+          identifier: identifier,
+          inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
+          iterable: iterable);
+
+  static ForElement forElement(
+          ForLoopParts forLoopParts, CollectionElement body,
+          {bool hasAwait: false}) =>
+      astFactory.forElement(
+          awaitKeyword:
+              hasAwait ? TokenFactory.tokenFromKeyword(Keyword.AWAIT) : null,
           forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
           leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-          forLoopParts: astFactory.forEachPartsWithIdentifier(
-              identifier: identifier,
-              inKeyword: TokenFactory.tokenFromKeyword(Keyword.IN),
-              iterable: iterator),
+          forLoopParts: forLoopParts,
           rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
           body: body);
 
@@ -529,32 +531,33 @@
           null,
           TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
 
-  @Deprecated('Use forStatement2')
-  static ForStatement2 forStatement(Expression initialization,
-          Expression condition, List<Expression> updaters, Statement body) =>
-      astFactory.forStatement2(
-          forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
-          leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-          forLoopParts: astFactory.forPartsWithExpression(
-              initialization: initialization,
-              leftSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
-              condition: condition,
-              rightSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
-              updaters: updaters),
-          rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
-          body: body);
+  static ForPartsWithDeclarations forPartsWithDeclarations(
+          VariableDeclarationList variables,
+          Expression condition,
+          List<Expression> updaters) =>
+      astFactory.forPartsWithDeclarations(
+          variables: variables,
+          leftSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+          condition: condition,
+          rightSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+          updaters: updaters);
 
-  static ForStatement2 forStatement2(VariableDeclarationList variableList,
-          Expression condition, List<Expression> updaters, Statement body) =>
-      astFactory.forStatement2(
+  static ForPartsWithExpression forPartsWithExpression(
+          Expression initialization,
+          Expression condition,
+          List<Expression> updaters) =>
+      astFactory.forPartsWithExpression(
+          initialization: initialization,
+          leftSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+          condition: condition,
+          rightSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+          updaters: updaters);
+
+  static ForStatement forStatement(ForLoopParts forLoopParts, Statement body) =>
+      astFactory.forStatement(
           forKeyword: TokenFactory.tokenFromKeyword(Keyword.FOR),
           leftParenthesis: TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-          forLoopParts: astFactory.forPartsWithDeclarations(
-              variables: variableList,
-              leftSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
-              condition: condition,
-              rightSeparator: TokenFactory.tokenFromType(TokenType.SEMICOLON),
-              updaters: updaters),
+          forLoopParts: forLoopParts,
           rightParenthesis: TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
           body: body);
 
@@ -839,21 +842,6 @@
           elements,
           TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
 
-  @Deprecated('Use setOrMapLiteral')
-  static SetOrMapLiteral mapLiteral(
-          Keyword keyword, TypeArgumentList typeArguments,
-          [List<MapLiteralEntry> entries]) =>
-      astFactory.mapLiteral(
-          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
-          typeArguments,
-          TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
-          entries,
-          TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
-
-  @Deprecated('Use setOrMapLiteral')
-  static SetOrMapLiteral mapLiteral2([List<MapLiteralEntry> entries]) =>
-      mapLiteral(null, null, entries);
-
   static MapLiteralEntry mapLiteralEntry(String key, Expression value) =>
       astFactory.mapLiteralEntry(
           string2(key), TokenFactory.tokenFromType(TokenType.COLON), value);
@@ -1093,16 +1081,6 @@
   static ScriptTag scriptTag(String scriptTag) =>
       astFactory.scriptTag(TokenFactory.tokenFromString(scriptTag));
 
-  @Deprecated('Use setOrMapLiteral')
-  static SetOrMapLiteral setLiteral(Keyword keyword,
-          TypeArgumentList typeArguments, List<Expression> elements) =>
-      astFactory.setLiteral(
-          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
-          typeArguments,
-          TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
-          elements,
-          TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
-
   static SetOrMapLiteral setOrMapLiteral(
           Keyword keyword, TypeArgumentList typeArguments,
           [List<CollectionElement> elements]) =>
diff --git a/analyzer/lib/src/generated/testing/test_type_provider.dart b/analyzer/lib/src/generated/testing/test_type_provider.dart
index 30b176b..da58fd1 100644
--- a/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/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;
@@ -174,11 +179,6 @@
   InterfaceType _typeType;
 
   /**
-   * The type representing type names that can't be resolved.
-   */
-  DartType _undefinedType;
-
-  /**
    * The analysis context, if any. Used to create an appropriate 'dart:async'
    * library to back `Future<T>`.
    */
@@ -442,6 +442,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);
@@ -597,21 +607,15 @@
     return _typeType;
   }
 
-  @override
-  DartType get undefinedType {
-    if (_undefinedType == null) {
-      _undefinedType = UndefinedTypeImpl.instance;
-    }
-    return _undefinedType;
-  }
-
   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/analyzer/lib/src/generated/timestamped_data.dart b/analyzer/lib/src/generated/timestamped_data.dart
index 18e6323..7084cbd 100644
--- a/analyzer/lib/src/generated/timestamped_data.dart
+++ b/analyzer/lib/src/generated/timestamped_data.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/generated/type_system.dart b/analyzer/lib/src/generated/type_system.dart
index 6e978a6..f1ed12b 100644
--- a/analyzer/lib/src/generated/type_system.dart
+++ b/analyzer/lib/src/generated/type_system.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_system.dart' as public;
 import 'package:analyzer/error/listener.dart' show ErrorReporter;
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart' show TypeParameterMember;
 import 'package:analyzer/src/dart/element/type.dart';
@@ -225,7 +226,8 @@
       DartType returnContextType,
       {ErrorReporter errorReporter,
       AstNode errorNode,
-      bool downwards: false}) {
+      bool downwards: false,
+      bool isConst: false}) {
     // TODO(jmesserly): expose typeFormals on ParameterizedType.
     List<TypeParameterElement> typeFormals = typeFormalsAsElements(genericType);
     if (typeFormals.isEmpty) {
@@ -242,6 +244,9 @@
         genericType is FunctionType ? genericType.returnType : genericType;
 
     if (returnContextType != null) {
+      if (isConst) {
+        returnContextType = _eliminateTypeVariables(returnContextType);
+      }
       inferrer.constrainReturnType(declaredReturnType, returnContextType);
     }
 
@@ -319,6 +324,9 @@
       Set<DartType> visitedTypes = new HashSet<DartType>();
 
       void appendParameters(DartType type) {
+        if (type == null) {
+          return;
+        }
         if (visitedTypes.contains(type)) {
           return;
         }
@@ -326,6 +334,13 @@
         if (type is TypeParameterType && all.contains(type)) {
           parameters ??= <TypeParameterType>[];
           parameters.add(type);
+        } else if (AnalysisDriver.useSummary2) {
+          if (type is FunctionType) {
+            appendParameters(type.returnType);
+            type.parameters.map((p) => p.type).forEach(appendParameters);
+          } else if (type is InterfaceType) {
+            type.typeArguments.forEach(appendParameters);
+          }
         } else if (type is ParameterizedType) {
           type.typeArguments.forEach(appendParameters);
         }
@@ -652,6 +667,30 @@
   }
 
   /**
+   * Eliminates type variables from the context [type], replacing them with
+   * `Null` or `Object` as appropriate.
+   *
+   * For example in `List<T> list = const []`, the context type for inferring
+   * the list should be changed from `List<T>` to `List<Null>` so the constant
+   * doesn't depend on the type variables `T` (because it can't be canonicalized
+   * at compile time, as `T` is unknown).
+   *
+   * Conceptually this is similar to the "least closure", except instead of
+   * eliminating `?` ([UnknownInferredType]) it eliminates all type variables
+   * ([TypeParameterType]).
+   *
+   * The equivalent CFE code can be found in the `TypeVariableEliminator` class.
+   */
+  DartType _eliminateTypeVariables(DartType type) {
+    return _substituteType(type, true, (type, lowerBound) {
+      if (type is TypeParameterType) {
+        return lowerBound ? typeProvider.nullType : typeProvider.objectType;
+      }
+      return type;
+    });
+  }
+
+  /**
    * Compute the greatest lower bound of function types [f] and [g].
    *
    * The spec rules for GLB on function types, informally, are pretty simple:
@@ -743,6 +782,8 @@
     }
 
     // Union the named parameters together.
+    // TODO(brianwilkerson) Handle the fact that named parameters can now be
+    //  required.
     Map<String, DartType> fNamed = f.namedParameterTypes;
     Map<String, DartType> gNamed = g.namedParameterTypes;
     for (String name in fNamed.keys.toSet()..addAll(gNamed.keys)) {
@@ -891,22 +932,46 @@
     return false;
   }
 
+  /**
+   * Returns the greatest or least closure of [type], which replaces `?`
+   * ([UnknownInferredType]) with `dynamic` or `Null` as appropriate.
+   *
+   * If [lowerBound] is true, this will return the "least closure", otherwise
+   * it returns the "greatest closure".
+   */
   DartType _substituteForUnknownType(DartType type, {bool lowerBound: false}) {
-    if (identical(type, UnknownInferredType.instance)) {
-      if (lowerBound) {
-        // TODO(jmesserly): this should be the bottom type, once it can be
-        // reified.
-        return typeProvider.nullType;
+    return _substituteType(type, lowerBound, (type, lowerBound) {
+      if (identical(type, UnknownInferredType.instance)) {
+        return lowerBound ? typeProvider.nullType : typeProvider.dynamicType;
       }
-      return typeProvider.dynamicType;
+      return type;
+    });
+  }
+
+  /**
+   * Apply the [visitType] substitution to [type], using the result value if
+   * different, otherwise recursively apply the substitution.
+   *
+   * This method is used for substituting `?` ([UnknownInferredType]) with its
+   * greatest/least closure, and for eliminating type parameters for inference
+   * of `const` objects.
+   *
+   * See also [_eliminateTypeVariables] and [_substituteForUnknownType].
+   */
+  DartType _substituteType(DartType type, bool lowerBound,
+      DartType Function(DartType, bool) visitType) {
+    // Apply the substitution to this type, and return the result if different.
+    var newType = visitType(type, lowerBound);
+    if (!identical(newType, type)) {
+      return newType;
     }
     if (type is InterfaceTypeImpl) {
       // Generic types are covariant, so keep the constraint direction.
-      var newTypeArgs = _transformList(type.typeArguments,
-          (t) => _substituteForUnknownType(t, lowerBound: lowerBound));
+      var newTypeArgs = _transformList(
+          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) {
@@ -914,8 +979,7 @@
       var returnType = type.returnType;
       var newParameters = _transformList(parameters, (ParameterElement p) {
         // Parameters are contravariant, so flip the constraint direction.
-        var newType =
-            _substituteForUnknownType(p.type, lowerBound: !lowerBound);
+        var newType = _substituteType(p.type, !lowerBound, visitType);
         return new ParameterElementImpl.synthetic(
             p.name,
             newType,
@@ -923,8 +987,7 @@
             p.parameterKind);
       });
       // Return type is covariant.
-      var newReturnType =
-          _substituteForUnknownType(returnType, lowerBound: lowerBound);
+      var newReturnType = _substituteType(returnType, lowerBound, visitType);
       if (identical(parameters, newParameters) &&
           identical(returnType, newReturnType)) {
         return type;
@@ -932,7 +995,7 @@
 
       return new FunctionTypeImpl.synthetic(
           newReturnType, type.typeFormals, newParameters,
-          nullability: (type as TypeImpl).nullability);
+          nullabilitySuffix: (type as TypeImpl).nullabilitySuffix);
     }
     return type;
   }
@@ -1872,6 +1935,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:
@@ -1879,6 +1963,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).
@@ -1918,41 +2008,25 @@
    * Searches the superinterfaces of [type] for implementations of [genericType]
    * and returns the most specific type argument used for that generic type.
    *
+   * For a more general/robust solution, use [InterfaceTypeImpl.asInstanceOf].
+   *
    * For example, given [type] `List<int>` and [genericType] `Iterable<T>`,
    * returns [int].
    *
    * Returns `null` if [type] does not implement [genericType].
    */
-  // TODO(jmesserly): this is very similar to code used for flattening futures.
-  // The only difference is, because of a lack of TypeProvider, the other method
-  // has to match the Future type by its name and library. Here was are passed
-  // in the correct type.
   DartType mostSpecificTypeArgument(DartType type, DartType genericType) {
     if (type is! InterfaceType) return null;
+    if (genericType is! InterfaceType) return null;
 
-    // Walk the superinterface hierarchy looking for [genericType].
-    List<DartType> candidates = <DartType>[];
-    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
-    void recurse(InterfaceType interface) {
-      if (interface.element == genericType.element &&
-          interface.typeArguments.isNotEmpty) {
-        candidates.add(interface.typeArguments[0]);
-      }
-      if (visitedClasses.add(interface.element)) {
-        if (interface.superclass != null) {
-          recurse(interface.superclass);
-        }
-        interface.mixins.forEach(recurse);
-        interface.interfaces.forEach(recurse);
-        visitedClasses.remove(interface.element);
-      }
+    var asInstanceOf = (type as InterfaceTypeImpl)
+        .asInstanceOf((genericType as InterfaceType).element);
+
+    if (asInstanceOf != null) {
+      return asInstanceOf.typeArguments[0];
     }
 
-    recurse(type);
-
-    // Since the interface may be implemented multiple times with different
-    // type arguments, choose the best one.
-    return InterfaceTypeImpl.findMostSpecificType(candidates, this);
+    return null;
   }
 
   /**
@@ -2105,6 +2179,8 @@
           ParameterKind.POSITIONAL));
     }
 
+    // TODO(brianwilkerson) Handle the fact that named parameters can now be
+    //  required.
     Map<String, DartType> fNamed = f.namedParameterTypes;
     Map<String, DartType> gNamed = g.namedParameterTypes;
     for (String name in fNamed.keys.toSet()..retainAll(gNamed.keys)) {
@@ -2197,7 +2273,7 @@
   bool get isDynamic => true;
 
   @override
-  Nullability get nullability => Nullability.indeterminate;
+  NullabilitySuffix get nullabilitySuffix => NullabilitySuffix.star;
 
   @override
   bool operator ==(Object object) => identical(object, this);
@@ -2259,7 +2335,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/analyzer/lib/src/generated/utilities_dart.dart b/analyzer/lib/src/generated/utilities_dart.dart
index d1904a0..160c47a 100644
--- a/analyzer/lib/src/generated/utilities_dart.dart
+++ b/analyzer/lib/src/generated/utilities_dart.dart
@@ -50,20 +50,32 @@
 }
 
 /**
- * The kinds of a parameter. There are two basic kinds of parameters: required
- * and optional. Optional parameters are further divided into two kinds:
- * positional optional and named optional.
+ * The kind of a parameter. A parameter can be either positional or named, and
+ * can be either required or optional. 
  */
 class ParameterKind implements Comparable<ParameterKind> {
+  /// A positional required parameter.
   static const ParameterKind REQUIRED =
-      const ParameterKind('REQUIRED', 0, false);
+      const ParameterKind('REQUIRED', 0, false, false);
 
+  /// A positional optional parameter.
   static const ParameterKind POSITIONAL =
-      const ParameterKind('POSITIONAL', 1, true);
+      const ParameterKind('POSITIONAL', 1, false, true);
 
-  static const ParameterKind NAMED = const ParameterKind('NAMED', 2, true);
+  /// A named required parameter.
+  static const ParameterKind NAMED_REQUIRED =
+      const ParameterKind('NAMED_REQUIRED', 2, true, false);
 
-  static const List<ParameterKind> values = const [REQUIRED, POSITIONAL, NAMED];
+  /// A named optional parameter.
+  static const ParameterKind NAMED =
+      const ParameterKind('NAMED', 2, true, true);
+
+  static const List<ParameterKind> values = const [
+    REQUIRED,
+    POSITIONAL,
+    NAMED_REQUIRED,
+    NAMED
+  ];
 
   /**
    * The name of this parameter.
@@ -76,14 +88,19 @@
   final int ordinal;
 
   /**
-   * A flag indicating whether this is an optional parameter.
+   * A flag indicating whether this is a named or positional parameter.
+   */
+  final bool isNamed;
+
+  /**
+   * A flag indicating whether this is an optional or required parameter.
    */
   final bool isOptional;
 
   /**
    * Initialize a newly created kind with the given state.
    */
-  const ParameterKind(this.name, this.ordinal, this.isOptional);
+  const ParameterKind(this.name, this.ordinal, this.isNamed, this.isOptional);
 
   @override
   int get hashCode => ordinal;
diff --git a/analyzer/lib/src/generated/utilities_general.dart b/analyzer/lib/src/generated/utilities_general.dart
index 9722bc8..fab29a6 100644
--- a/analyzer/lib/src/generated/utilities_general.dart
+++ b/analyzer/lib/src/generated/utilities_general.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/src/generated/visitors.dart b/analyzer/lib/src/generated/visitors.dart
index 457d7f8..62cb61a 100644
--- a/analyzer/lib/src/generated/visitors.dart
+++ b/analyzer/lib/src/generated/visitors.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/hint/sdk_constraint_verifier.dart b/analyzer/lib/src/hint/sdk_constraint_verifier.dart
index cc2231a..938d454 100644
--- a/analyzer/lib/src/hint/sdk_constraint_verifier.dart
+++ b/analyzer/lib/src/hint/sdk_constraint_verifier.dart
@@ -3,9 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.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/error/listener.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -26,10 +29,32 @@
   /// The version constraint for the SDK.
   final VersionConstraint _versionConstraint;
 
+  /// A cached flag indicating whether references to the constant-update-2018
+  /// features need to be checked. Use [checkConstantUpdate2018] to access this
+  /// field.
+  bool _checkConstantUpdate2018;
+
   /// A cached flag indicating whether references to Future and Stream need to
-  /// be checked. Use [] to access this field.
+  /// be checked. Use [checkFutureAndStream] to access this field.
   bool _checkFutureAndStream;
 
+  /// A cached flag indicating whether references to set literals need to
+  /// be checked. Use [checkSetLiterals] to access this field.
+  bool _checkSetLiterals;
+
+  /// A flag indicating whether we are visiting code inside a set literal. Used
+  /// to prevent over-reporting uses of set literals.
+  bool _inSetLiteral = false;
+
+  /// A cached flag indicating whether references to the ui-as-code features
+  /// need to be checked. Use [checkUiAsCode] to access this field.
+  bool _checkUiAsCode;
+
+  /// A flag indicating whether we are visiting code inside one of the
+  /// ui-as-code features. Used to prevent over-reporting uses of these
+  /// features.
+  bool _inUiAsCode = false;
+
   /// Initialize a newly created verifier to use the given [_errorReporter] to
   /// report errors.
   SdkConstraintVerifier(this._errorReporter, this._containingLibrary,
@@ -39,16 +64,138 @@
   VersionRange get before_2_1_0 =>
       new VersionRange(max: Version.parse('2.1.0'), includeMax: false);
 
+  /// Return a range covering every version up to, but not including, 2.2.0.
+  VersionRange get before_2_2_0 =>
+      new VersionRange(max: Version.parse('2.2.0'), includeMax: false);
+
+  /// Return a range covering every version up to, but not including, 2.2.2.
+  VersionRange get before_2_2_2 =>
+      new VersionRange(max: Version.parse('2.2.2'), includeMax: false);
+
+  /// Return `true` if references to the constant-update-2018 features need to
+  /// be checked.
+  bool get checkConstantUpdate2018 => _checkConstantUpdate2018 ??=
+      !before_2_2_2.intersect(_versionConstraint).isEmpty;
+
   /// Return `true` if references to Future and Stream need to be checked.
   bool get checkFutureAndStream => _checkFutureAndStream ??=
       !before_2_1_0.intersect(_versionConstraint).isEmpty;
 
+  /// Return `true` if references to the non-nullable features need to be
+  /// checked.
+  // TODO(brianwilkerson) Implement this as a version check when a version has
+  //  been selected.
+  bool get checkNnbd => true;
+
+  /// Return `true` if references to set literals need to be checked.
+  bool get checkSetLiterals =>
+      _checkSetLiterals ??= !before_2_2_0.intersect(_versionConstraint).isEmpty;
+
+  /// Return `true` if references to the ui-as-code features (control flow and
+  /// spread collections) need to be checked.
+  bool get checkUiAsCode =>
+      _checkUiAsCode ??= !before_2_2_2.intersect(_versionConstraint).isEmpty;
+
+  @override
+  void visitAsExpression(AsExpression node) {
+    if (checkConstantUpdate2018 &&
+        (node as AsExpressionImpl).inConstantContext) {
+      _errorReporter.reportErrorForNode(
+          HintCode.SDK_VERSION_AS_EXPRESSION_IN_CONST_CONTEXT, node);
+    }
+    super.visitAsExpression(node);
+  }
+
+  @override
+  void visitBinaryExpression(BinaryExpression node) {
+    if (checkConstantUpdate2018) {
+      TokenType operatorType = node.operator.type;
+      if (operatorType == TokenType.GT_GT_GT) {
+        _errorReporter.reportErrorForToken(
+            HintCode.SDK_VERSION_GT_GT_GT_OPERATOR, node.operator);
+      } else if ((operatorType == TokenType.AMPERSAND ||
+              operatorType == TokenType.BAR ||
+              operatorType == TokenType.CARET) &&
+          (node as BinaryExpressionImpl).inConstantContext) {
+        if (node.leftOperand.staticType.isDartCoreBool) {
+          _errorReporter.reportErrorForToken(HintCode.SDK_VERSION_BOOL_OPERATOR,
+              node.operator, [node.operator.lexeme]);
+        }
+      } else if (operatorType == TokenType.EQ_EQ &&
+          (node as BinaryExpressionImpl).inConstantContext) {
+        bool primitive(Expression node) {
+          DartType type = node.staticType;
+          return type.isDartCoreBool ||
+              type.isDartCoreDouble ||
+              type.isDartCoreInt ||
+              type.isDartCoreNull ||
+              type.isDartCoreString;
+        }
+
+        if (!primitive(node.leftOperand) || !primitive(node.rightOperand)) {
+          _errorReporter.reportErrorForToken(
+              HintCode.SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT,
+              node.operator);
+        }
+      }
+    }
+    super.visitBinaryExpression(node);
+  }
+
+  @override
+  void visitForElement(ForElement node) {
+    _validateUiAsCode(node);
+    bool wasInUiAsCode = _inUiAsCode;
+    _inUiAsCode = true;
+    super.visitForElement(node);
+    _inUiAsCode = wasInUiAsCode;
+  }
+
   @override
   void visitHideCombinator(HideCombinator node) {
     // Don't flag references to either `Future` or `Stream` within a combinator.
   }
 
   @override
+  void visitIfElement(IfElement node) {
+    _validateUiAsCode(node);
+    bool wasInUiAsCode = _inUiAsCode;
+    _inUiAsCode = true;
+    super.visitIfElement(node);
+    _inUiAsCode = wasInUiAsCode;
+  }
+
+  @override
+  void visitIsExpression(IsExpression node) {
+    if (checkConstantUpdate2018 &&
+        (node as IsExpressionImpl).inConstantContext) {
+      _errorReporter.reportErrorForNode(
+          HintCode.SDK_VERSION_IS_EXPRESSION_IN_CONST_CONTEXT, node);
+    }
+    super.visitIsExpression(node);
+  }
+
+  @override
+  void visitMethodDeclaration(MethodDeclaration node) {
+    if (checkConstantUpdate2018 && node.isOperator && node.name.name == '>>>') {
+      _errorReporter.reportErrorForNode(
+          HintCode.SDK_VERSION_GT_GT_GT_OPERATOR, node.name);
+    }
+    super.visitMethodDeclaration(node);
+  }
+
+  @override
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    if (node.isSet && checkSetLiterals && !_inSetLiteral) {
+      _errorReporter.reportErrorForNode(HintCode.SDK_VERSION_SET_LITERAL, node);
+    }
+    bool wasInSetLiteral = _inSetLiteral;
+    _inSetLiteral = true;
+    super.visitSetOrMapLiteral(node);
+    _inSetLiteral = wasInSetLiteral;
+  }
+
+  @override
   void visitShowCombinator(ShowCombinator node) {
     // Don't flag references to either `Future` or `Stream` within a combinator.
   }
@@ -73,6 +220,26 @@
       }
       _errorReporter.reportErrorForNode(
           HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE, node, [element.name]);
+    } else if (checkNnbd && element == _typeProvider.neverType.element) {
+      _errorReporter.reportErrorForNode(HintCode.SDK_VERSION_NEVER, node);
+    }
+  }
+
+  @override
+  void visitSpreadElement(SpreadElement node) {
+    _validateUiAsCode(node);
+    bool wasInUiAsCode = _inUiAsCode;
+    _inUiAsCode = true;
+    super.visitSpreadElement(node);
+    _inUiAsCode = wasInUiAsCode;
+  }
+
+  /// Given that the [node] is only valid when the ui-as-code feature is
+  /// enabled, check that the code will not be executed with a version of the
+  /// SDK that does not support the feature.
+  void _validateUiAsCode(AstNode node) {
+    if (checkUiAsCode && !_inUiAsCode) {
+      _errorReporter.reportErrorForNode(HintCode.SDK_VERSION_UI_AS_CODE, node);
     }
   }
 }
diff --git a/analyzer/lib/src/html/error/html_codes.dart b/analyzer/lib/src/html/error/html_codes.dart
deleted file mode 100644
index 59a67b4..0000000
--- a/analyzer/lib/src/html/error/html_codes.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2014, 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/error/error.dart';
-
-/**
- * The error codes used for errors in HTML files. The convention for this
- * class is for the name of the error code to indicate the problem that caused
- * the error to be generated and for the error message to explain what is wrong
- * and, when appropriate, how the problem can be corrected.
- */
-class HtmlErrorCode extends ErrorCode {
-  /**
-   * An error code indicating that there is a syntactic error in the file.
-   *
-   * Parameters:
-   * 0: the error message from the parse error
-   */
-  static const HtmlErrorCode PARSE_ERROR =
-      const HtmlErrorCode('PARSE_ERROR', '{0}');
-
-  /**
-   * Initialize a newly created error code to have the given [name]. The message
-   * associated with the error will be created from the given [message]
-   * template. The correction associated with the error will be created from the
-   * given [correction] template.
-   */
-  const HtmlErrorCode(String name, String message, {String correction})
-      : super.temporary(name, message, correction: correction);
-
-  @override
-  ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
-
-  @override
-  ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
-}
-
-/**
- * The error codes used for warnings in HTML files. The convention for this
- * class is for the name of the error code to indicate the problem that caused
- * the error to be generated and for the error message to explain what is wrong
- * and, when appropriate, how the problem can be corrected.
- */
-class HtmlWarningCode extends ErrorCode {
-  /**
-   * An error code indicating that the value of the 'src' attribute of a Dart
-   * script tag is not a valid URI.
-   *
-   * Parameters:
-   * 0: the URI that is invalid
-   */
-  static const HtmlWarningCode INVALID_URI =
-      const HtmlWarningCode('INVALID_URI', "Invalid URI syntax: '{0}'.");
-
-  /**
-   * An error code indicating that the value of the 'src' attribute of a Dart
-   * script tag references a file that does not exist.
-   *
-   * Parameters:
-   * 0: the URI pointing to a non-existent file
-   */
-  static const HtmlWarningCode URI_DOES_NOT_EXIST = const HtmlWarningCode(
-      'URI_DOES_NOT_EXIST', "Target of URI doesn't exist: '{0}'.");
-
-  /**
-   * Initialize a newly created error code to have the given [name]. The message
-   * associated with the error will be created from the given [message]
-   * template. The correction associated with the error will be created from the
-   * given [correction] template.
-   */
-  const HtmlWarningCode(String name, String message, {String correction})
-      : super.temporary(name, message, correction: correction);
-
-  @override
-  ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
-
-  @override
-  ErrorType get type => ErrorType.STATIC_WARNING;
-}
diff --git a/analyzer/lib/src/lint/analysis.dart b/analyzer/lib/src/lint/analysis.dart
index d62aaa0..e3dae80 100644
--- a/analyzer/lib/src/lint/analysis.dart
+++ b/analyzer/lib/src/lint/analysis.dart
@@ -10,7 +10,7 @@
 import 'package:analyzer/file_system/file_system.dart'
     show File, Folder, ResourceProvider, ResourceUriResolver;
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/source/analysis_options_provider.dart';
+import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
diff --git a/analyzer/lib/src/lint/config.dart b/analyzer/lib/src/lint/config.dart
index 6f5268d..1645b5a 100644
--- a/analyzer/lib/src/lint/config.dart
+++ b/analyzer/lib/src/lint/config.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/lint/io.dart b/analyzer/lib/src/lint/io.dart
index 3e84c4d..bd3e4a0 100644
--- a/analyzer/lib/src/lint/io.dart
+++ b/analyzer/lib/src/lint/io.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/lint/linter.dart b/analyzer/lib/src/lint/linter.dart
index c60b97d..331d7a6 100644
--- a/analyzer/lib/src/lint/linter.dart
+++ b/analyzer/lib/src/lint/linter.dart
@@ -14,6 +14,7 @@
 import 'package:analyzer/file_system/file_system.dart' as file_system;
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:analyzer/src/dart/constant/potentially_constant.dart';
 import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisErrorInfo, AnalysisErrorInfoImpl, AnalysisOptions, Logger;
@@ -43,6 +44,7 @@
   static final _camelCaseTester = new RegExp(r'^([_$]*)([A-Z?$]+[a-z0-9]*)+$');
 
   final String value;
+
   CamelCaseString(this.value) {
     if (!isCamelCase(value)) {
       throw new ArgumentError('$value is not CamelCase');
@@ -189,8 +191,11 @@
   final String label;
   final String href;
   final bool bold;
+
   const Hyperlink(this.label, this.href, {this.bold: false});
+
   String get html => '<a href="$href">${_emph(label)}</a>';
+
   String _emph(msg) => bold ? '<strong>$msg</strong>' : msg;
 }
 
@@ -218,6 +223,16 @@
   /// Note that this method can cause constant evaluation to occur, which can be
   /// computationally expensive.
   bool canBeConst(InstanceCreationExpression expression);
+
+  /// Return `true` if it would be valid for the given constructor declaration
+  /// [node] to have a keyword of `const`.
+  ///
+  /// The [node] is expected to be a node within one of the compilation
+  /// units in [allUnits].
+  ///
+  /// Note that this method can cause constant evaluation to occur, which can be
+  /// computationally expensive.
+  bool canBeConstConstructor(ConstructorDeclaration node);
 }
 
 /// Implementation of [LinterContext]
@@ -257,18 +272,50 @@
     // exception.
     //
     Token oldKeyword = expression.keyword;
-    ConstantAnalysisErrorListener listener =
-        new ConstantAnalysisErrorListener();
     try {
       expression.keyword = new KeywordToken(Keyword.CONST, expression.offset);
-      LibraryElement library = element.library;
-      ErrorReporter errorReporter = new ErrorReporter(listener, element.source);
-      expression.accept(new ConstantVerifier(
-          errorReporter, library, typeProvider, declaredVariables));
+      return !_hasConstantVerifierError(expression);
     } finally {
       expression.keyword = oldKeyword;
     }
-    return !listener.hasConstError;
+  }
+
+  @override
+  bool canBeConstConstructor(ConstructorDeclaration node) {
+    ConstructorElement element = node.declaredElement;
+
+    ClassElement classElement = element.enclosingElement;
+    if (classElement.hasNonFinalField) return false;
+
+    var oldKeyword = node.constKeyword;
+    try {
+      temporaryConstConstructorElements[element] = true;
+      node.constKeyword = KeywordToken(Keyword.CONST, node.offset);
+      return !_hasConstantVerifierError(node);
+    } finally {
+      temporaryConstConstructorElements[element] = null;
+      node.constKeyword = oldKeyword;
+    }
+  }
+
+  /// Return `true` if [ConstantVerifier] reports an error for the [node].
+  bool _hasConstantVerifierError(AstNode node) {
+    var unitElement = currentUnit.unit.declaredElement;
+    var libraryElement = unitElement.library;
+
+    var listener = ConstantAnalysisErrorListener();
+    var errorReporter = ErrorReporter(listener, unitElement.source);
+
+    node.accept(
+      ConstantVerifier(
+        errorReporter,
+        libraryElement,
+        typeProvider,
+        declaredVariables,
+        featureSet: currentUnit.unit.featureSet,
+      ),
+    );
+    return listener.hasConstError;
   }
 }
 
@@ -299,10 +346,12 @@
   String analysisOptions;
   LintFilter filter;
   file_system.ResourceProvider resourceProvider;
+
   // todo (pq): consider migrating to named params (but note Linter dep).
   LinterOptions([this.enabledLints, this.analysisOptions]) {
     enabledLints ??= Registry.ruleRegistry;
   }
+
   void configure(LintConfig config) {
     enabledLints = Registry.ruleRegistry.where((LintRule rule) =>
         !config.ruleConfigs.any((rc) => rc.disables(rule.name)));
@@ -478,6 +527,7 @@
 
 abstract class Reporter {
   void exception(LinterException exception);
+
   void warn(String message);
 }
 
diff --git a/analyzer/lib/src/lint/linter_visitor.dart b/analyzer/lib/src/lint/linter_visitor.dart
index 6663be8..79fff64 100644
--- a/analyzer/lib/src/lint/linter_visitor.dart
+++ b/analyzer/lib/src/lint/linter_visitor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -265,13 +265,6 @@
   }
 
   @override
-  @deprecated
-  void visitForEachStatement(ForEachStatement node) {
-    _runSubscriptions(node, registry._forForEachStatement);
-    super.visitForEachStatement(node);
-  }
-
-  @override
   void visitForElement(ForElement node) {
     _runSubscriptions(node, registry._forForElement);
     super.visitForElement(node);
@@ -296,19 +289,12 @@
   }
 
   @override
-  @deprecated
   void visitForStatement(ForStatement node) {
     _runSubscriptions(node, registry._forForStatement);
     super.visitForStatement(node);
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
-    _runSubscriptions(node, registry._forForStatement2);
-    super.visitForStatement2(node);
-  }
-
-  @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     _runSubscriptions(node, registry._forFunctionDeclaration);
     super.visitFunctionDeclaration(node);
@@ -453,13 +439,6 @@
   }
 
   @override
-  @deprecated
-  void visitMapLiteral(MapLiteral node) {
-    _runSubscriptions(node, registry._forMapLiteral);
-    super.visitMapLiteral(node);
-  }
-
-  @override
   void visitMapLiteralEntry(MapLiteralEntry node) {
     _runSubscriptions(node, registry._forMapLiteralEntry);
     super.visitMapLiteralEntry(node);
@@ -792,17 +771,13 @@
       _forForEachPartsWithDeclaration = [];
   final List<_Subscription<ForEachPartsWithIdentifier>>
       _forForEachPartsWithIdentifier = [];
-  @Deprecated('Use _forForStatement2')
-  final List<_Subscription<ForEachStatement>> _forForEachStatement = [];
   final List<_Subscription<ForElement>> _forForElement = [];
   final List<_Subscription<FormalParameterList>> _forFormalParameterList = [];
   final List<_Subscription<ForPartsWithDeclarations>>
       _forForPartsWithDeclarations = [];
   final List<_Subscription<ForPartsWithExpression>> _forForPartsWithExpression =
       [];
-  @Deprecated('Use _forForStatement2')
   final List<_Subscription<ForStatement>> _forForStatement = [];
-  final List<_Subscription<ForStatement2>> _forForStatement2 = [];
   final List<_Subscription<FunctionDeclaration>> _forFunctionDeclaration = [];
   final List<_Subscription<FunctionDeclarationStatement>>
       _forFunctionDeclarationStatement = [];
@@ -832,8 +807,6 @@
   final List<_Subscription<LibraryDirective>> _forLibraryDirective = [];
   final List<_Subscription<LibraryIdentifier>> _forLibraryIdentifier = [];
   final List<_Subscription<ListLiteral>> _forListLiteral = [];
-  @Deprecated('Use _forSetOrMapLiteral')
-  final List<_Subscription<MapLiteral>> _forMapLiteral = [];
   final List<_Subscription<MapLiteralEntry>> _forMapLiteralEntry = [];
   final List<_Subscription<MethodDeclaration>> _forMethodDeclaration = [];
   final List<_Subscription<MethodInvocation>> _forMethodInvocation = [];
@@ -1086,12 +1059,6 @@
         .add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
 
-  @Deprecated('Use addForStatement2')
-  void addForEachStatement(LintRule linter, AstVisitor visitor) {
-    _forForEachStatement
-        .add(new _Subscription(linter, visitor, _getTimer(linter)));
-  }
-
   void addForElement(LintRule linter, AstVisitor visitor) {
     _forForElement.add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
@@ -1111,14 +1078,13 @@
         .add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
 
-  @Deprecated('Use addForStatement2')
   void addForStatement(LintRule linter, AstVisitor visitor) {
     _forForStatement.add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
 
+  @Deprecated('Replaced by addForStatement')
   void addForStatement2(LintRule linter, AstVisitor visitor) {
-    _forForStatement2
-        .add(new _Subscription(linter, visitor, _getTimer(linter)));
+    addForStatement(linter, visitor);
   }
 
   void addFunctionDeclaration(LintRule linter, AstVisitor visitor) {
@@ -1236,11 +1202,6 @@
     _forListLiteral.add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
 
-  @Deprecated('Use addSetOrMapLiteral')
-  void addMapLiteral(LintRule linter, AstVisitor visitor) {
-    _forMapLiteral.add(new _Subscription(linter, visitor, _getTimer(linter)));
-  }
-
   void addMapLiteralEntry(LintRule linter, AstVisitor visitor) {
     _forMapLiteralEntry
         .add(new _Subscription(linter, visitor, _getTimer(linter)));
diff --git a/analyzer/lib/src/lint/options_rule_validator.dart b/analyzer/lib/src/lint/options_rule_validator.dart
index 9b28b1a..593dee4 100644
--- a/analyzer/lib/src/lint/options_rule_validator.dart
+++ b/analyzer/lib/src/lint/options_rule_validator.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/lint/project.dart b/analyzer/lib/src/lint/project.dart
index 7243747..f76a03e 100644
--- a/analyzer/lib/src/lint/project.dart
+++ b/analyzer/lib/src/lint/project.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/lint/util.dart b/analyzer/lib/src/lint/util.dart
index 2e12794..57e33be 100644
--- a/analyzer/lib/src/lint/util.dart
+++ b/analyzer/lib/src/lint/util.dart
@@ -4,6 +4,7 @@
 
 import 'dart:io';
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -89,6 +90,7 @@
 class Spelunker {
   final String path;
   final IOSink sink;
+
   Spelunker(this.path, {IOSink sink}) : this.sink = sink ?? stdout;
 
   void spelunk() {
@@ -98,12 +100,16 @@
 
     var reader = new CharSequenceReader(contents);
     var stringSource = new StringSource(contents, path);
-    var scanner = new Scanner(stringSource, reader, errorListener);
+    // TODO(paulberry): figure out the appropriate featureSet to use here
+    var featureSet = FeatureSet.fromEnableFlags([]);
+    var scanner = new Scanner(stringSource, reader, errorListener)
+      ..configureFeatures(featureSet);
     var startToken = scanner.tokenize();
 
     errorListener.throwIfErrors();
 
-    var parser = new Parser(stringSource, errorListener);
+    var parser =
+        new Parser(stringSource, errorListener, featureSet: featureSet);
     var node = parser.parseCompilationUnit(startToken);
 
     errorListener.throwIfErrors();
@@ -132,6 +138,7 @@
   int indent = 0;
 
   final IOSink sink;
+
   _SourceVisitor(this.sink);
 
   String asString(AstNode node) =>
diff --git a/analyzer/lib/src/manifest/manifest_validator.dart b/analyzer/lib/src/manifest/manifest_validator.dart
new file mode 100644
index 0000000..c3f7c29
--- /dev/null
+++ b/analyzer/lib/src/manifest/manifest_validator.dart
@@ -0,0 +1,171 @@
+// 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/error/error.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:html/dom.dart';
+import 'package:html/parser.dart' show parseFragment;
+import 'package:source_span/source_span.dart';
+
+import 'manifest_values.dart';
+import 'manifest_warning_code.dart';
+
+class ManifestValidator {
+  /**
+   * The source representing the file being validated.
+   */
+  final Source source;
+
+  /**
+   * Initialize a newly create validator to validate the content of the given
+   * [source].
+   */
+  ManifestValidator(this.source);
+
+  /*
+   * Validate the [contents] of the Android Manifest file.
+   */
+  List<AnalysisError> validate(String contents, bool checkManifest) {
+    RecordingErrorListener recorder = new RecordingErrorListener();
+    ErrorReporter reporter = new ErrorReporter(recorder, source);
+
+    if (checkManifest) {
+      var document =
+          parseFragment(contents, container: MANIFEST_TAG, generateSpans: true);
+      var manifest = document.children.firstWhere(
+          (element) => element.localName == MANIFEST_TAG,
+          orElse: () => null);
+      var features = manifest?.getElementsByTagName(USES_FEATURE_TAG) ?? [];
+      var permissions =
+          manifest?.getElementsByTagName(USES_PERMISSION_TAG) ?? [];
+      var activities = _findActivityElements(manifest);
+
+      _validateTouchScreenFeature(features, manifest, reporter);
+      _validateFeatures(features, reporter);
+      _validatePermissions(permissions, features, reporter);
+      _validateActivities(activities, reporter);
+    }
+    return recorder.errors;
+  }
+
+  /*
+   * Validate the presence/absence of the touchscreen feature tag.
+   */
+  _validateTouchScreenFeature(
+      List<Element> features, Element manifest, ErrorReporter reporter) {
+    var feature = features.firstWhere(
+        (element) =>
+            element.attributes[ANDROID_NAME] == HARDWARE_FEATURE_TOUCHSCREEN,
+        orElse: () => null);
+    if (feature != null) {
+      if (!feature.attributes.containsKey(ANDROID_REQUIRED)) {
+        _reportErrorForNode(reporter, feature, ANDROID_NAME,
+            ManifestWarningCode.UNSUPPORTED_CHROME_OS_HARDWARE);
+      } else if (feature.attributes[ANDROID_REQUIRED] == 'true') {
+        _reportErrorForNode(reporter, feature, ANDROID_NAME,
+            ManifestWarningCode.UNSUPPORTED_CHROME_OS_FEATURE);
+      }
+    } else {
+      _reportErrorForNode(
+          reporter, manifest, null, ManifestWarningCode.NO_TOUCHSCREEN_FEATURE);
+    }
+  }
+
+  /*
+   * Validate the `uses-feature` tags.
+   */
+  _validateFeatures(List<Element> features, ErrorReporter reporter) {
+    var unsupported = features
+        .where((element) => UNSUPPORTED_HARDWARE_FEATURES
+            .contains(element.attributes[ANDROID_NAME]))
+        .toList();
+    unsupported.forEach((element) {
+      if (!element.attributes.containsKey(ANDROID_REQUIRED)) {
+        _reportErrorForNode(reporter, element, ANDROID_NAME,
+            ManifestWarningCode.UNSUPPORTED_CHROME_OS_HARDWARE);
+      } else if (element.attributes[ANDROID_REQUIRED] == 'true') {
+        _reportErrorForNode(reporter, element, ANDROID_NAME,
+            ManifestWarningCode.UNSUPPORTED_CHROME_OS_FEATURE);
+      }
+    });
+  }
+
+  /*
+   * Validate the `uses-permission` tags.
+   */
+  _validatePermissions(List<Element> permissions, List<Element> features,
+      ErrorReporter reporter) {
+    permissions.forEach((permission) {
+      if (permission.attributes[ANDROID_NAME] == ANDROID_PERMISSION_CAMERA) {
+        if (!_hasFeatureCamera(features) ||
+            !_hasFeatureCameraAutoFocus(features)) {
+          _reportErrorForNode(reporter, permission, ANDROID_NAME,
+              ManifestWarningCode.CAMERA_PERMISSIONS_INCOMPATIBLE);
+        }
+      } else {
+        var featureName =
+            getImpliedUnsupportedHardware(permission.attributes[ANDROID_NAME]);
+        if (featureName != null) {
+          _reportErrorForNode(
+              reporter,
+              permission,
+              ANDROID_NAME,
+              ManifestWarningCode.PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE,
+              [featureName]);
+        }
+      }
+    });
+  }
+
+  /*
+   * Validate the 'activity' tags.
+   */
+  _validateActivities(List<Element> activites, ErrorReporter reporter) {
+    activites.forEach((activity) {
+      var attributes = activity.attributes;
+      if (attributes.containsKey(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);
+
+  bool _hasFeatureCameraAutoFocus(List<Element> features) =>
+      features.any((f) => f.localName == HARDWARE_FEATURE_CAMERA_AUTOFOCUS);
+
+  /**
+   * Report an error for the given node.
+   */
+  void _reportErrorForNode(
+      ErrorReporter reporter, Node node, dynamic key, ErrorCode errorCode,
+      [List<Object> arguments]) {
+    FileSpan span =
+        key == null ? node.sourceSpan : node.attributeValueSpans[key];
+    reporter.reportErrorForOffset(
+        errorCode, span.start.offset, span.length, arguments);
+  }
+}
diff --git a/analyzer/lib/src/manifest/manifest_values.dart b/analyzer/lib/src/manifest/manifest_values.dart
new file mode 100644
index 0000000..f44a4ba
--- /dev/null
+++ b/analyzer/lib/src/manifest/manifest_values.dart
@@ -0,0 +1,124 @@
+// 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.
+
+/*
+*  The attribute values to check for compatibility with Chrome OS.
+*
+*/
+
+const String MANIFEST_TAG = 'manifest';
+
+const String USES_PERMISSION_TAG = 'uses-permission';
+
+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_TOUCHSCREEN = 'android.hardware.touchscreen';
+
+const String HARDWARE_FEATURE_CAMERA_AUTOFOCUS =
+    'android.hardware.camera.autofocus';
+
+const String HARDWARE_FEATURE_TELEPHONY = 'android.hardware.telephony';
+
+const String ANDROID_PERMISSION_CAMERA = 'android.permission.CAMERA';
+
+const UNSUPPORTED_HARDWARE_FEATURES = <String>[
+  HARDWARE_FEATURE_CAMERA,
+  HARDWARE_FEATURE_CAMERA_AUTOFOCUS,
+  'android.hardware.camera.capability.manual_post_processing',
+  'android.hardware.camera.capability.manual_sensor',
+  'android.hardware.camera.capability.raw',
+  'android.hardware.camera.flash',
+  'android.hardware.camera.level.full',
+  'android.hardware.consumerir',
+  'android.hardware.location.gps',
+  'android.hardware.nfc',
+  'android.hardware.nfc.hce',
+  'android.hardware.sensor.barometer',
+  HARDWARE_FEATURE_TELEPHONY,
+  'android.hardware.telephony.cdma',
+  'android.hardware.telephony.gsm',
+  'android.hardware.type.automotive',
+  'android.hardware.type.television',
+  'android.hardware.usb.accessory',
+  'android.hardware.usb.host',
+  // Partially-supported, only on some Chrome OS devices.
+  'android.hardware.sensor.accelerometer',
+  'android.hardware.sensor.compass',
+  'android.hardware.sensor.gyroscope',
+  'android.hardware.sensor.light',
+  'android.hardware.sensor.proximity',
+  'android.hardware.sensor.stepcounter',
+  'android.hardware.sensor.stepdetector',
+  // Software features that are not supported
+  'android.software.app_widgets',
+  'android.software.device_admin',
+  'android.software.home_screen',
+  'android.software.input_methods',
+  'android.software.leanback',
+  'android.software.live_wallpaper',
+  'android.software.live_tv',
+  'android.software.managed_users',
+  'android.software.midi',
+  'android.software.sip',
+  'android.software.sip.voip',
+];
+
+String getImpliedUnsupportedHardware(String permission) {
+  switch (permission) {
+    case ANDROID_PERMISSION_CAMERA:
+      return HARDWARE_FEATURE_CAMERA;
+    case 'android.permission.CALL_PHONE':
+      return HARDWARE_FEATURE_TELEPHONY;
+    case 'android.permission.CALL_PRIVILEGED':
+      return HARDWARE_FEATURE_TELEPHONY;
+    case 'android.permission.MODIFY_PHONE_STATE':
+      return HARDWARE_FEATURE_TELEPHONY;
+    case 'android.permission.PROCESS_OUTGOING_CALLS':
+      return HARDWARE_FEATURE_TELEPHONY;
+    case 'android.permission.READ_SMS':
+      return HARDWARE_FEATURE_TELEPHONY;
+    case 'android.permission.RECEIVE_SMS':
+      return HARDWARE_FEATURE_TELEPHONY;
+    case 'android.permission.RECEIVE_MMS':
+      return HARDWARE_FEATURE_TELEPHONY;
+    case 'android.permission.RECEIVE_WAP_PUSH':
+      return HARDWARE_FEATURE_TELEPHONY;
+    case 'android.permission.SEND_SMS':
+      return HARDWARE_FEATURE_TELEPHONY;
+    case 'android.permission.WRITE_APN_SETTINGS':
+      return HARDWARE_FEATURE_TELEPHONY;
+    case 'android.permission.WRITE_SMS':
+      return HARDWARE_FEATURE_TELEPHONY;
+    default:
+      return null;
+  }
+}
+
+const UNSUPPORTED_ORIENTATIONS = <String>[
+  'landscape',
+  'portrait',
+  'reverseLandscape',
+  'reversePortrait',
+  'sensorLandscape',
+  'sensorPortrait',
+  'userLandscape',
+  'userPortrait'
+];
diff --git a/analyzer/lib/src/manifest/manifest_warning_code.dart b/analyzer/lib/src/manifest/manifest_warning_code.dart
new file mode 100644
index 0000000..cd9761d
--- /dev/null
+++ b/analyzer/lib/src/manifest/manifest_warning_code.dart
@@ -0,0 +1,99 @@
+// 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/error/error.dart';
+
+/**
+ * The error codes used for warnings in analysis options files. The convention
+ * for this class is for the name of the error code to indicate the problem that
+ * caused the error to be generated and for the error message to explain what is
+ * wrong and, when appropriate, how the problem can be corrected.
+ */
+class ManifestWarningCode extends ErrorCode {
+  /**
+   * A code indicating that a specified hardware feature is not supported on Chrome OS.
+   */
+  static const ManifestWarningCode UNSUPPORTED_CHROME_OS_HARDWARE =
+      const ManifestWarningCode('UNSUPPORTED_CHROME_OS_HARDWARE',
+          "This feature is not supported on Chrome OS, consider making it optional.",
+          correction:
+              "Try adding `android:required=\"false\"` for this " + "feature.");
+
+  /**
+   * A code indicating that a specified feature is not supported on Chrome OS.
+   */
+  static const ManifestWarningCode UNSUPPORTED_CHROME_OS_FEATURE =
+      const ManifestWarningCode('UNSUPPORTED_CHROME_OS_FEATURE',
+          "This feature is not supported on Chrome OS, consider making it optional.",
+          correction: "Try changing to `android:required=\"false\"` for this " +
+              "feature.");
+
+  /**
+   * A code indicating that the touchscreen feature is not specified in the
+   * manifest.
+   */
+  static const ManifestWarningCode NO_TOUCHSCREEN_FEATURE = const ManifestWarningCode(
+      'NO_TOUCHSCREEN_FEATURE',
+      "The default \"android.hardware.touchscreen\" needs to be optional for Chrome OS. ",
+      correction: "Consider adding " +
+          "<uses-feature android:name=\"android.hardware.touchscreen\" android:required=\"false\" />" +
+          " to the manifest.");
+
+  /**
+   * A code indicating that a specified permission is not supported on Chrome OS.
+   */
+  static const ManifestWarningCode PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE =
+      const ManifestWarningCode('PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE',
+          "Permission makes app incompatible for Chrome OS, consider adding optional {0} feature tag, ",
+          correction: " Try adding `<uses-feature " +
+              "android:name=\"{0}\"  android:required=\"false\">`.");
+
+  /**
+   * A code indicating that the camera permissions is not supported on Chrome OS.
+   */
+  static const ManifestWarningCode CAMERA_PERMISSIONS_INCOMPATIBLE = const ManifestWarningCode(
+      'CAMERA_PERMISSIONS_INCOMPATIBLE',
+      "Camera permissions make app incompatible for Chrome OS, consider adding " +
+          "optional features \"android.hardware.camera\" and \"android.hardware.camera.autofocus\".",
+      correction: "Try adding `<uses-feature " +
+          "android:name=\"android.hardware.camera\"  android:required=\"false\">` " +
+          "`<uses-feature " +
+          "android:name=\"android.hardware.camera.autofocus\"  android:required=\"false\">`.");
+
+  /**
+   * 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].
+   */
+  const ManifestWarningCode(String name, String message, {String correction})
+      : super.temporary(name, message, correction: correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
+
+  @override
+  ErrorType get type => ErrorType.STATIC_WARNING;
+}
diff --git a/analyzer/lib/src/plugin/options.dart b/analyzer/lib/src/plugin/options.dart
index e259428..ebfa648 100644
--- a/analyzer/lib/src/plugin/options.dart
+++ b/analyzer/lib/src/plugin/options.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/plugin/resolver_provider.dart b/analyzer/lib/src/plugin/resolver_provider.dart
index abbb3a8..9ef7a7b 100644
--- a/analyzer/lib/src/plugin/resolver_provider.dart
+++ b/analyzer/lib/src/plugin/resolver_provider.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/plugin/task.dart b/analyzer/lib/src/plugin/task.dart
index fec6844..54ec75e 100644
--- a/analyzer/lib/src/plugin/task.dart
+++ b/analyzer/lib/src/plugin/task.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/services/available_declarations.dart b/analyzer/lib/src/services/available_declarations.dart
index 4ec0123..1f18466 100644
--- a/analyzer/lib/src/services/available_declarations.dart
+++ b/analyzer/lib/src/services/available_declarations.dart
@@ -6,13 +6,18 @@
 import 'dart:collection';
 
 import 'package:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
+import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/string_source.dart';
@@ -28,6 +33,7 @@
 
 /// A top-level public declaration.
 class Declaration {
+  final List<Declaration> children;
   final String defaultArgumentListString;
   final List<int> defaultArgumentListTextRanges;
   final String docComplete;
@@ -41,18 +47,11 @@
   final String locationPath;
   final int locationStartColumn;
   final int locationStartLine;
-
-  /// The name of the declaration.
-  /// For enum constants, the name of the constant.
   final String name;
-
-  /// Usually `null`.
-  /// For enum constants, the name of the enum.
-  final String name2;
-
   final String parameters;
   final List<String> parameterNames;
   final List<String> parameterTypes;
+  final Declaration parent;
   final int requiredParameterCount;
   final String returnType;
   final String typeParameters;
@@ -60,6 +59,7 @@
   List<String> _relevanceTags;
 
   Declaration({
+    @required this.children,
     @required this.defaultArgumentListString,
     @required this.defaultArgumentListTextRanges,
     @required this.docComplete,
@@ -74,10 +74,10 @@
     @required this.locationStartColumn,
     @required this.locationStartLine,
     @required this.name,
-    @required this.name2,
     @required this.parameters,
     @required this.parameterNames,
     @required this.parameterTypes,
+    @required this.parent,
     @required List<String> relevanceTags,
     @required this.requiredParameterCount,
     @required this.returnType,
@@ -88,11 +88,7 @@
 
   @override
   String toString() {
-    if (name2 == null) {
-      return '($kind, $name)';
-    } else {
-      return '($kind, $name, $name2)';
-    }
+    return '($kind, $name)';
   }
 }
 
@@ -100,6 +96,7 @@
 enum DeclarationKind {
   CLASS,
   CLASS_TYPE_ALIAS,
+  CONSTRUCTOR,
   ENUM,
   ENUM_CONSTANT,
   FUNCTION,
@@ -129,6 +126,10 @@
   /// The list of paths of all SDK libraries.
   final List<String> _sdkLibraryPathList = [];
 
+  /// The combined information about all of the dartdoc directives in this
+  /// context.
+  final DartdocDirectiveInfo _dartdocDirectiveInfo = new DartdocDirectiveInfo();
+
   /// Map of path prefixes to lists of paths of files from dependencies
   /// (both libraries and parts, we don't know at the time when we fill this
   /// map) that libraries with paths starting with these prefixes can access.
@@ -138,6 +139,10 @@
 
   DeclarationsContext(this._tracker, this._analysisContext);
 
+  /// Return the combined information about all of the dartdoc directives in
+  /// this context.
+  DartdocDirectiveInfo get dartdocDirectiveInfo => _dartdocDirectiveInfo;
+
   /// Return libraries that are available to the file with the given [path].
   ///
   /// With `Pub`, files below the `pubspec.yaml` file can access libraries
@@ -622,18 +627,35 @@
     var file = _getFileByPath(containingContext, path);
     if (file == null) return;
 
-    var isLibrary = file.isLibrary;
-    var library = isLibrary ? file : file.library;
+    var wasLibrary = file.isLibrary;
+    var oldLibrary = wasLibrary ? file : file.library;
 
-    if (isLibrary) {
-      file.refresh(containingContext);
-    } else {
-      file.refresh(containingContext);
-      library.refresh(containingContext);
-    }
+    file.refresh(containingContext);
+    var isLibrary = file.isLibrary;
+    var newLibrary = isLibrary ? file : file.library;
 
     var invalidatedLibraries = Set<_File>();
-    _invalidateExportedDeclarations(invalidatedLibraries, library);
+    var notLibraries = <_File>[];
+    if (wasLibrary) {
+      if (isLibrary) {
+        _invalidateExportedDeclarations(invalidatedLibraries, file);
+      } else {
+        notLibraries.add(file);
+        if (newLibrary != null) {
+          newLibrary.refresh(containingContext);
+          _invalidateExportedDeclarations(invalidatedLibraries, newLibrary);
+        }
+      }
+    } else {
+      if (oldLibrary != null) {
+        oldLibrary.refresh(containingContext);
+        _invalidateExportedDeclarations(invalidatedLibraries, oldLibrary);
+      }
+      if (newLibrary != null && newLibrary != oldLibrary) {
+        newLibrary.refresh(containingContext);
+        _invalidateExportedDeclarations(invalidatedLibraries, newLibrary);
+      }
+    }
     _computeExportedDeclarations(invalidatedLibraries);
 
     var changedLibraries = <Library>[];
@@ -654,6 +676,10 @@
         removedLibraries.add(libraryFile.id);
       }
     }
+    for (var file in notLibraries) {
+      _idToLibrary.remove(file.id);
+      removedLibraries.add(file.id);
+    }
     _changesController.add(
       LibraryChange._(changedLibraries, removedLibraries),
     );
@@ -721,8 +747,8 @@
         var name = declaration.name;
         return <String>['$uriStr::$name'];
       case DeclarationKind.ENUM_CONSTANT:
-        var name2 = declaration.name2;
-        return <String>['$uriStr::$name2'];
+        var enumName = declaration.parent.name;
+        return <String>['$uriStr::$enumName'];
       default:
         return null;
     }
@@ -753,15 +779,14 @@
 
 class _DeclarationStorage {
   static const fieldDocMask = 1 << 0;
-  static const fieldName2Mask = 1 << 1;
-  static const fieldParametersMask = 1 << 2;
-  static const fieldReturnTypeMask = 1 << 3;
-  static const fieldTypeParametersMask = 1 << 4;
+  static const fieldParametersMask = 1 << 1;
+  static const fieldReturnTypeMask = 1 << 2;
+  static const fieldTypeParametersMask = 1 << 3;
 
-  static Declaration fromIdl(String path, idl.AvailableDeclaration d) {
+  static Declaration fromIdl(
+      String path, Declaration parent, idl.AvailableDeclaration d) {
     var fieldMask = d.fieldMask;
     var hasDoc = fieldMask & fieldDocMask != 0;
-    var hasName2 = fieldMask & fieldName2Mask != 0;
     var hasParameters = fieldMask & fieldParametersMask != 0;
     var hasReturnType = fieldMask & fieldReturnTypeMask != 0;
     var hasTypeParameters = fieldMask & fieldTypeParametersMask != 0;
@@ -773,7 +798,9 @@
       relevanceTags = null;
     }
 
-    return Declaration(
+    var children = <Declaration>[];
+    var declaration = Declaration(
+      children: children,
       defaultArgumentListString: d.defaultArgumentListString.isNotEmpty
           ? d.defaultArgumentListString
           : null,
@@ -792,15 +819,22 @@
       locationStartColumn: d.locationStartColumn,
       locationStartLine: d.locationStartLine,
       name: d.name,
-      name2: hasName2 ? d.name2 : null,
       parameters: hasParameters ? d.parameters : null,
       parameterNames: hasParameters ? d.parameterNames : null,
       parameterTypes: hasParameters ? d.parameterTypes.toList() : null,
+      parent: parent,
       relevanceTags: relevanceTags,
       requiredParameterCount: hasParameters ? d.requiredParameterCount : null,
       returnType: hasReturnType ? d.returnType : null,
       typeParameters: hasTypeParameters ? d.typeParameters : null,
     );
+
+    for (var childIdl in d.children) {
+      var child = fromIdl(path, declaration, childIdl);
+      children.add(child);
+    }
+
+    return declaration;
   }
 
   static DeclarationKind kindFromIdl(idl.AvailableDeclarationKind kind) {
@@ -809,6 +843,8 @@
         return DeclarationKind.CLASS;
       case idl.AvailableDeclarationKind.CLASS_TYPE_ALIAS:
         return DeclarationKind.CLASS_TYPE_ALIAS;
+      case idl.AvailableDeclarationKind.CONSTRUCTOR:
+        return DeclarationKind.CONSTRUCTOR;
       case idl.AvailableDeclarationKind.ENUM:
         return DeclarationKind.ENUM;
       case idl.AvailableDeclarationKind.ENUM_CONSTANT:
@@ -836,6 +872,8 @@
         return idl.AvailableDeclarationKind.CLASS;
       case DeclarationKind.CLASS_TYPE_ALIAS:
         return idl.AvailableDeclarationKind.CLASS_TYPE_ALIAS;
+      case DeclarationKind.CONSTRUCTOR:
+        return idl.AvailableDeclarationKind.CONSTRUCTOR;
       case DeclarationKind.ENUM:
         return idl.AvailableDeclarationKind.ENUM;
       case DeclarationKind.ENUM_CONSTANT:
@@ -862,9 +900,6 @@
     if (d.docComplete != null) {
       fieldMask |= fieldDocMask;
     }
-    if (d.name2 != null) {
-      fieldMask |= fieldName2Mask;
-    }
     if (d.parameters != null) {
       fieldMask |= fieldParametersMask;
     }
@@ -877,6 +912,7 @@
 
     var idlKind = kindToIdl(d.kind);
     return idl.AvailableDeclarationBuilder(
+      children: d.children.map(toIdl).toList(),
       defaultArgumentListString: d.defaultArgumentListString,
       defaultArgumentListTextRanges: d.defaultArgumentListTextRanges,
       docComplete: d.docComplete,
@@ -891,7 +927,6 @@
       locationStartColumn: d.locationStartColumn,
       locationStartLine: d.locationStartLine,
       name: d.name,
-      name2: d.name2,
       parameters: d.parameters,
       parameterNames: d.parameterNames,
       parameterTypes: d.parameterTypes,
@@ -920,7 +955,7 @@
 
   Iterable<Declaration> filter(List<Declaration> declarations) {
     return declarations.where((d) {
-      var name = d.name2 ?? d.name;
+      var name = d.name;
       for (var combinator in combinators) {
         if (combinator.shows.isNotEmpty) {
           if (!combinator.shows.contains(name)) return false;
@@ -943,7 +978,7 @@
 
 class _File {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 8;
+  static const int DATA_VERSION = 11;
 
   /// The next value for [id].
   static int _nextId = 0;
@@ -970,6 +1005,9 @@
   List<Declaration> libraryDeclarations = [];
   List<Declaration> exportedDeclarations;
 
+  List<String> templateNames = [];
+  List<String> templateValues = [];
+
   /// If `true`, then this library has already been sent to the client.
   bool isSent = false;
 
@@ -1026,9 +1064,14 @@
 
       CompilationUnit unit = _parse(content);
       _buildFileDeclarations(unit);
+      _extractDartdocInfoFromUnit(unit);
       _putFileDeclarationsToByteStore(contentKey);
+      context.dartdocDirectiveInfo
+          .addTemplateNamesAndValues(templateNames, templateValues);
     } else {
       _readFileDeclarationsFromBytes(bytes);
+      context.dartdocDirectiveInfo
+          .addTemplateNamesAndValues(templateNames, templateValues);
     }
 
     // Resolve exports and parts.
@@ -1043,7 +1086,10 @@
 
     // Set back pointers.
     for (var export in exports) {
-      export.file.directExporters.add(this);
+      var directExporters = export.file.directExporters;
+      if (!directExporters.contains(this)) {
+        directExporters.add(this);
+      }
     }
     for (var part in parts) {
       part.file.library = this;
@@ -1057,7 +1103,7 @@
       for (var part in parts) {
         libraryDeclarations.addAll(part.file.fileDeclarations);
       }
-      _computeRelevanceTagsForLibraryDeclarations();
+      _computeRelevanceTags(libraryDeclarations);
     }
   }
 
@@ -1067,6 +1113,8 @@
     fileDeclarations = [];
     libraryDeclarations = null;
     exportedDeclarations = null;
+    templateNames = [];
+    templateValues = [];
 
     for (var astDirective in unit.directives) {
       if (astDirective is ExportDirective) {
@@ -1117,7 +1165,7 @@
       }
     }
 
-    void addDeclaration({
+    Declaration addDeclaration({
       String defaultArgumentListString,
       List<int> defaultArgumentListTextRanges,
       bool isAbstract = false,
@@ -1126,23 +1174,23 @@
       bool isFinal = false,
       @required DeclarationKind kind,
       @required Identifier name,
-      Identifier name2,
       String parameters,
       List<String> parameterNames,
       List<String> parameterTypes,
+      Declaration parent,
       List<String> relevanceTags,
       int requiredParameterCount,
       String returnType,
       String typeParameters,
     }) {
-      if (Identifier.isPrivateName(name.name) ||
-          name2 != null && Identifier.isPrivateName(name2.name)) {
-        return;
+      if (Identifier.isPrivateName(name.name)) {
+        return null;
       }
 
       var locationOffset = name.offset;
       var lineLocation = lineInfo.getLocation(locationOffset);
-      fileDeclarations.add(Declaration(
+      var declaration = Declaration(
+        children: <Declaration>[],
         defaultArgumentListString: defaultArgumentListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges,
         docComplete: docComplete,
@@ -1155,17 +1203,24 @@
         locationOffset: locationOffset,
         locationPath: path,
         name: name.name,
-        name2: name2?.name,
         locationStartColumn: lineLocation.columnNumber,
         locationStartLine: lineLocation.lineNumber,
         parameters: parameters,
         parameterNames: parameterNames,
         parameterTypes: parameterTypes,
+        parent: parent,
         relevanceTags: relevanceTags,
         requiredParameterCount: requiredParameterCount,
         returnType: returnType,
         typeParameters: typeParameters,
-      ));
+      );
+
+      if (parent != null) {
+        parent.children.add(declaration);
+      } else {
+        fileDeclarations.add(declaration);
+      }
+      return declaration;
     }
 
     for (var node in unit.declarations) {
@@ -1173,12 +1228,77 @@
       var isDeprecated = _hasDeprecatedAnnotation(node);
 
       if (node is ClassDeclaration) {
-        addDeclaration(
+        var classDeclaration = addDeclaration(
           isAbstract: node.isAbstract,
           isDeprecated: isDeprecated,
           kind: DeclarationKind.CLASS,
           name: node.name,
         );
+        if (classDeclaration == null) continue;
+
+        var hasConstructor = false;
+        for (var classMember in node.members) {
+          if (classMember is ConstructorDeclaration) {
+            setDartDoc(classMember);
+            isDeprecated = _hasDeprecatedAnnotation(classMember);
+
+            var parameters = classMember.parameters;
+            var defaultArguments = _computeDefaultArguments(parameters);
+
+            var constructorName = classMember.name;
+            constructorName ??= SimpleIdentifierImpl(
+              StringToken(
+                TokenType.IDENTIFIER,
+                '',
+                classMember.returnType.offset,
+              ),
+            );
+
+            addDeclaration(
+              defaultArgumentListString: defaultArguments?.text,
+              defaultArgumentListTextRanges: defaultArguments?.ranges,
+              isDeprecated: isDeprecated,
+              kind: DeclarationKind.CONSTRUCTOR,
+              name: constructorName,
+              parameters: parameters.toSource(),
+              parameterNames: _getFormalParameterNames(parameters),
+              parameterTypes: _getFormalParameterTypes(parameters),
+              parent: classDeclaration,
+              requiredParameterCount:
+                  _getFormalParameterRequiredCount(parameters),
+              returnType: node.name.name,
+            );
+            hasConstructor = true;
+          }
+        }
+
+        if (!hasConstructor) {
+          classDeclaration.children.add(Declaration(
+            children: [],
+            defaultArgumentListString: null,
+            defaultArgumentListTextRanges: null,
+            docComplete: null,
+            docSummary: null,
+            isAbstract: false,
+            isConst: false,
+            isDeprecated: false,
+            isFinal: false,
+            kind: DeclarationKind.CONSTRUCTOR,
+            locationOffset: -1,
+            locationPath: path,
+            name: '',
+            locationStartColumn: 0,
+            locationStartLine: 0,
+            parameters: '()',
+            parameterNames: [],
+            parameterTypes: [],
+            parent: classDeclaration,
+            relevanceTags: null,
+            requiredParameterCount: 0,
+            returnType: node.name.name,
+            typeParameters: null,
+          ));
+        }
       } else if (node is ClassTypeAlias) {
         addDeclaration(
           isDeprecated: isDeprecated,
@@ -1186,11 +1306,13 @@
           name: node.name,
         );
       } else if (node is EnumDeclaration) {
-        addDeclaration(
+        var enumDeclaration = addDeclaration(
           isDeprecated: isDeprecated,
           kind: DeclarationKind.ENUM,
           name: node.name,
         );
+        if (enumDeclaration == null) continue;
+
         for (var constant in node.constants) {
           setDartDoc(constant);
           var isDeprecated = _hasDeprecatedAnnotation(constant);
@@ -1198,7 +1320,7 @@
             isDeprecated: isDeprecated,
             kind: DeclarationKind.ENUM_CONSTANT,
             name: constant.name,
-            name2: node.name,
+            parent: enumDeclaration,
           );
         }
       } else if (node is FunctionDeclaration) {
@@ -1241,6 +1363,8 @@
         }
       } else if (node is GenericTypeAlias) {
         var functionType = node.functionType;
+        if (functionType == null) continue;
+
         var parameters = functionType.parameters;
         addDeclaration(
           isDeprecated: isDeprecated,
@@ -1277,10 +1401,47 @@
     }
   }
 
-  void _computeRelevanceTagsForLibraryDeclarations() {
-    for (var declaration in libraryDeclarations) {
+  void _computeRelevanceTags(List<Declaration> declarations) {
+    for (var declaration in declarations) {
       declaration._relevanceTags ??=
           RelevanceTags._forDeclaration(uriStr, declaration);
+      _computeRelevanceTags(declaration.children);
+    }
+  }
+
+  void _extractDartdocInfoFromUnit(CompilationUnit unit) {
+    DartdocDirectiveInfo info = new DartdocDirectiveInfo();
+    for (Directive directive in unit.directives) {
+      Comment comment = directive.documentationComment;
+      if (comment != null) {
+        info.extractTemplate(getCommentNodeRawText(comment));
+      }
+    }
+    for (CompilationUnitMember declaration in unit.declarations) {
+      Comment comment = declaration.documentationComment;
+      if (comment != null) {
+        info.extractTemplate(getCommentNodeRawText(comment));
+      }
+      if (declaration is ClassOrMixinDeclaration) {
+        for (ClassMember member in declaration.members) {
+          Comment comment = member.documentationComment;
+          if (comment != null) {
+            info.extractTemplate(getCommentNodeRawText(comment));
+          }
+        }
+      } else if (declaration is EnumDeclaration) {
+        for (EnumConstantDeclaration constant in declaration.constants) {
+          Comment comment = constant.documentationComment;
+          if (comment != null) {
+            info.extractTemplate(getCommentNodeRawText(comment));
+          }
+        }
+      }
+    }
+    Map<String, String> templateMap = info.templateMap;
+    for (String name in templateMap.keys) {
+      templateNames.add(name);
+      templateValues.add(templateMap[name]);
     }
   }
 
@@ -1307,6 +1468,8 @@
       declarations: fileDeclarations.map((d) {
         return _DeclarationStorage.toIdl(d);
       }).toList(),
+      directiveInfo: idl.DirectiveInfoBuilder(
+          templateNames: templateNames, templateValues: templateValues),
     );
     var bytes = builder.toBuffer();
     tracker._byteStore.put(contentKey, bytes);
@@ -1333,8 +1496,11 @@
     }).toList();
 
     fileDeclarations = idlFile.declarations.map((e) {
-      return _DeclarationStorage.fromIdl(path, e);
+      return _DeclarationStorage.fromIdl(path, null, e);
     }).toList();
+
+    templateNames = idlFile.directiveInfo.templateNames.toList();
+    templateValues = idlFile.directiveInfo.templateValues.toList();
   }
 
   static _DefaultArguments _computeDefaultArguments(
@@ -1346,6 +1512,10 @@
         if (buffer.isNotEmpty) {
           buffer.write(', ');
         }
+        if (parameter.isNamed) {
+          buffer.write(parameter.identifier.name);
+          buffer.write(': ');
+        }
         var valueOffset = buffer.length;
         buffer.write(parameter.identifier.name);
         var valueLength = buffer.length - valueOffset;
@@ -1385,7 +1555,7 @@
     if (parameters == null) return null;
 
     return parameters.parameters
-        .takeWhile((parameter) => parameter.isRequired)
+        .takeWhile((parameter) => parameter.isRequiredPositional)
         .length;
   }
 
@@ -1446,10 +1616,14 @@
     var source = StringSource(content, '');
 
     var reader = new CharSequenceReader(content);
-    var scanner = new Scanner(null, reader, errorListener);
+    // TODO(paulberry): figure out the appropriate FeatureSet to use here
+    var featureSet = FeatureSet.fromEnableFlags([]);
+    var scanner = new Scanner(null, reader, errorListener)
+      ..configureFeatures(featureSet);
     var token = scanner.tokenize();
 
-    var parser = new Parser(source, errorListener, useFasta: true);
+    var parser = new Parser(source, errorListener,
+        featureSet: featureSet, useFasta: true);
     var unit = parser.parseCompilationUnit(token);
     unit.lineInfo = LineInfo(scanner.lineStarts);
 
@@ -1487,7 +1661,11 @@
 
   @override
   List<_LibraryNode> computeDependencies() {
-    return file.exports.map((e) => e.file).map(walker.getNode).toList();
+    return file.exports
+        .map((export) => export.file)
+        .where((file) => file.isLibrary)
+        .map(walker.getNode)
+        .toList();
   }
 }
 
@@ -1501,8 +1679,11 @@
     resultSet.addAll(file.libraryDeclarations);
 
     for (var export in file.exports) {
-      var exportedDeclarations = export.file.exportedDeclarations;
-      resultSet.addAll(export.filter(exportedDeclarations));
+      var file = export.file;
+      if (file.isLibrary) {
+        var exportedDeclarations = file.exportedDeclarations;
+        resultSet.addAll(export.filter(exportedDeclarations));
+      }
     }
 
     file.exportedDeclarations = resultSet.toList();
@@ -1550,7 +1731,7 @@
   static Set<Declaration> _newDeclarationSet() {
     return HashSet<Declaration>(
       hashCode: (e) => e.name.hashCode,
-      equals: (a, b) => a.name == b.name && a.name2 == b.name2,
+      equals: (a, b) => a.name == b.name,
     );
   }
 }
diff --git a/analyzer/lib/src/source/custom_resolver.dart b/analyzer/lib/src/source/custom_resolver.dart
index 4e2c79a..0ce922e 100644
--- a/analyzer/lib/src/source/custom_resolver.dart
+++ b/analyzer/lib/src/source/custom_resolver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/source/package_map_provider.dart b/analyzer/lib/src/source/package_map_provider.dart
index dff066c..69053ba 100644
--- a/analyzer/lib/src/source/package_map_provider.dart
+++ b/analyzer/lib/src/source/package_map_provider.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/src/source/package_map_resolver.dart b/analyzer/lib/src/source/package_map_resolver.dart
index b325201..7d9fbf5 100644
--- a/analyzer/lib/src/source/package_map_resolver.dart
+++ b/analyzer/lib/src/source/package_map_resolver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/src/source/path_filter.dart b/analyzer/lib/src/source/path_filter.dart
index c43cae1..57aa87e 100644
--- a/analyzer/lib/src/source/path_filter.dart
+++ b/analyzer/lib/src/source/path_filter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/source/sdk_ext.dart b/analyzer/lib/src/source/sdk_ext.dart
index 30be82a..32a1e5b 100644
--- a/analyzer/lib/src/source/sdk_ext.dart
+++ b/analyzer/lib/src/source/sdk_ext.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/summary/api_signature.dart b/analyzer/lib/src/summary/api_signature.dart
index 80937d6..c86d8b8 100644
--- a/analyzer/lib/src/summary/api_signature.dart
+++ b/analyzer/lib/src/summary/api_signature.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/summary/base.dart b/analyzer/lib/src/summary/base.dart
index 6793692..93215cf 100644
--- a/analyzer/lib/src/summary/base.dart
+++ b/analyzer/lib/src/summary/base.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, 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/analyzer/lib/src/summary/expr_builder.dart b/analyzer/lib/src/summary/expr_builder.dart
index 960e342..7f07f7e 100644
--- a/analyzer/lib/src/summary/expr_builder.dart
+++ b/analyzer/lib/src/summary/expr_builder.dart
@@ -42,11 +42,11 @@
 
   // The stack of values. Note that they are usually [Expression]s, but may be
   // any [CollectionElement] to support map/set/list literals.
-  final List<CollectionElement> stack = <CollectionElement>[];
+  final List<AstNode> stack = <AstNode>[];
 
   final List<UnlinkedExecutable> localFunctions;
 
-  final Map<String, ParameterElement> parametersInScope;
+  final _VariablesInScope variablesInScope;
 
   ExprBuilder(
     this.resynthesizer,
@@ -54,10 +54,9 @@
     this._uc, {
     this.requireValidConst: true,
     this.localFunctions,
-    Map<String, ParameterElement> parametersInScope,
+    _VariablesInScope variablesInScope,
     this.becomeSetOrMap: true,
-  })  : this.parametersInScope =
-            parametersInScope ?? _parametersInScope(context),
+  })  : this.variablesInScope = variablesInScope ?? _parametersInScope(context),
         this.isSpreadOrControlFlowEnabled = _isSpreadOrControlFlowEnabled(
             (resynthesizer.library.context.analysisOptions
                     as AnalysisOptionsImpl)
@@ -69,6 +68,7 @@
     if (requireValidConst && !_uc.isValidConst) {
       return null;
     }
+    int startingVariableCount = variablesInScope.count;
     for (UnlinkedExprOperation operation in _uc.operations) {
       switch (operation) {
         case UnlinkedExprOperation.pushNull:
@@ -146,6 +146,9 @@
         case UnlinkedExprOperation.bitShiftRight:
           _pushBinary(TokenType.GT_GT);
           break;
+        case UnlinkedExprOperation.bitShiftRightLogical:
+          _pushBinary(TokenType.GT_GT_GT);
+          break;
         case UnlinkedExprOperation.add:
           _pushBinary(TokenType.PLUS);
           break;
@@ -260,7 +263,7 @@
         case UnlinkedExprOperation.pushParameter:
           String name = _uc.strings[stringPtr++];
           SimpleIdentifier identifier = AstTestFactory.identifier3(name);
-          identifier.staticElement = parametersInScope[name];
+          identifier.staticElement = variablesInScope[name];
           _push(identifier);
           break;
         case UnlinkedExprOperation.ifNull:
@@ -329,6 +332,45 @@
         case UnlinkedExprOperation.ifElseElement:
           _pushIfElement(true);
           break;
+        case UnlinkedExprOperation.forParts:
+          _pushForParts();
+          break;
+        case UnlinkedExprOperation.forElement:
+          _pushForElement(false);
+          break;
+        case UnlinkedExprOperation.forElementWithAwait:
+          _pushForElement(true);
+          break;
+        case UnlinkedExprOperation.pushEmptyExpression:
+          _push(null);
+          break;
+        case UnlinkedExprOperation.variableDeclarationStart:
+          _variableDeclarationStart();
+          break;
+        case UnlinkedExprOperation.variableDeclaration:
+          _variableDeclaration();
+          break;
+        case UnlinkedExprOperation.forInitializerDeclarationsUntyped:
+          _forInitializerDeclarations(false);
+          break;
+        case UnlinkedExprOperation.forInitializerDeclarationsTyped:
+          _forInitializerDeclarations(true);
+          break;
+        case UnlinkedExprOperation.assignToParameter:
+          String name = _uc.strings[stringPtr++];
+          SimpleIdentifier identifier = AstTestFactory.identifier3(name);
+          identifier.staticElement = variablesInScope[name];
+          _push(_createAssignment(identifier));
+          break;
+        case UnlinkedExprOperation.forEachPartsWithIdentifier:
+          _forEachPartsWithIdentifier();
+          break;
+        case UnlinkedExprOperation.forEachPartsWithUntypedDeclaration:
+          _forEachPartsWithDeclaration(false);
+          break;
+        case UnlinkedExprOperation.forEachPartsWithTypedDeclaration:
+          _forEachPartsWithDeclaration(true);
+          break;
         case UnlinkedExprOperation.cascadeSectionBegin:
         case UnlinkedExprOperation.cascadeSectionEnd:
         case UnlinkedExprOperation.pushLocalFunctionReference:
@@ -339,6 +381,7 @@
               'Unexpected $operation in a constant expression.');
       }
     }
+    assert(startingVariableCount == variablesInScope.count);
     return stack.single;
   }
 
@@ -588,6 +631,39 @@
     return _buildIdentifierSequence(info);
   }
 
+  void _forEachPartsWithDeclaration(bool hasType) {
+    var iterable = _pop();
+    var name = _uc.strings[stringPtr++];
+    var element = LocalVariableElementImpl(name, -1);
+    var keyword = hasType ? null : Keyword.VAR;
+    var type = hasType ? _newTypeName() : null;
+    var loopVariable = AstTestFactory.declaredIdentifier2(keyword, type, name);
+    loopVariable.identifier.staticElement = element;
+    if (hasType) {
+      element.type = type.type;
+    }
+    _pushNode(
+        AstTestFactory.forEachPartsWithDeclaration(loopVariable, iterable));
+    variablesInScope.push(element);
+  }
+
+  void _forEachPartsWithIdentifier() {
+    var iterable = _pop();
+    SimpleIdentifier identifier = _pop();
+    _pushNode(AstTestFactory.forEachPartsWithIdentifier(identifier, iterable));
+  }
+
+  void _forInitializerDeclarations(bool hasType) {
+    var count = _uc.ints[intPtr++];
+    var variables = List<VariableDeclaration>.filled(count, null);
+    for (int i = 0; i < count; i++) {
+      variables[count - 1 - i] = _popNode();
+    }
+    var type = hasType ? _newTypeName() : null;
+    var keyword = hasType ? null : Keyword.VAR;
+    _pushNode(AstTestFactory.variableDeclarationList(keyword, type, variables));
+  }
+
   PropertyAccessorElement _getStringLengthElement() =>
       resynthesizer.typeProvider.stringType.getGetter('length');
 
@@ -597,9 +673,10 @@
     simpleParam.identifier.staticElement = param;
     simpleParam.declaredElement = param;
     var unlinkedParam = (param as ParameterElementImpl).unlinkedParam;
-    if (unlinkedParam.kind == UnlinkedParamKind.positional) {
+    if (unlinkedParam.kind == UnlinkedParamKind.optionalPositional) {
       return AstTestFactory.positionalFormalParameter(simpleParam, null);
-    } else if (unlinkedParam.kind == UnlinkedParamKind.named) {
+    } else if (unlinkedParam.kind == UnlinkedParamKind.requiredNamed ||
+        unlinkedParam.kind == UnlinkedParamKind.optionalNamed) {
       return AstTestFactory.namedFormalParameter(simpleParam, null);
     } else {
       return simpleParam;
@@ -629,9 +706,12 @@
 
   Expression _pop() => stack.removeLast() as Expression;
 
-  CollectionElement _popCollectionElement() => stack.removeLast();
+  CollectionElement _popCollectionElement() =>
+      stack.removeLast() as CollectionElement;
 
-  void _push(CollectionElement expr) {
+  AstNode _popNode() => stack.removeLast();
+
+  void _push(Expression expr) {
     stack.add(expr);
   }
 
@@ -656,11 +736,43 @@
     _push(AstTestFactory.propertyAccess(target, propertyNode));
   }
 
+  void _pushForElement(bool hasAwait) {
+    var body = _popCollectionElement();
+    var forLoopParts = _popNode() as ForLoopParts;
+    if (forLoopParts is ForPartsWithDeclarations) {
+      variablesInScope.pop(forLoopParts.variables.variables.length);
+    } else if (forLoopParts is ForEachPartsWithDeclaration) {
+      variablesInScope.pop(1);
+    }
+    _pushCollectionElement(
+        AstTestFactory.forElement(forLoopParts, body, hasAwait: hasAwait));
+  }
+
+  void _pushForParts() {
+    var updaterCount = _uc.ints[intPtr++];
+    var updaters = <Expression>[];
+    for (int i = 0; i < updaterCount; i++) {
+      updaters.insert(0, _pop());
+    }
+    Expression condition = _pop();
+    AstNode initialization = _popNode();
+    if (initialization is Expression || initialization == null) {
+      _pushNode(AstTestFactory.forPartsWithExpression(
+          initialization, condition, updaters));
+    } else if (initialization is VariableDeclarationList) {
+      _pushNode(AstTestFactory.forPartsWithDeclarations(
+          initialization, condition, updaters));
+    } else {
+      throw StateError('Unrecognized for parts');
+    }
+  }
+
   void _pushIfElement(bool hasElse) {
     CollectionElement elseElement = hasElse ? _popCollectionElement() : null;
     CollectionElement thenElement = _popCollectionElement();
     Expression condition = _pop();
-    _push(AstTestFactory.ifElement(condition, thenElement, elseElement));
+    _pushCollectionElement(
+        AstTestFactory.ifElement(condition, thenElement, elseElement));
   }
 
   void _pushInstanceCreation() {
@@ -794,12 +906,10 @@
     assert(popCount == 0);
     int functionIndex = _uc.ints[intPtr++];
     var localFunction = localFunctions[functionIndex];
-    var parametersInScope =
-        new Map<String, ParameterElement>.from(this.parametersInScope);
     var functionElement =
         new FunctionElementImpl.forSerialized(localFunction, context);
     for (ParameterElementImpl parameter in functionElement.parameters) {
-      parametersInScope[parameter.name] = parameter;
+      variablesInScope.push(parameter);
       if (parameter.unlinkedParam.type == null) {
         // Store a type of `dynamic` for the parameter; this prevents
         // resynthesis from trying to read a type out of the summary (which
@@ -823,12 +933,13 @@
       var bodyExpr = new ExprBuilder(
               resynthesizer, functionElement, localFunction.bodyExpr,
               requireValidConst: requireValidConst,
-              parametersInScope: parametersInScope,
+              variablesInScope: variablesInScope,
               localFunctions: localFunction.localFunctions)
           .build();
       functionBody = astFactory.expressionFunctionBody(asyncKeyword,
           TokenFactory.tokenFromType(TokenType.FUNCTION), bodyExpr, null);
     }
+    variablesInScope.pop(functionElement.parameters.length);
     FunctionExpressionImpl functionExpression = astFactory.functionExpression(
         null, AstTestFactory.formalParameterList(parameters), functionBody);
     functionExpression.declaredElement = functionElement;
@@ -851,15 +962,11 @@
         : typeArguments.arguments[1].type;
     var staticType =
         resynthesizer.typeProvider.mapType.instantiate([keyType, valueType]);
-    if (isSpreadOrControlFlowEnabled) {
-      _push(
-          AstTestFactory.setOrMapLiteral(Keyword.CONST, typeArguments, entries)
-            ..staticType = staticType);
-    } else {
-      // ignore: deprecated_member_use_from_same_package
-      _push(AstTestFactory.mapLiteral(Keyword.CONST, typeArguments, entries)
-        ..staticType = staticType);
-    }
+    SetOrMapLiteralImpl literal =
+        AstTestFactory.setOrMapLiteral(Keyword.CONST, typeArguments, entries);
+    literal.becomeMap();
+    literal.staticType = staticType;
+    _push(literal);
   }
 
   void _pushMapLiteralEntry() {
@@ -868,6 +975,10 @@
     _pushCollectionElement(AstTestFactory.mapLiteralEntry2(key, value));
   }
 
+  void _pushNode(AstNode node) {
+    stack.add(node);
+  }
+
   void _pushPrefix(TokenType operator) {
     Expression operand = _pop();
     _push(AstTestFactory.prefixExpression(operator, operand));
@@ -883,8 +994,10 @@
     for (int i = 0; i < count; i++) {
       elements.insert(0, _pop());
     }
-    // ignore: deprecated_member_use_from_same_package
-    _push(AstTestFactory.setLiteral(Keyword.CONST, typeArguments, elements));
+    SetOrMapLiteralImpl literal =
+        AstTestFactory.setOrMapLiteral(Keyword.CONST, typeArguments, elements);
+    literal.becomeSet();
+    _push(literal);
   }
 
   void _pushSetOrMap(TypeArgumentList typeArguments) {
@@ -938,7 +1051,7 @@
 
   void _pushSpread(TokenType operator) {
     Expression operand = _pop();
-    _push(AstTestFactory.spreadElement(operator, operand));
+    _pushCollectionElement(AstTestFactory.spreadElement(operator, operand));
   }
 
   List<Expression> _removeTopExpressions(int count) {
@@ -949,16 +1062,31 @@
     return items;
   }
 
+  void _variableDeclaration() {
+    var index = _uc.ints[intPtr++];
+    var element = variablesInScope.recent(index);
+    var initializer = _pop();
+    var variableDeclaration =
+        AstTestFactory.variableDeclaration2(element.name, initializer);
+    variableDeclaration.name.staticElement = element;
+    _pushNode(variableDeclaration);
+  }
+
+  void _variableDeclarationStart() {
+    var name = _uc.strings[stringPtr++];
+    variablesInScope.push(LocalVariableElementImpl(name, -1));
+  }
+
   /// Figures out the default value of [parametersInScope] based on [context].
   ///
   /// If [context] is (or contains) a constructor, then its parameters are used.
   /// Otherwise, no parameters are considered to be in scope.
-  static Map<String, ParameterElement> _parametersInScope(Element context) {
-    var result = <String, ParameterElement>{};
+  static _VariablesInScope _parametersInScope(Element context) {
+    var result = _VariablesInScope();
     for (Element e = context; e != null; e = e.enclosingElement) {
       if (e is ConstructorElement) {
         for (var parameter in e.parameters) {
-          result[parameter.name] = parameter;
+          result.push(parameter);
         }
         return result;
       }
@@ -966,3 +1094,37 @@
     return result;
   }
 }
+
+/// Tracks the set of variables that are in scope while resynthesizing an
+/// expression from a summary.
+class _VariablesInScope {
+  final _variableElements = <VariableElement>[];
+
+  /// Returns the number of variables that have been pushed but not popped.
+  int get count => _variableElements.length;
+
+  /// Looks up the variable with the given [name].  Returns `null` if no
+  /// variable is found.
+  VariableElement operator [](String name) {
+    for (int i = _variableElements.length - 1; i >= 0; i--) {
+      if (_variableElements[i].name == name) return _variableElements[i];
+    }
+    return null;
+  }
+
+  /// Un-does the effect of the last [count] calls to `push`.
+  void pop(int count) {
+    _variableElements.length -= count;
+  }
+
+  /// Stores a new declaration based on the given [variableElement].  The
+  /// declaration shadows any previous declaration with the same name.
+  void push(VariableElement variableElement) {
+    _variableElements.add(variableElement);
+  }
+
+  /// Retrieves the [index]th most recently pushed element (that hasn't been
+  /// popped).  [index] counts from zero.
+  VariableElement recent(int index) =>
+      _variableElements[_variableElements.length - 1 - index];
+}
diff --git a/analyzer/lib/src/summary/format.dart b/analyzer/lib/src/summary/format.dart
index ca27841..c0551e8 100644
--- a/analyzer/lib/src/summary/format.dart
+++ b/analyzer/lib/src/summary/format.dart
@@ -1,9 +1,11 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 //
 // This file has been automatically generated.  Please do not edit it manually.
-// To regenerate the file, use the script "pkg/analyzer/tool/generate_files".
+// To regenerate the file, use the SDK script
+// "pkg/analyzer/tool/summary/generate.dart $IDL_FILE_PATH",
+// or "pkg/analyzer/tool/generate_files" for the analyzer package IDL/sources.
 
 library analyzer.src.summary.format;
 
@@ -45,6 +47,22 @@
   }
 }
 
+class _EntityRefNullabilitySuffixReader
+    extends fb.Reader<idl.EntityRefNullabilitySuffix> {
+  const _EntityRefNullabilitySuffixReader() : super();
+
+  @override
+  int get size => 1;
+
+  @override
+  idl.EntityRefNullabilitySuffix read(fb.BufferContext bc, int offset) {
+    int index = const fb.Uint8Reader().read(bc, offset);
+    return index < idl.EntityRefNullabilitySuffix.values.length
+        ? idl.EntityRefNullabilitySuffix.values[index]
+        : idl.EntityRefNullabilitySuffix.starOrIrrelevant;
+  }
+}
+
 class _IndexNameKindReader extends fb.Reader<idl.IndexNameKind> {
   const _IndexNameKindReader() : super();
 
@@ -119,7 +137,7 @@
     int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.LinkedNodeFormalParameterKind.values.length
         ? idl.LinkedNodeFormalParameterKind.values[index]
-        : idl.LinkedNodeFormalParameterKind.required;
+        : idl.LinkedNodeFormalParameterKind.requiredPositional;
   }
 }
 
@@ -274,7 +292,7 @@
     int index = const fb.Uint8Reader().read(bc, offset);
     return index < idl.UnlinkedParamKind.values.length
         ? idl.UnlinkedParamKind.values[index]
-        : idl.UnlinkedParamKind.required;
+        : idl.UnlinkedParamKind.requiredPositional;
   }
 }
 
@@ -320,7 +338,7 @@
   String get exception => _exception ??= '';
 
   /// The exception string.
-  void set exception(String value) {
+  set exception(String value) {
     this._exception = value;
   }
 
@@ -329,7 +347,7 @@
       _files ??= <AnalysisDriverExceptionFileBuilder>[];
 
   /// The state of files when the exception happened.
-  void set files(List<AnalysisDriverExceptionFileBuilder> value) {
+  set files(List<AnalysisDriverExceptionFileBuilder> value) {
     this._files = value;
   }
 
@@ -337,7 +355,7 @@
   String get path => _path ??= '';
 
   /// The path of the file being analyzed when the exception happened.
-  void set path(String value) {
+  set path(String value) {
     this._path = value;
   }
 
@@ -345,7 +363,7 @@
   String get stackTrace => _stackTrace ??= '';
 
   /// The exception stack trace string.
-  void set stackTrace(String value) {
+  set stackTrace(String value) {
     this._stackTrace = value;
   }
 
@@ -359,16 +377,12 @@
         _path = path,
         _stackTrace = stackTrace;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _files?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._path ?? '');
     signature.addString(this._exception ?? '');
@@ -515,7 +529,7 @@
   String get content => _content ??= '';
 
   /// The content of the file.
-  void set content(String value) {
+  set content(String value) {
     this._content = value;
   }
 
@@ -523,7 +537,7 @@
   String get path => _path ??= '';
 
   /// The path of the file.
-  void set path(String value) {
+  set path(String value) {
     this._path = value;
   }
 
@@ -531,14 +545,10 @@
       : _content = content,
         _path = path;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._path ?? '');
     signature.addString(this._content ?? '');
@@ -629,7 +639,7 @@
       _errors ??= <AnalysisDriverUnitErrorBuilder>[];
 
   /// The full list of analysis errors, both syntactic and semantic.
-  void set errors(List<AnalysisDriverUnitErrorBuilder> value) {
+  set errors(List<AnalysisDriverUnitErrorBuilder> value) {
     this._errors = value;
   }
 
@@ -637,7 +647,7 @@
   AnalysisDriverUnitIndexBuilder get index => _index;
 
   /// The index of the unit.
-  void set index(AnalysisDriverUnitIndexBuilder value) {
+  set index(AnalysisDriverUnitIndexBuilder value) {
     this._index = value;
   }
 
@@ -647,17 +657,13 @@
       : _errors = errors,
         _index = index;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _errors?.forEach((b) => b.flushInformative());
     _index?.flushInformative();
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._errors == null) {
       signature.addInt(0);
@@ -773,7 +779,7 @@
   /// The names of defined instance members.
   /// They are indexes into [AnalysisDriverUnitError.strings] list.
   /// The list is sorted in ascending order.
-  void set members(List<int> value) {
+  set members(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._members = value;
   }
@@ -783,7 +789,7 @@
 
   /// The name of the class.
   /// It is an index into [AnalysisDriverUnitError.strings] list.
-  void set name(int value) {
+  set name(int value) {
     assert(value == null || value >= 0);
     this._name = value;
   }
@@ -792,14 +798,10 @@
       : _members = members,
         _name = name;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addInt(this._name ?? 0);
     if (this._members == null) {
@@ -895,7 +897,7 @@
   String get correction => _correction ??= '';
 
   /// The optional correction hint for the error.
-  void set correction(String value) {
+  set correction(String value) {
     this._correction = value;
   }
 
@@ -903,7 +905,7 @@
   int get length => _length ??= 0;
 
   /// The length of the error in the file.
-  void set length(int value) {
+  set length(int value) {
     assert(value == null || value >= 0);
     this._length = value;
   }
@@ -912,7 +914,7 @@
   String get message => _message ??= '';
 
   /// The message of the error.
-  void set message(String value) {
+  set message(String value) {
     this._message = value;
   }
 
@@ -920,7 +922,7 @@
   int get offset => _offset ??= 0;
 
   /// The offset from the beginning of the file.
-  void set offset(int value) {
+  set offset(int value) {
     assert(value == null || value >= 0);
     this._offset = value;
   }
@@ -929,7 +931,7 @@
   String get uniqueName => _uniqueName ??= '';
 
   /// The unique name of the error code.
-  void set uniqueName(String value) {
+  set uniqueName(String value) {
     this._uniqueName = value;
   }
 
@@ -945,14 +947,10 @@
         _offset = offset,
         _uniqueName = uniqueName;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addInt(this._offset ?? 0);
     signature.addInt(this._length ?? 0);
@@ -1104,7 +1102,7 @@
 
   /// Each item of this list corresponds to a unique referenced element.  It is
   /// the kind of the synthetic element.
-  void set elementKinds(List<idl.IndexSyntheticElementKind> value) {
+  set elementKinds(List<idl.IndexSyntheticElementKind> value) {
     this._elementKinds = value;
   }
 
@@ -1117,7 +1115,7 @@
   /// is a top-level element.  The list is sorted in ascending order, so that
   /// the client can quickly check whether an element is referenced in this
   /// index.
-  void set elementNameClassMemberIds(List<int> value) {
+  set elementNameClassMemberIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameClassMemberIds = value;
   }
@@ -1129,7 +1127,7 @@
   /// the identifier of the named parameter name, or `null` if the element is
   /// not a named parameter.  The list is sorted in ascending order, so that the
   /// client can quickly check whether an element is referenced in this index.
-  void set elementNameParameterIds(List<int> value) {
+  set elementNameParameterIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameParameterIds = value;
   }
@@ -1142,7 +1140,7 @@
   /// the identifier of the top-level element name, or `null` if the element is
   /// the unit.  The list is sorted in ascending order, so that the client can
   /// quickly check whether an element is referenced in this index.
-  void set elementNameUnitMemberIds(List<int> value) {
+  set elementNameUnitMemberIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameUnitMemberIds = value;
   }
@@ -1153,7 +1151,7 @@
   /// Each item of this list corresponds to a unique referenced element.  It is
   /// the index into [unitLibraryUris] and [unitUnitUris] for the library
   /// specific unit where the element is declared.
-  void set elementUnits(List<int> value) {
+  set elementUnits(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementUnits = value;
   }
@@ -1162,7 +1160,7 @@
   int get nullStringId => _nullStringId ??= 0;
 
   /// Identifier of the null string in [strings].
-  void set nullStringId(int value) {
+  set nullStringId(int value) {
     assert(value == null || value >= 0);
     this._nullStringId = value;
   }
@@ -1173,7 +1171,7 @@
   /// List of unique element strings used in this index.  The list is sorted in
   /// ascending order, so that the client can quickly check the presence of a
   /// string in this index.
-  void set strings(List<String> value) {
+  set strings(List<String> value) {
     this._strings = value;
   }
 
@@ -1182,7 +1180,7 @@
       _subtypes ??= <AnalysisDriverSubtypeBuilder>[];
 
   /// The list of classes declared in the unit.
-  void set subtypes(List<AnalysisDriverSubtypeBuilder> value) {
+  set subtypes(List<AnalysisDriverSubtypeBuilder> value) {
     this._subtypes = value;
   }
 
@@ -1193,7 +1191,7 @@
   /// in [subtypes].  They are indexes into [strings] list. The list is sorted
   /// in ascending order.  There might be more than one element with the same
   /// value if there is more than one subtype of this supertype.
-  void set supertypes(List<int> value) {
+  set supertypes(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._supertypes = value;
   }
@@ -1204,7 +1202,7 @@
   /// Each item of this list corresponds to the library URI of a unique library
   /// specific unit referenced in the index.  It is an index into [strings]
   /// list.
-  void set unitLibraryUris(List<int> value) {
+  set unitLibraryUris(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._unitLibraryUris = value;
   }
@@ -1215,7 +1213,7 @@
   /// Each item of this list corresponds to the unit URI of a unique library
   /// specific unit referenced in the index.  It is an index into [strings]
   /// list.
-  void set unitUnitUris(List<int> value) {
+  set unitUnitUris(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._unitUnitUris = value;
   }
@@ -1226,7 +1224,7 @@
 
   /// Each item of this list is the `true` if the corresponding element usage
   /// is qualified with some prefix.
-  void set usedElementIsQualifiedFlags(List<bool> value) {
+  set usedElementIsQualifiedFlags(List<bool> value) {
     this._usedElementIsQualifiedFlags = value;
   }
 
@@ -1235,7 +1233,7 @@
       _usedElementKinds ??= <idl.IndexRelationKind>[];
 
   /// Each item of this list is the kind of the element usage.
-  void set usedElementKinds(List<idl.IndexRelationKind> value) {
+  set usedElementKinds(List<idl.IndexRelationKind> value) {
     this._usedElementKinds = value;
   }
 
@@ -1243,7 +1241,7 @@
   List<int> get usedElementLengths => _usedElementLengths ??= <int>[];
 
   /// Each item of this list is the length of the element usage.
-  void set usedElementLengths(List<int> value) {
+  set usedElementLengths(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElementLengths = value;
   }
@@ -1253,7 +1251,7 @@
 
   /// Each item of this list is the offset of the element usage relative to the
   /// beginning of the file.
-  void set usedElementOffsets(List<int> value) {
+  set usedElementOffsets(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElementOffsets = value;
   }
@@ -1265,7 +1263,7 @@
   /// [elementNameUnitMemberIds], [elementNameClassMemberIds] and
   /// [elementNameParameterIds].  The list is sorted in ascending order, so
   /// that the client can quickly find element references in this index.
-  void set usedElements(List<int> value) {
+  set usedElements(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElements = value;
   }
@@ -1276,7 +1274,7 @@
 
   /// Each item of this list is the `true` if the corresponding name usage
   /// is qualified with some prefix.
-  void set usedNameIsQualifiedFlags(List<bool> value) {
+  set usedNameIsQualifiedFlags(List<bool> value) {
     this._usedNameIsQualifiedFlags = value;
   }
 
@@ -1285,7 +1283,7 @@
       _usedNameKinds ??= <idl.IndexRelationKind>[];
 
   /// Each item of this list is the kind of the name usage.
-  void set usedNameKinds(List<idl.IndexRelationKind> value) {
+  set usedNameKinds(List<idl.IndexRelationKind> value) {
     this._usedNameKinds = value;
   }
 
@@ -1294,7 +1292,7 @@
 
   /// Each item of this list is the offset of the name usage relative to the
   /// beginning of the file.
-  void set usedNameOffsets(List<int> value) {
+  set usedNameOffsets(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedNameOffsets = value;
   }
@@ -1305,7 +1303,7 @@
   /// Each item of this list is the index into [strings] for a used name.  The
   /// list is sorted in ascending order, so that the client can quickly find
   /// whether a name is used in this index.
-  void set usedNames(List<int> value) {
+  set usedNames(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedNames = value;
   }
@@ -1352,16 +1350,12 @@
         _usedNameOffsets = usedNameOffsets,
         _usedNames = usedNames;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _subtypes?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._strings == null) {
       signature.addInt(0);
@@ -1952,13 +1946,14 @@
   List<String> _referencedNames;
   List<String> _subtypedNames;
   UnlinkedUnitBuilder _unit;
+  UnlinkedUnit2Builder _unit2;
 
   @override
   List<String> get definedClassMemberNames =>
       _definedClassMemberNames ??= <String>[];
 
   /// List of class member names defined by the unit.
-  void set definedClassMemberNames(List<String> value) {
+  set definedClassMemberNames(List<String> value) {
     this._definedClassMemberNames = value;
   }
 
@@ -1966,7 +1961,7 @@
   List<String> get definedTopLevelNames => _definedTopLevelNames ??= <String>[];
 
   /// List of top-level names defined by the unit.
-  void set definedTopLevelNames(List<String> value) {
+  set definedTopLevelNames(List<String> value) {
     this._definedTopLevelNames = value;
   }
 
@@ -1974,7 +1969,7 @@
   List<String> get referencedNames => _referencedNames ??= <String>[];
 
   /// List of external names referenced by the unit.
-  void set referencedNames(List<String> value) {
+  set referencedNames(List<String> value) {
     this._referencedNames = value;
   }
 
@@ -1983,7 +1978,7 @@
 
   /// List of names which are used in `extends`, `with` or `implements` clauses
   /// in the file. Import prefixes and type arguments are not included.
-  void set subtypedNames(List<String> value) {
+  set subtypedNames(List<String> value) {
     this._subtypedNames = value;
   }
 
@@ -1991,32 +1986,39 @@
   UnlinkedUnitBuilder get unit => _unit;
 
   /// Unlinked information for the unit.
-  void set unit(UnlinkedUnitBuilder value) {
+  set unit(UnlinkedUnitBuilder value) {
     this._unit = value;
   }
 
+  @override
+  UnlinkedUnit2Builder get unit2 => _unit2;
+
+  /// Unlinked information for the unit.
+  set unit2(UnlinkedUnit2Builder value) {
+    this._unit2 = value;
+  }
+
   AnalysisDriverUnlinkedUnitBuilder(
       {List<String> definedClassMemberNames,
       List<String> definedTopLevelNames,
       List<String> referencedNames,
       List<String> subtypedNames,
-      UnlinkedUnitBuilder unit})
+      UnlinkedUnitBuilder unit,
+      UnlinkedUnit2Builder unit2})
       : _definedClassMemberNames = definedClassMemberNames,
         _definedTopLevelNames = definedTopLevelNames,
         _referencedNames = referencedNames,
         _subtypedNames = subtypedNames,
-        _unit = unit;
+        _unit = unit,
+        _unit2 = unit2;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _unit?.flushInformative();
+    _unit2?.flushInformative();
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._referencedNames == null) {
       signature.addInt(0);
@@ -2052,6 +2054,8 @@
         signature.addString(x);
       }
     }
+    signature.addBool(this._unit2 != null);
+    this._unit2?.collectApiSignature(signature);
   }
 
   List<int> toBuffer() {
@@ -2065,6 +2069,7 @@
     fb.Offset offset_referencedNames;
     fb.Offset offset_subtypedNames;
     fb.Offset offset_unit;
+    fb.Offset offset_unit2;
     if (!(_definedClassMemberNames == null ||
         _definedClassMemberNames.isEmpty)) {
       offset_definedClassMemberNames = fbBuilder.writeList(
@@ -2087,6 +2092,9 @@
     if (_unit != null) {
       offset_unit = _unit.finish(fbBuilder);
     }
+    if (_unit2 != null) {
+      offset_unit2 = _unit2.finish(fbBuilder);
+    }
     fbBuilder.startTable();
     if (offset_definedClassMemberNames != null) {
       fbBuilder.addOffset(3, offset_definedClassMemberNames);
@@ -2103,6 +2111,9 @@
     if (offset_unit != null) {
       fbBuilder.addOffset(1, offset_unit);
     }
+    if (offset_unit2 != null) {
+      fbBuilder.addOffset(5, offset_unit2);
+    }
     return fbBuilder.endTable();
   }
 }
@@ -2136,6 +2147,7 @@
   List<String> _referencedNames;
   List<String> _subtypedNames;
   idl.UnlinkedUnit _unit;
+  idl.UnlinkedUnit2 _unit2;
 
   @override
   List<String> get definedClassMemberNames {
@@ -2172,6 +2184,12 @@
     _unit ??= const _UnlinkedUnitReader().vTableGet(_bc, _bcOffset, 1, null);
     return _unit;
   }
+
+  @override
+  idl.UnlinkedUnit2 get unit2 {
+    _unit2 ??= const _UnlinkedUnit2Reader().vTableGet(_bc, _bcOffset, 5, null);
+    return _unit2;
+  }
 }
 
 abstract class _AnalysisDriverUnlinkedUnitMixin
@@ -2187,6 +2205,7 @@
       _result["referencedNames"] = referencedNames;
     if (subtypedNames.isNotEmpty) _result["subtypedNames"] = subtypedNames;
     if (unit != null) _result["unit"] = unit.toJson();
+    if (unit2 != null) _result["unit2"] = unit2.toJson();
     return _result;
   }
 
@@ -2197,6 +2216,7 @@
         "referencedNames": referencedNames,
         "subtypedNames": subtypedNames,
         "unit": unit,
+        "unit2": unit2,
       };
 
   @override
@@ -2206,6 +2226,7 @@
 class AvailableDeclarationBuilder extends Object
     with _AvailableDeclarationMixin
     implements idl.AvailableDeclaration {
+  List<AvailableDeclarationBuilder> _children;
   String _defaultArgumentListString;
   List<int> _defaultArgumentListTextRanges;
   String _docComplete;
@@ -2220,7 +2241,6 @@
   int _locationStartColumn;
   int _locationStartLine;
   String _name;
-  String _name2;
   List<String> _parameterNames;
   String _parameters;
   List<String> _parameterTypes;
@@ -2230,9 +2250,17 @@
   String _typeParameters;
 
   @override
+  List<AvailableDeclarationBuilder> get children =>
+      _children ??= <AvailableDeclarationBuilder>[];
+
+  set children(List<AvailableDeclarationBuilder> value) {
+    this._children = value;
+  }
+
+  @override
   String get defaultArgumentListString => _defaultArgumentListString ??= '';
 
-  void set defaultArgumentListString(String value) {
+  set defaultArgumentListString(String value) {
     this._defaultArgumentListString = value;
   }
 
@@ -2240,7 +2268,7 @@
   List<int> get defaultArgumentListTextRanges =>
       _defaultArgumentListTextRanges ??= <int>[];
 
-  void set defaultArgumentListTextRanges(List<int> value) {
+  set defaultArgumentListTextRanges(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._defaultArgumentListTextRanges = value;
   }
@@ -2248,21 +2276,21 @@
   @override
   String get docComplete => _docComplete ??= '';
 
-  void set docComplete(String value) {
+  set docComplete(String value) {
     this._docComplete = value;
   }
 
   @override
   String get docSummary => _docSummary ??= '';
 
-  void set docSummary(String value) {
+  set docSummary(String value) {
     this._docSummary = value;
   }
 
   @override
   int get fieldMask => _fieldMask ??= 0;
 
-  void set fieldMask(int value) {
+  set fieldMask(int value) {
     assert(value == null || value >= 0);
     this._fieldMask = value;
   }
@@ -2270,28 +2298,28 @@
   @override
   bool get isAbstract => _isAbstract ??= false;
 
-  void set isAbstract(bool value) {
+  set isAbstract(bool value) {
     this._isAbstract = value;
   }
 
   @override
   bool get isConst => _isConst ??= false;
 
-  void set isConst(bool value) {
+  set isConst(bool value) {
     this._isConst = value;
   }
 
   @override
   bool get isDeprecated => _isDeprecated ??= false;
 
-  void set isDeprecated(bool value) {
+  set isDeprecated(bool value) {
     this._isDeprecated = value;
   }
 
   @override
   bool get isFinal => _isFinal ??= false;
 
-  void set isFinal(bool value) {
+  set isFinal(bool value) {
     this._isFinal = value;
   }
 
@@ -2300,14 +2328,14 @@
       _kind ??= idl.AvailableDeclarationKind.CLASS;
 
   /// The kind of the declaration.
-  void set kind(idl.AvailableDeclarationKind value) {
+  set kind(idl.AvailableDeclarationKind value) {
     this._kind = value;
   }
 
   @override
   int get locationOffset => _locationOffset ??= 0;
 
-  void set locationOffset(int value) {
+  set locationOffset(int value) {
     assert(value == null || value >= 0);
     this._locationOffset = value;
   }
@@ -2315,7 +2343,7 @@
   @override
   int get locationStartColumn => _locationStartColumn ??= 0;
 
-  void set locationStartColumn(int value) {
+  set locationStartColumn(int value) {
     assert(value == null || value >= 0);
     this._locationStartColumn = value;
   }
@@ -2323,7 +2351,7 @@
   @override
   int get locationStartLine => _locationStartLine ??= 0;
 
-  void set locationStartLine(int value) {
+  set locationStartLine(int value) {
     assert(value == null || value >= 0);
     this._locationStartLine = value;
   }
@@ -2333,37 +2361,28 @@
 
   /// The first part of the declaration name, usually the only one, for example
   /// the name of a class like `MyClass`, or a function like `myFunction`.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
   @override
-  String get name2 => _name2 ??= '';
-
-  /// The second, optional, part of the declaration name.  For example enum
-  /// constants all have the same [name], but their own [name2].
-  void set name2(String value) {
-    this._name2 = value;
-  }
-
-  @override
   List<String> get parameterNames => _parameterNames ??= <String>[];
 
-  void set parameterNames(List<String> value) {
+  set parameterNames(List<String> value) {
     this._parameterNames = value;
   }
 
   @override
   String get parameters => _parameters ??= '';
 
-  void set parameters(String value) {
+  set parameters(String value) {
     this._parameters = value;
   }
 
   @override
   List<String> get parameterTypes => _parameterTypes ??= <String>[];
 
-  void set parameterTypes(List<String> value) {
+  set parameterTypes(List<String> value) {
     this._parameterTypes = value;
   }
 
@@ -2374,14 +2393,14 @@
   /// example, function do not currently), and not every declaration has to
   /// store one (for classes it can be computed when we know the library that
   /// includes this file).
-  void set relevanceTags(List<String> value) {
+  set relevanceTags(List<String> value) {
     this._relevanceTags = value;
   }
 
   @override
   int get requiredParameterCount => _requiredParameterCount ??= 0;
 
-  void set requiredParameterCount(int value) {
+  set requiredParameterCount(int value) {
     assert(value == null || value >= 0);
     this._requiredParameterCount = value;
   }
@@ -2389,19 +2408,20 @@
   @override
   String get returnType => _returnType ??= '';
 
-  void set returnType(String value) {
+  set returnType(String value) {
     this._returnType = value;
   }
 
   @override
   String get typeParameters => _typeParameters ??= '';
 
-  void set typeParameters(String value) {
+  set typeParameters(String value) {
     this._typeParameters = value;
   }
 
   AvailableDeclarationBuilder(
-      {String defaultArgumentListString,
+      {List<AvailableDeclarationBuilder> children,
+      String defaultArgumentListString,
       List<int> defaultArgumentListTextRanges,
       String docComplete,
       String docSummary,
@@ -2415,7 +2435,6 @@
       int locationStartColumn,
       int locationStartLine,
       String name,
-      String name2,
       List<String> parameterNames,
       String parameters,
       List<String> parameterTypes,
@@ -2423,7 +2442,8 @@
       int requiredParameterCount,
       String returnType,
       String typeParameters})
-      : _defaultArgumentListString = defaultArgumentListString,
+      : _children = children,
+        _defaultArgumentListString = defaultArgumentListString,
         _defaultArgumentListTextRanges = defaultArgumentListTextRanges,
         _docComplete = docComplete,
         _docSummary = docSummary,
@@ -2437,7 +2457,6 @@
         _locationStartColumn = locationStartColumn,
         _locationStartLine = locationStartLine,
         _name = name,
-        _name2 = name2,
         _parameterNames = parameterNames,
         _parameters = parameters,
         _parameterTypes = parameterTypes,
@@ -2446,15 +2465,21 @@
         _returnType = returnType,
         _typeParameters = typeParameters;
 
-  /**
-   * Flush [informative] data recursively.
-   */
-  void flushInformative() {}
+  /// Flush [informative] data recursively.
+  void flushInformative() {
+    _children?.forEach((b) => b.flushInformative());
+  }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
+    if (this._children == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._children.length);
+      for (var x in this._children) {
+        x?.collectApiSignature(signature);
+      }
+    }
     signature.addString(this._defaultArgumentListString ?? '');
     if (this._defaultArgumentListTextRanges == null) {
       signature.addInt(0);
@@ -2476,7 +2501,6 @@
     signature.addInt(this._locationStartColumn ?? 0);
     signature.addInt(this._locationStartLine ?? 0);
     signature.addString(this._name ?? '');
-    signature.addString(this._name2 ?? '');
     if (this._parameterNames == null) {
       signature.addInt(0);
     } else {
@@ -2508,18 +2532,22 @@
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_children;
     fb.Offset offset_defaultArgumentListString;
     fb.Offset offset_defaultArgumentListTextRanges;
     fb.Offset offset_docComplete;
     fb.Offset offset_docSummary;
     fb.Offset offset_name;
-    fb.Offset offset_name2;
     fb.Offset offset_parameterNames;
     fb.Offset offset_parameters;
     fb.Offset offset_parameterTypes;
     fb.Offset offset_relevanceTags;
     fb.Offset offset_returnType;
     fb.Offset offset_typeParameters;
+    if (!(_children == null || _children.isEmpty)) {
+      offset_children = fbBuilder
+          .writeList(_children.map((b) => b.finish(fbBuilder)).toList());
+    }
     if (_defaultArgumentListString != null) {
       offset_defaultArgumentListString =
           fbBuilder.writeString(_defaultArgumentListString);
@@ -2538,9 +2566,6 @@
     if (_name != null) {
       offset_name = fbBuilder.writeString(_name);
     }
-    if (_name2 != null) {
-      offset_name2 = fbBuilder.writeString(_name2);
-    }
     if (!(_parameterNames == null || _parameterNames.isEmpty)) {
       offset_parameterNames = fbBuilder.writeList(
           _parameterNames.map((b) => fbBuilder.writeString(b)).toList());
@@ -2563,50 +2588,50 @@
       offset_typeParameters = fbBuilder.writeString(_typeParameters);
     }
     fbBuilder.startTable();
+    if (offset_children != null) {
+      fbBuilder.addOffset(0, offset_children);
+    }
     if (offset_defaultArgumentListString != null) {
-      fbBuilder.addOffset(0, offset_defaultArgumentListString);
+      fbBuilder.addOffset(1, offset_defaultArgumentListString);
     }
     if (offset_defaultArgumentListTextRanges != null) {
-      fbBuilder.addOffset(1, offset_defaultArgumentListTextRanges);
+      fbBuilder.addOffset(2, offset_defaultArgumentListTextRanges);
     }
     if (offset_docComplete != null) {
-      fbBuilder.addOffset(2, offset_docComplete);
+      fbBuilder.addOffset(3, offset_docComplete);
     }
     if (offset_docSummary != null) {
-      fbBuilder.addOffset(3, offset_docSummary);
+      fbBuilder.addOffset(4, offset_docSummary);
     }
     if (_fieldMask != null && _fieldMask != 0) {
-      fbBuilder.addUint32(4, _fieldMask);
+      fbBuilder.addUint32(5, _fieldMask);
     }
     if (_isAbstract == true) {
-      fbBuilder.addBool(5, true);
-    }
-    if (_isConst == true) {
       fbBuilder.addBool(6, true);
     }
-    if (_isDeprecated == true) {
+    if (_isConst == true) {
       fbBuilder.addBool(7, true);
     }
-    if (_isFinal == true) {
+    if (_isDeprecated == true) {
       fbBuilder.addBool(8, true);
     }
+    if (_isFinal == true) {
+      fbBuilder.addBool(9, true);
+    }
     if (_kind != null && _kind != idl.AvailableDeclarationKind.CLASS) {
-      fbBuilder.addUint8(9, _kind.index);
+      fbBuilder.addUint8(10, _kind.index);
     }
     if (_locationOffset != null && _locationOffset != 0) {
-      fbBuilder.addUint32(10, _locationOffset);
+      fbBuilder.addUint32(11, _locationOffset);
     }
     if (_locationStartColumn != null && _locationStartColumn != 0) {
-      fbBuilder.addUint32(11, _locationStartColumn);
+      fbBuilder.addUint32(12, _locationStartColumn);
     }
     if (_locationStartLine != null && _locationStartLine != 0) {
-      fbBuilder.addUint32(12, _locationStartLine);
+      fbBuilder.addUint32(13, _locationStartLine);
     }
     if (offset_name != null) {
-      fbBuilder.addOffset(13, offset_name);
-    }
-    if (offset_name2 != null) {
-      fbBuilder.addOffset(14, offset_name2);
+      fbBuilder.addOffset(14, offset_name);
     }
     if (offset_parameterNames != null) {
       fbBuilder.addOffset(15, offset_parameterNames);
@@ -2650,6 +2675,7 @@
 
   _AvailableDeclarationImpl(this._bc, this._bcOffset);
 
+  List<idl.AvailableDeclaration> _children;
   String _defaultArgumentListString;
   List<int> _defaultArgumentListTextRanges;
   String _docComplete;
@@ -2664,7 +2690,6 @@
   int _locationStartColumn;
   int _locationStartLine;
   String _name;
-  String _name2;
   List<String> _parameterNames;
   String _parameters;
   List<String> _parameterTypes;
@@ -2674,102 +2699,104 @@
   String _typeParameters;
 
   @override
+  List<idl.AvailableDeclaration> get children {
+    _children ??= const fb.ListReader<idl.AvailableDeclaration>(
+            const _AvailableDeclarationReader())
+        .vTableGet(_bc, _bcOffset, 0, const <idl.AvailableDeclaration>[]);
+    return _children;
+  }
+
+  @override
   String get defaultArgumentListString {
     _defaultArgumentListString ??=
-        const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
     return _defaultArgumentListString;
   }
 
   @override
   List<int> get defaultArgumentListTextRanges {
     _defaultArgumentListTextRanges ??=
-        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 1, const <int>[]);
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 2, const <int>[]);
     return _defaultArgumentListTextRanges;
   }
 
   @override
   String get docComplete {
-    _docComplete ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 2, '');
+    _docComplete ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 3, '');
     return _docComplete;
   }
 
   @override
   String get docSummary {
-    _docSummary ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 3, '');
+    _docSummary ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 4, '');
     return _docSummary;
   }
 
   @override
   int get fieldMask {
-    _fieldMask ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 4, 0);
+    _fieldMask ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 5, 0);
     return _fieldMask;
   }
 
   @override
   bool get isAbstract {
-    _isAbstract ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 5, false);
+    _isAbstract ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 6, false);
     return _isAbstract;
   }
 
   @override
   bool get isConst {
-    _isConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 6, false);
+    _isConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 7, false);
     return _isConst;
   }
 
   @override
   bool get isDeprecated {
-    _isDeprecated ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 7, false);
+    _isDeprecated ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 8, false);
     return _isDeprecated;
   }
 
   @override
   bool get isFinal {
-    _isFinal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 8, false);
+    _isFinal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 9, false);
     return _isFinal;
   }
 
   @override
   idl.AvailableDeclarationKind get kind {
     _kind ??= const _AvailableDeclarationKindReader()
-        .vTableGet(_bc, _bcOffset, 9, idl.AvailableDeclarationKind.CLASS);
+        .vTableGet(_bc, _bcOffset, 10, idl.AvailableDeclarationKind.CLASS);
     return _kind;
   }
 
   @override
   int get locationOffset {
     _locationOffset ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 10, 0);
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 11, 0);
     return _locationOffset;
   }
 
   @override
   int get locationStartColumn {
     _locationStartColumn ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 11, 0);
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 12, 0);
     return _locationStartColumn;
   }
 
   @override
   int get locationStartLine {
     _locationStartLine ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 12, 0);
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 13, 0);
     return _locationStartLine;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 13, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 14, '');
     return _name;
   }
 
   @override
-  String get name2 {
-    _name2 ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 14, '');
-    return _name2;
-  }
-
-  @override
   List<String> get parameterNames {
     _parameterNames ??= const fb.ListReader<String>(const fb.StringReader())
         .vTableGet(_bc, _bcOffset, 15, const <String>[]);
@@ -2821,6 +2848,8 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
+    if (children.isNotEmpty)
+      _result["children"] = children.map((_value) => _value.toJson()).toList();
     if (defaultArgumentListString != '')
       _result["defaultArgumentListString"] = defaultArgumentListString;
     if (defaultArgumentListTextRanges.isNotEmpty)
@@ -2840,7 +2869,6 @@
     if (locationStartLine != 0)
       _result["locationStartLine"] = locationStartLine;
     if (name != '') _result["name"] = name;
-    if (name2 != '') _result["name2"] = name2;
     if (parameterNames.isNotEmpty) _result["parameterNames"] = parameterNames;
     if (parameters != '') _result["parameters"] = parameters;
     if (parameterTypes.isNotEmpty) _result["parameterTypes"] = parameterTypes;
@@ -2854,6 +2882,7 @@
 
   @override
   Map<String, Object> toMap() => {
+        "children": children,
         "defaultArgumentListString": defaultArgumentListString,
         "defaultArgumentListTextRanges": defaultArgumentListTextRanges,
         "docComplete": docComplete,
@@ -2868,7 +2897,6 @@
         "locationStartColumn": locationStartColumn,
         "locationStartLine": locationStartLine,
         "name": name,
-        "name2": name2,
         "parameterNames": parameterNames,
         "parameters": parameters,
         "parameterTypes": parameterTypes,
@@ -2886,6 +2914,7 @@
     with _AvailableFileMixin
     implements idl.AvailableFile {
   List<AvailableDeclarationBuilder> _declarations;
+  DirectiveInfoBuilder _directiveInfo;
   List<AvailableFileExportBuilder> _exports;
   bool _isLibrary;
   bool _isLibraryDeprecated;
@@ -2896,16 +2925,24 @@
       _declarations ??= <AvailableDeclarationBuilder>[];
 
   /// Declarations of the file.
-  void set declarations(List<AvailableDeclarationBuilder> value) {
+  set declarations(List<AvailableDeclarationBuilder> value) {
     this._declarations = value;
   }
 
   @override
+  DirectiveInfoBuilder get directiveInfo => _directiveInfo;
+
+  /// The Dartdoc directives in the file.
+  set directiveInfo(DirectiveInfoBuilder value) {
+    this._directiveInfo = value;
+  }
+
+  @override
   List<AvailableFileExportBuilder> get exports =>
       _exports ??= <AvailableFileExportBuilder>[];
 
   /// Exports directives of the file.
-  void set exports(List<AvailableFileExportBuilder> value) {
+  set exports(List<AvailableFileExportBuilder> value) {
     this._exports = value;
   }
 
@@ -2913,7 +2950,7 @@
   bool get isLibrary => _isLibrary ??= false;
 
   /// Is `true` if this file is a library.
-  void set isLibrary(bool value) {
+  set isLibrary(bool value) {
     this._isLibrary = value;
   }
 
@@ -2921,7 +2958,7 @@
   bool get isLibraryDeprecated => _isLibraryDeprecated ??= false;
 
   /// Is `true` if this file is a library, and it is deprecated.
-  void set isLibraryDeprecated(bool value) {
+  set isLibraryDeprecated(bool value) {
     this._isLibraryDeprecated = value;
   }
 
@@ -2929,33 +2966,32 @@
   List<String> get parts => _parts ??= <String>[];
 
   /// URIs of `part` directives.
-  void set parts(List<String> value) {
+  set parts(List<String> value) {
     this._parts = value;
   }
 
   AvailableFileBuilder(
       {List<AvailableDeclarationBuilder> declarations,
+      DirectiveInfoBuilder directiveInfo,
       List<AvailableFileExportBuilder> exports,
       bool isLibrary,
       bool isLibraryDeprecated,
       List<String> parts})
       : _declarations = declarations,
+        _directiveInfo = directiveInfo,
         _exports = exports,
         _isLibrary = isLibrary,
         _isLibraryDeprecated = isLibraryDeprecated,
         _parts = parts;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _declarations?.forEach((b) => b.flushInformative());
+    _directiveInfo?.flushInformative();
     _exports?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._declarations == null) {
       signature.addInt(0);
@@ -2983,6 +3019,8 @@
         signature.addString(x);
       }
     }
+    signature.addBool(this._directiveInfo != null);
+    this._directiveInfo?.collectApiSignature(signature);
   }
 
   List<int> toBuffer() {
@@ -2992,12 +3030,16 @@
 
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset offset_declarations;
+    fb.Offset offset_directiveInfo;
     fb.Offset offset_exports;
     fb.Offset offset_parts;
     if (!(_declarations == null || _declarations.isEmpty)) {
       offset_declarations = fbBuilder
           .writeList(_declarations.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (_directiveInfo != null) {
+      offset_directiveInfo = _directiveInfo.finish(fbBuilder);
+    }
     if (!(_exports == null || _exports.isEmpty)) {
       offset_exports = fbBuilder
           .writeList(_exports.map((b) => b.finish(fbBuilder)).toList());
@@ -3010,6 +3052,9 @@
     if (offset_declarations != null) {
       fbBuilder.addOffset(0, offset_declarations);
     }
+    if (offset_directiveInfo != null) {
+      fbBuilder.addOffset(5, offset_directiveInfo);
+    }
     if (offset_exports != null) {
       fbBuilder.addOffset(1, offset_exports);
     }
@@ -3048,6 +3093,7 @@
   _AvailableFileImpl(this._bc, this._bcOffset);
 
   List<idl.AvailableDeclaration> _declarations;
+  idl.DirectiveInfo _directiveInfo;
   List<idl.AvailableFileExport> _exports;
   bool _isLibrary;
   bool _isLibraryDeprecated;
@@ -3062,6 +3108,13 @@
   }
 
   @override
+  idl.DirectiveInfo get directiveInfo {
+    _directiveInfo ??=
+        const _DirectiveInfoReader().vTableGet(_bc, _bcOffset, 5, null);
+    return _directiveInfo;
+  }
+
+  @override
   List<idl.AvailableFileExport> get exports {
     _exports ??= const fb.ListReader<idl.AvailableFileExport>(
             const _AvailableFileExportReader())
@@ -3097,6 +3150,8 @@
     if (declarations.isNotEmpty)
       _result["declarations"] =
           declarations.map((_value) => _value.toJson()).toList();
+    if (directiveInfo != null)
+      _result["directiveInfo"] = directiveInfo.toJson();
     if (exports.isNotEmpty)
       _result["exports"] = exports.map((_value) => _value.toJson()).toList();
     if (isLibrary != false) _result["isLibrary"] = isLibrary;
@@ -3109,6 +3164,7 @@
   @override
   Map<String, Object> toMap() => {
         "declarations": declarations,
+        "directiveInfo": directiveInfo,
         "exports": exports,
         "isLibrary": isLibrary,
         "isLibraryDeprecated": isLibraryDeprecated,
@@ -3130,7 +3186,7 @@
       _combinators ??= <AvailableFileExportCombinatorBuilder>[];
 
   /// Combinators contained in this export directive.
-  void set combinators(List<AvailableFileExportCombinatorBuilder> value) {
+  set combinators(List<AvailableFileExportCombinatorBuilder> value) {
     this._combinators = value;
   }
 
@@ -3138,7 +3194,7 @@
   String get uri => _uri ??= '';
 
   /// URI of the exported library.
-  void set uri(String value) {
+  set uri(String value) {
     this._uri = value;
   }
 
@@ -3147,16 +3203,12 @@
       : _combinators = combinators,
         _uri = uri;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _combinators?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._uri ?? '');
     if (this._combinators == null) {
@@ -3257,7 +3309,7 @@
   List<String> get hides => _hides ??= <String>[];
 
   /// List of names which are hidden.  Empty if this is a `show` combinator.
-  void set hides(List<String> value) {
+  set hides(List<String> value) {
     this._hides = value;
   }
 
@@ -3265,7 +3317,7 @@
   List<String> get shows => _shows ??= <String>[];
 
   /// List of names which are shown.  Empty if this is a `hide` combinator.
-  void set shows(List<String> value) {
+  set shows(List<String> value) {
     this._shows = value;
   }
 
@@ -3273,14 +3325,10 @@
       : _hides = hides,
         _shows = shows;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._shows == null) {
       signature.addInt(0);
@@ -3388,7 +3436,7 @@
   int get length => _length ??= 0;
 
   /// Length of the element code.
-  void set length(int value) {
+  set length(int value) {
     assert(value == null || value >= 0);
     this._length = value;
   }
@@ -3397,7 +3445,7 @@
   int get offset => _offset ??= 0;
 
   /// Offset of the element code relative to the beginning of the file.
-  void set offset(int value) {
+  set offset(int value) {
     assert(value == null || value >= 0);
     this._offset = value;
   }
@@ -3406,14 +3454,10 @@
       : _length = length,
         _offset = offset;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addInt(this._offset ?? 0);
     signature.addInt(this._length ?? 0);
@@ -3482,11 +3526,137 @@
   String toString() => convert.json.encode(toJson());
 }
 
+class DirectiveInfoBuilder extends Object
+    with _DirectiveInfoMixin
+    implements idl.DirectiveInfo {
+  List<String> _templateNames;
+  List<String> _templateValues;
+
+  @override
+  List<String> get templateNames => _templateNames ??= <String>[];
+
+  /// The names of the defined templates.
+  set templateNames(List<String> value) {
+    this._templateNames = value;
+  }
+
+  @override
+  List<String> get templateValues => _templateValues ??= <String>[];
+
+  /// The values of the defined templates.
+  set templateValues(List<String> value) {
+    this._templateValues = value;
+  }
+
+  DirectiveInfoBuilder(
+      {List<String> templateNames, List<String> templateValues})
+      : _templateNames = templateNames,
+        _templateValues = templateValues;
+
+  /// Flush [informative] data recursively.
+  void flushInformative() {}
+
+  /// Accumulate non-[informative] data into [signature].
+  void collectApiSignature(api_sig.ApiSignature signature) {
+    if (this._templateNames == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._templateNames.length);
+      for (var x in this._templateNames) {
+        signature.addString(x);
+      }
+    }
+    if (this._templateValues == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._templateValues.length);
+      for (var x in this._templateValues) {
+        signature.addString(x);
+      }
+    }
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_templateNames;
+    fb.Offset offset_templateValues;
+    if (!(_templateNames == null || _templateNames.isEmpty)) {
+      offset_templateNames = fbBuilder.writeList(
+          _templateNames.map((b) => fbBuilder.writeString(b)).toList());
+    }
+    if (!(_templateValues == null || _templateValues.isEmpty)) {
+      offset_templateValues = fbBuilder.writeList(
+          _templateValues.map((b) => fbBuilder.writeString(b)).toList());
+    }
+    fbBuilder.startTable();
+    if (offset_templateNames != null) {
+      fbBuilder.addOffset(0, offset_templateNames);
+    }
+    if (offset_templateValues != null) {
+      fbBuilder.addOffset(1, offset_templateValues);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+class _DirectiveInfoReader extends fb.TableReader<_DirectiveInfoImpl> {
+  const _DirectiveInfoReader();
+
+  @override
+  _DirectiveInfoImpl createObject(fb.BufferContext bc, int offset) =>
+      new _DirectiveInfoImpl(bc, offset);
+}
+
+class _DirectiveInfoImpl extends Object
+    with _DirectiveInfoMixin
+    implements idl.DirectiveInfo {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _DirectiveInfoImpl(this._bc, this._bcOffset);
+
+  List<String> _templateNames;
+  List<String> _templateValues;
+
+  @override
+  List<String> get templateNames {
+    _templateNames ??= const fb.ListReader<String>(const fb.StringReader())
+        .vTableGet(_bc, _bcOffset, 0, const <String>[]);
+    return _templateNames;
+  }
+
+  @override
+  List<String> get templateValues {
+    _templateValues ??= const fb.ListReader<String>(const fb.StringReader())
+        .vTableGet(_bc, _bcOffset, 1, const <String>[]);
+    return _templateValues;
+  }
+}
+
+abstract class _DirectiveInfoMixin implements idl.DirectiveInfo {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (templateNames.isNotEmpty) _result["templateNames"] = templateNames;
+    if (templateValues.isNotEmpty) _result["templateValues"] = templateValues;
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+        "templateNames": templateNames,
+        "templateValues": templateValues,
+      };
+
+  @override
+  String toString() => convert.json.encode(toJson());
+}
+
 class EntityRefBuilder extends Object
     with _EntityRefMixin
     implements idl.EntityRef {
   idl.EntityRefKind _entityKind;
   List<int> _implicitFunctionTypeIndices;
+  idl.EntityRefNullabilitySuffix _nullabilitySuffix;
   int _paramReference;
   int _reference;
   int _refinedSlot;
@@ -3500,7 +3670,7 @@
   idl.EntityRefKind get entityKind => _entityKind ??= idl.EntityRefKind.named;
 
   /// The kind of entity being represented.
-  void set entityKind(idl.EntityRefKind value) {
+  set entityKind(idl.EntityRefKind value) {
     this._entityKind = value;
   }
 
@@ -3534,12 +3704,21 @@
   /// Note that if the entity being referred to is a generic method inside a
   /// generic class, then the type arguments in [typeArguments] are applied
   /// first to the class and then to the method.
-  void set implicitFunctionTypeIndices(List<int> value) {
+  set implicitFunctionTypeIndices(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._implicitFunctionTypeIndices = value;
   }
 
   @override
+  idl.EntityRefNullabilitySuffix get nullabilitySuffix =>
+      _nullabilitySuffix ??= idl.EntityRefNullabilitySuffix.starOrIrrelevant;
+
+  /// If the reference represents a type, the nullability of the type.
+  set nullabilitySuffix(idl.EntityRefNullabilitySuffix value) {
+    this._nullabilitySuffix = value;
+  }
+
+  @override
   int get paramReference => _paramReference ??= 0;
 
   /// If this is a reference to a type parameter, one-based index into the list
@@ -3559,7 +3738,7 @@
   ///
   /// If the type being referred to is not a type parameter, [paramReference] is
   /// zero.
-  void set paramReference(int value) {
+  set paramReference(int value) {
     assert(value == null || value >= 0);
     this._paramReference = value;
   }
@@ -3569,7 +3748,7 @@
 
   /// Index into [UnlinkedUnit.references] for the entity being referred to, or
   /// zero if this is a reference to a type parameter.
-  void set reference(int value) {
+  set reference(int value) {
     assert(value == null || value >= 0);
     this._reference = value;
   }
@@ -3587,7 +3766,7 @@
   /// This is called `refinedSlot` to clarify that if it points to an inferred
   /// type, it points to a type that is a "refinement" of this one (one in which
   /// some type arguments have been inferred).
-  void set refinedSlot(int value) {
+  set refinedSlot(int value) {
     assert(value == null || value >= 0);
     this._refinedSlot = value;
   }
@@ -3600,7 +3779,7 @@
   /// propagation or type inference with which this [EntityRef] is associated.
   ///
   /// Otherwise zero.
-  void set slot(int value) {
+  set slot(int value) {
     assert(value == null || value >= 0);
     this._slot = value;
   }
@@ -3613,7 +3792,7 @@
   /// [FunctionElement] is not in any library (e.g. a function type that was
   /// synthesized by a LUB computation), the function parameters.  Otherwise
   /// empty.
-  void set syntheticParams(List<UnlinkedParamBuilder> value) {
+  set syntheticParams(List<UnlinkedParamBuilder> value) {
     this._syntheticParams = value;
   }
 
@@ -3624,7 +3803,7 @@
   /// [FunctionElement] is not in any library (e.g. a function type that was
   /// synthesized by a LUB computation), the return type of the function.
   /// Otherwise `null`.
-  void set syntheticReturnType(EntityRefBuilder value) {
+  set syntheticReturnType(EntityRefBuilder value) {
     this._syntheticReturnType = value;
   }
 
@@ -3634,7 +3813,7 @@
 
   /// If this is an instantiation of a generic type or generic executable, the
   /// type arguments used to instantiate it (if any).
-  void set typeArguments(List<EntityRefBuilder> value) {
+  set typeArguments(List<EntityRefBuilder> value) {
     this._typeArguments = value;
   }
 
@@ -3644,13 +3823,14 @@
 
   /// If this is a function type, the type parameters defined for the function
   /// type (if any).
-  void set typeParameters(List<UnlinkedTypeParamBuilder> value) {
+  set typeParameters(List<UnlinkedTypeParamBuilder> value) {
     this._typeParameters = value;
   }
 
   EntityRefBuilder(
       {idl.EntityRefKind entityKind,
       List<int> implicitFunctionTypeIndices,
+      idl.EntityRefNullabilitySuffix nullabilitySuffix,
       int paramReference,
       int reference,
       int refinedSlot,
@@ -3661,6 +3841,7 @@
       List<UnlinkedTypeParamBuilder> typeParameters})
       : _entityKind = entityKind,
         _implicitFunctionTypeIndices = implicitFunctionTypeIndices,
+        _nullabilitySuffix = nullabilitySuffix,
         _paramReference = paramReference,
         _reference = reference,
         _refinedSlot = refinedSlot,
@@ -3670,9 +3851,7 @@
         _typeArguments = typeArguments,
         _typeParameters = typeParameters;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _syntheticParams?.forEach((b) => b.flushInformative());
     _syntheticReturnType?.flushInformative();
@@ -3680,9 +3859,7 @@
     _typeParameters?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addInt(this._reference ?? 0);
     if (this._typeArguments == null) {
@@ -3723,6 +3900,8 @@
     }
     signature.addInt(this._entityKind == null ? 0 : this._entityKind.index);
     signature.addInt(this._refinedSlot ?? 0);
+    signature.addInt(
+        this._nullabilitySuffix == null ? 0 : this._nullabilitySuffix.index);
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
@@ -3758,6 +3937,10 @@
     if (offset_implicitFunctionTypeIndices != null) {
       fbBuilder.addOffset(4, offset_implicitFunctionTypeIndices);
     }
+    if (_nullabilitySuffix != null &&
+        _nullabilitySuffix != idl.EntityRefNullabilitySuffix.starOrIrrelevant) {
+      fbBuilder.addUint8(10, _nullabilitySuffix.index);
+    }
     if (_paramReference != null && _paramReference != 0) {
       fbBuilder.addUint32(3, _paramReference);
     }
@@ -3804,6 +3987,7 @@
 
   idl.EntityRefKind _entityKind;
   List<int> _implicitFunctionTypeIndices;
+  idl.EntityRefNullabilitySuffix _nullabilitySuffix;
   int _paramReference;
   int _reference;
   int _refinedSlot;
@@ -3828,6 +4012,13 @@
   }
 
   @override
+  idl.EntityRefNullabilitySuffix get nullabilitySuffix {
+    _nullabilitySuffix ??= const _EntityRefNullabilitySuffixReader().vTableGet(
+        _bc, _bcOffset, 10, idl.EntityRefNullabilitySuffix.starOrIrrelevant);
+    return _nullabilitySuffix;
+  }
+
+  @override
   int get paramReference {
     _paramReference ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 3, 0);
     return _paramReference;
@@ -3891,6 +4082,8 @@
       _result["entityKind"] = entityKind.toString().split('.')[1];
     if (implicitFunctionTypeIndices.isNotEmpty)
       _result["implicitFunctionTypeIndices"] = implicitFunctionTypeIndices;
+    if (nullabilitySuffix != idl.EntityRefNullabilitySuffix.starOrIrrelevant)
+      _result["nullabilitySuffix"] = nullabilitySuffix.toString().split('.')[1];
     if (paramReference != 0) _result["paramReference"] = paramReference;
     if (reference != 0) _result["reference"] = reference;
     if (refinedSlot != 0) _result["refinedSlot"] = refinedSlot;
@@ -3913,6 +4106,7 @@
   Map<String, Object> toMap() => {
         "entityKind": entityKind,
         "implicitFunctionTypeIndices": implicitFunctionTypeIndices,
+        "nullabilitySuffix": nullabilitySuffix,
         "paramReference": paramReference,
         "reference": reference,
         "refinedSlot": refinedSlot,
@@ -3938,7 +4132,7 @@
 
   /// Absolute URI for the compilation units listed in the library's `part`
   /// declarations, empty string for invalid URI.
-  void set parts(List<String> value) {
+  set parts(List<String> value) {
     this._parts = value;
   }
 
@@ -3946,7 +4140,7 @@
   String get uri => _uri ??= '';
 
   /// The absolute URI of the dependent library, e.g. `package:foo/bar.dart`.
-  void set uri(String value) {
+  set uri(String value) {
     this._uri = value;
   }
 
@@ -3954,14 +4148,10 @@
       : _parts = parts,
         _uri = uri;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._uri ?? '');
     if (this._parts == null) {
@@ -4060,7 +4250,7 @@
 
   /// Index into [LinkedLibrary.dependencies] for the library in which the
   /// entity is defined.
-  void set dependency(int value) {
+  set dependency(int value) {
     assert(value == null || value >= 0);
     this._dependency = value;
   }
@@ -4069,7 +4259,7 @@
   idl.ReferenceKind get kind => _kind ??= idl.ReferenceKind.classOrEnum;
 
   /// The kind of the entity being referred to.
-  void set kind(idl.ReferenceKind value) {
+  set kind(idl.ReferenceKind value) {
     this._kind = value;
   }
 
@@ -4078,7 +4268,7 @@
 
   /// Name of the exported entity.  For an exported setter, this name includes
   /// the trailing '='.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -4089,7 +4279,7 @@
   /// definition of the entity.  As with indices into [LinkedLibrary.units],
   /// zero represents the defining compilation unit, and nonzero values
   /// represent parts in the order of the corresponding `part` declarations.
-  void set unit(int value) {
+  set unit(int value) {
     assert(value == null || value >= 0);
     this._unit = value;
   }
@@ -4101,14 +4291,10 @@
         _name = name,
         _unit = unit;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addInt(this._dependency ?? 0);
     signature.addString(this._name ?? '');
@@ -4237,7 +4423,7 @@
   /// implicitly refers to an element declared in the library) or
   /// anti-dependency (e.g. the result of type propagation or type inference
   /// depends on the lack of a certain declaration in the library).
-  void set dependencies(List<LinkedDependencyBuilder> value) {
+  set dependencies(List<LinkedDependencyBuilder> value) {
     this._dependencies = value;
   }
 
@@ -4246,7 +4432,7 @@
 
   /// For each export in [UnlinkedUnit.exports], an index into [dependencies]
   /// of the library being exported.
-  void set exportDependencies(List<int> value) {
+  set exportDependencies(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._exportDependencies = value;
   }
@@ -4260,7 +4446,7 @@
   /// brought into the namespace via `export` directives).
   ///
   /// Sorted by name.
-  void set exportNames(List<LinkedExportNameBuilder> value) {
+  set exportNames(List<LinkedExportNameBuilder> value) {
     this._exportNames = value;
   }
 
@@ -4273,7 +4459,7 @@
 
   /// For each import in [UnlinkedUnit.imports], an index into [dependencies]
   /// of the library being imported.
-  void set importDependencies(List<int> value) {
+  set importDependencies(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._importDependencies = value;
   }
@@ -4284,7 +4470,7 @@
   /// The number of elements in [dependencies] which are not "linked"
   /// dependencies (that is, the number of libraries in the direct imports plus
   /// the transitive closure of exports, plus the library itself).
-  void set numPrelinkedDependencies(int value) {
+  set numPrelinkedDependencies(int value) {
     assert(value == null || value >= 0);
     this._numPrelinkedDependencies = value;
   }
@@ -4296,7 +4482,7 @@
   /// library.  The summary of the defining compilation unit is listed first,
   /// followed by the summary of each part, in the order of the `part`
   /// declarations in the defining compilation unit.
-  void set units(List<LinkedUnitBuilder> value) {
+  set units(List<LinkedUnitBuilder> value) {
     this._units = value;
   }
 
@@ -4314,18 +4500,14 @@
         _numPrelinkedDependencies = numPrelinkedDependencies,
         _units = units;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _dependencies?.forEach((b) => b.flushInformative());
     _exportNames?.forEach((b) => b.flushInformative());
     _units?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._dependencies == null) {
       signature.addInt(0);
@@ -4539,41 +4721,106 @@
 class LinkedNodeBuilder extends Object
     with _LinkedNodeMixin
     implements idl.LinkedNode {
+  LinkedNodeTypeBuilder _variantField_24;
   List<LinkedNodeBuilder> _variantField_2;
   LinkedNodeBuilder _variantField_11;
   List<LinkedNodeBuilder> _variantField_4;
   LinkedNodeBuilder _variantField_6;
   int _variantField_15;
   LinkedNodeBuilder _variantField_7;
+  int _variantField_17;
+  LinkedNodeTypeBuilder _variantField_23;
   LinkedNodeBuilder _variantField_8;
   int _variantField_16;
-  int _variantField_17;
   int _variantField_18;
   int _variantField_19;
-  LinkedNodeTypeBuilder _variantField_24;
   bool _variantField_27;
   LinkedNodeBuilder _variantField_9;
   LinkedNodeBuilder _variantField_12;
   List<LinkedNodeBuilder> _variantField_5;
   LinkedNodeBuilder _variantField_13;
+  int _variantField_34;
+  int _variantField_33;
   List<int> _variantField_28;
   idl.LinkedNodeCommentType _variantField_29;
   List<LinkedNodeBuilder> _variantField_3;
   LinkedNodeBuilder _variantField_10;
+  idl.LinkedNodeFormalParameterKind _variantField_26;
   double _variantField_21;
   LinkedNodeTypeBuilder _variantField_25;
-  idl.LinkedNodeFormalParameterKind _variantField_26;
   String _variantField_30;
   LinkedNodeBuilder _variantField_14;
   bool _isSynthetic;
   idl.LinkedNodeKind _kind;
-  String _variantField_23;
-  bool _variantField_31;
+  List<String> _variantField_36;
   String _variantField_20;
+  bool _variantField_31;
+  TopLevelInferenceErrorBuilder _variantField_35;
   String _variantField_22;
   LinkedNodeVariablesDeclarationBuilder _variantField_32;
 
   @override
+  LinkedNodeTypeBuilder get actualReturnType {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionExpression ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericFunctionType ||
+        kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_24;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get actualType {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    return _variantField_24;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get binaryExpression_invokeType {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    return _variantField_24;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get invocationExpression_invokeType {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    return _variantField_24;
+  }
+
+  /// The explicit or inferred return type of a function typed node.
+  set actualReturnType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionExpression ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericFunctionType ||
+        kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_24 = value;
+  }
+
+  set actualType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    _variantField_24 = value;
+  }
+
+  set binaryExpression_invokeType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_24 = value;
+  }
+
+  set invocationExpression_invokeType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    _variantField_24 = value;
+  }
+
+  @override
   List<LinkedNodeBuilder> get adjacentStrings_strings {
     assert(kind == idl.LinkedNodeKind.adjacentStrings);
     return _variantField_2 ??= <LinkedNodeBuilder>[];
@@ -4598,6 +4845,12 @@
   }
 
   @override
+  List<LinkedNodeBuilder> get comment_references {
+    assert(kind == idl.LinkedNodeKind.comment);
+    return _variantField_2 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
   List<LinkedNodeBuilder> get compilationUnit_declarations {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     return _variantField_2 ??= <LinkedNodeBuilder>[];
@@ -4724,128 +4977,133 @@
     return _variantField_2 ??= <LinkedNodeBuilder>[];
   }
 
-  void set adjacentStrings_strings(List<LinkedNodeBuilder> value) {
+  set adjacentStrings_strings(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.adjacentStrings);
     _variantField_2 = value;
   }
 
-  void set argumentList_arguments(List<LinkedNodeBuilder> value) {
+  set argumentList_arguments(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.argumentList);
     _variantField_2 = value;
   }
 
-  void set block_statements(List<LinkedNodeBuilder> value) {
+  set block_statements(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.block);
     _variantField_2 = value;
   }
 
-  void set cascadeExpression_sections(List<LinkedNodeBuilder> value) {
+  set cascadeExpression_sections(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.cascadeExpression);
     _variantField_2 = value;
   }
 
-  void set compilationUnit_declarations(List<LinkedNodeBuilder> value) {
+  set comment_references(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.comment);
+    _variantField_2 = value;
+  }
+
+  set compilationUnit_declarations(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     _variantField_2 = value;
   }
 
-  void set constructorDeclaration_initializers(List<LinkedNodeBuilder> value) {
+  set constructorDeclaration_initializers(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.constructorDeclaration);
     _variantField_2 = value;
   }
 
-  void set dottedName_components(List<LinkedNodeBuilder> value) {
+  set dottedName_components(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.dottedName);
     _variantField_2 = value;
   }
 
-  void set enumDeclaration_constants(List<LinkedNodeBuilder> value) {
+  set enumDeclaration_constants(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.enumDeclaration);
     _variantField_2 = value;
   }
 
-  void set formalParameterList_parameters(List<LinkedNodeBuilder> value) {
+  set formalParameterList_parameters(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.formalParameterList);
     _variantField_2 = value;
   }
 
-  void set hideCombinator_hiddenNames(List<LinkedNodeBuilder> value) {
+  set hideCombinator_hiddenNames(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.hideCombinator);
     _variantField_2 = value;
   }
 
-  void set implementsClause_interfaces(List<LinkedNodeBuilder> value) {
+  set implementsClause_interfaces(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.implementsClause);
     _variantField_2 = value;
   }
 
-  void set labeledStatement_labels(List<LinkedNodeBuilder> value) {
+  set labeledStatement_labels(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.labeledStatement);
     _variantField_2 = value;
   }
 
-  void set libraryIdentifier_components(List<LinkedNodeBuilder> value) {
+  set libraryIdentifier_components(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.libraryIdentifier);
     _variantField_2 = value;
   }
 
-  void set listLiteral_elements(List<LinkedNodeBuilder> value) {
+  set listLiteral_elements(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.listLiteral);
     _variantField_2 = value;
   }
 
-  void set namespaceDirective_combinators(List<LinkedNodeBuilder> value) {
+  set namespaceDirective_combinators(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.exportDirective ||
         kind == idl.LinkedNodeKind.importDirective);
     _variantField_2 = value;
   }
 
-  void set onClause_superclassConstraints(List<LinkedNodeBuilder> value) {
+  set onClause_superclassConstraints(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.onClause);
     _variantField_2 = value;
   }
 
-  void set setOrMapLiteral_elements(List<LinkedNodeBuilder> value) {
+  set setOrMapLiteral_elements(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
     _variantField_2 = value;
   }
 
-  void set showCombinator_shownNames(List<LinkedNodeBuilder> value) {
+  set showCombinator_shownNames(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.showCombinator);
     _variantField_2 = value;
   }
 
-  void set stringInterpolation_elements(List<LinkedNodeBuilder> value) {
+  set stringInterpolation_elements(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.stringInterpolation);
     _variantField_2 = value;
   }
 
-  void set switchStatement_members(List<LinkedNodeBuilder> value) {
+  set switchStatement_members(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.switchStatement);
     _variantField_2 = value;
   }
 
-  void set tryStatement_catchClauses(List<LinkedNodeBuilder> value) {
+  set tryStatement_catchClauses(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.tryStatement);
     _variantField_2 = value;
   }
 
-  void set typeArgumentList_arguments(List<LinkedNodeBuilder> value) {
+  set typeArgumentList_arguments(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.typeArgumentList);
     _variantField_2 = value;
   }
 
-  void set typeParameterList_typeParameters(List<LinkedNodeBuilder> value) {
+  set typeParameterList_typeParameters(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.typeParameterList);
     _variantField_2 = value;
   }
 
-  void set variableDeclarationList_variables(List<LinkedNodeBuilder> value) {
+  set variableDeclarationList_variables(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.variableDeclarationList);
     _variantField_2 = value;
   }
 
-  void set withClause_mixinTypes(List<LinkedNodeBuilder> value) {
+  set withClause_mixinTypes(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.withClause);
     _variantField_2 = value;
   }
@@ -4876,7 +5134,7 @@
     return _variantField_11;
   }
 
-  void set annotatedNode_comment(LinkedNodeBuilder value) {
+  set annotatedNode_comment(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration ||
         kind == idl.LinkedNodeKind.classTypeAlias ||
         kind == idl.LinkedNodeKind.constructorDeclaration ||
@@ -4942,7 +5200,7 @@
     return _variantField_4 ??= <LinkedNodeBuilder>[];
   }
 
-  void set annotatedNode_metadata(List<LinkedNodeBuilder> value) {
+  set annotatedNode_metadata(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration ||
         kind == idl.LinkedNodeKind.classTypeAlias ||
         kind == idl.LinkedNodeKind.constructorDeclaration ||
@@ -4967,14 +5225,14 @@
     _variantField_4 = value;
   }
 
-  void set normalFormalParameter_metadata(List<LinkedNodeBuilder> value) {
+  set normalFormalParameter_metadata(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.simpleFormalParameter);
     _variantField_4 = value;
   }
 
-  void set switchMember_statements(List<LinkedNodeBuilder> value) {
+  set switchMember_statements(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.switchCase ||
         kind == idl.LinkedNodeKind.switchDefault);
     _variantField_4 = value;
@@ -5059,6 +5317,12 @@
   }
 
   @override
+  LinkedNodeBuilder get commentReference_identifier {
+    assert(kind == idl.LinkedNodeKind.commentReference);
+    return _variantField_6;
+  }
+
+  @override
   LinkedNodeBuilder get compilationUnit_scriptTag {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     return _variantField_6;
@@ -5309,6 +5573,18 @@
   }
 
   @override
+  LinkedNodeBuilder get nativeClause_name {
+    assert(kind == idl.LinkedNodeKind.nativeClause);
+    return _variantField_6;
+  }
+
+  @override
+  LinkedNodeBuilder get nativeFunctionBody_stringLiteral {
+    assert(kind == idl.LinkedNodeKind.nativeFunctionBody);
+    return _variantField_6;
+  }
+
+  @override
   LinkedNodeBuilder get parenthesizedExpression_expression {
     assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
     return _variantField_6;
@@ -5440,388 +5716,402 @@
     return _variantField_6;
   }
 
-  void set annotation_arguments(LinkedNodeBuilder value) {
+  set annotation_arguments(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.annotation);
     _variantField_6 = value;
   }
 
-  void set asExpression_expression(LinkedNodeBuilder value) {
+  set asExpression_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.asExpression);
     _variantField_6 = value;
   }
 
-  void set assertInitializer_condition(LinkedNodeBuilder value) {
+  set assertInitializer_condition(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.assertInitializer);
     _variantField_6 = value;
   }
 
-  void set assertStatement_condition(LinkedNodeBuilder value) {
+  set assertStatement_condition(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.assertStatement);
     _variantField_6 = value;
   }
 
-  void set assignmentExpression_leftHandSide(LinkedNodeBuilder value) {
+  set assignmentExpression_leftHandSide(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.assignmentExpression);
     _variantField_6 = value;
   }
 
-  void set awaitExpression_expression(LinkedNodeBuilder value) {
+  set awaitExpression_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.awaitExpression);
     _variantField_6 = value;
   }
 
-  void set binaryExpression_leftOperand(LinkedNodeBuilder value) {
+  set binaryExpression_leftOperand(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.binaryExpression);
     _variantField_6 = value;
   }
 
-  void set blockFunctionBody_block(LinkedNodeBuilder value) {
+  set blockFunctionBody_block(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.blockFunctionBody);
     _variantField_6 = value;
   }
 
-  void set breakStatement_label(LinkedNodeBuilder value) {
+  set breakStatement_label(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.breakStatement);
     _variantField_6 = value;
   }
 
-  void set cascadeExpression_target(LinkedNodeBuilder value) {
+  set cascadeExpression_target(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.cascadeExpression);
     _variantField_6 = value;
   }
 
-  void set catchClause_body(LinkedNodeBuilder value) {
+  set catchClause_body(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.catchClause);
     _variantField_6 = value;
   }
 
-  void set classDeclaration_extendsClause(LinkedNodeBuilder value) {
+  set classDeclaration_extendsClause(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration);
     _variantField_6 = value;
   }
 
-  void set classTypeAlias_typeParameters(LinkedNodeBuilder value) {
+  set classTypeAlias_typeParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.classTypeAlias);
     _variantField_6 = value;
   }
 
-  void set compilationUnit_scriptTag(LinkedNodeBuilder value) {
+  set commentReference_identifier(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.commentReference);
+    _variantField_6 = value;
+  }
+
+  set compilationUnit_scriptTag(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     _variantField_6 = value;
   }
 
-  void set conditionalExpression_condition(LinkedNodeBuilder value) {
+  set conditionalExpression_condition(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.conditionalExpression);
     _variantField_6 = value;
   }
 
-  void set configuration_name(LinkedNodeBuilder value) {
+  set configuration_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.configuration);
     _variantField_6 = value;
   }
 
-  void set constructorDeclaration_body(LinkedNodeBuilder value) {
+  set constructorDeclaration_body(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.constructorDeclaration);
     _variantField_6 = value;
   }
 
-  void set constructorFieldInitializer_expression(LinkedNodeBuilder value) {
+  set constructorFieldInitializer_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
     _variantField_6 = value;
   }
 
-  void set constructorName_name(LinkedNodeBuilder value) {
+  set constructorName_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.constructorName);
     _variantField_6 = value;
   }
 
-  void set continueStatement_label(LinkedNodeBuilder value) {
+  set continueStatement_label(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.continueStatement);
     _variantField_6 = value;
   }
 
-  void set declaredIdentifier_identifier(LinkedNodeBuilder value) {
+  set declaredIdentifier_identifier(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.declaredIdentifier);
     _variantField_6 = value;
   }
 
-  void set defaultFormalParameter_defaultValue(LinkedNodeBuilder value) {
+  set defaultFormalParameter_defaultValue(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
     _variantField_6 = value;
   }
 
-  void set doStatement_body(LinkedNodeBuilder value) {
+  set doStatement_body(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.doStatement);
     _variantField_6 = value;
   }
 
-  void set enumConstantDeclaration_name(LinkedNodeBuilder value) {
+  set enumConstantDeclaration_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.enumConstantDeclaration);
     _variantField_6 = value;
   }
 
-  void set expressionFunctionBody_expression(LinkedNodeBuilder value) {
+  set expressionFunctionBody_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
     _variantField_6 = value;
   }
 
-  void set expressionStatement_expression(LinkedNodeBuilder value) {
+  set expressionStatement_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.expressionStatement);
     _variantField_6 = value;
   }
 
-  void set extendsClause_superclass(LinkedNodeBuilder value) {
+  set extendsClause_superclass(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.extendsClause);
     _variantField_6 = value;
   }
 
-  void set fieldDeclaration_fields(LinkedNodeBuilder value) {
+  set fieldDeclaration_fields(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.fieldDeclaration);
     _variantField_6 = value;
   }
 
-  void set fieldFormalParameter_type(LinkedNodeBuilder value) {
+  set fieldFormalParameter_type(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
     _variantField_6 = value;
   }
 
-  void set forEachParts_iterable(LinkedNodeBuilder value) {
+  set forEachParts_iterable(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration ||
         kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
     _variantField_6 = value;
   }
 
-  void set forMixin_forLoopParts(LinkedNodeBuilder value) {
+  set forMixin_forLoopParts(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.forElement ||
         kind == idl.LinkedNodeKind.forStatement);
     _variantField_6 = value;
   }
 
-  void set forParts_condition(LinkedNodeBuilder value) {
+  set forParts_condition(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
         kind == idl.LinkedNodeKind.forPartsWithExpression);
     _variantField_6 = value;
   }
 
-  void set functionDeclaration_functionExpression(LinkedNodeBuilder value) {
+  set functionDeclaration_functionExpression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionDeclaration);
     _variantField_6 = value;
   }
 
-  void set functionDeclarationStatement_functionDeclaration(
+  set functionDeclarationStatement_functionDeclaration(
       LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionDeclarationStatement);
     _variantField_6 = value;
   }
 
-  void set functionExpression_body(LinkedNodeBuilder value) {
+  set functionExpression_body(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionExpression);
     _variantField_6 = value;
   }
 
-  void set functionExpressionInvocation_function(LinkedNodeBuilder value) {
+  set functionExpressionInvocation_function(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionExpressionInvocation);
     _variantField_6 = value;
   }
 
-  void set functionTypeAlias_formalParameters(LinkedNodeBuilder value) {
+  set functionTypeAlias_formalParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionTypeAlias);
     _variantField_6 = value;
   }
 
-  void set functionTypedFormalParameter_formalParameters(
-      LinkedNodeBuilder value) {
+  set functionTypedFormalParameter_formalParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
     _variantField_6 = value;
   }
 
-  void set genericFunctionType_typeParameters(LinkedNodeBuilder value) {
+  set genericFunctionType_typeParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.genericFunctionType);
     _variantField_6 = value;
   }
 
-  void set genericTypeAlias_typeParameters(LinkedNodeBuilder value) {
+  set genericTypeAlias_typeParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.genericTypeAlias);
     _variantField_6 = value;
   }
 
-  void set ifMixin_condition(LinkedNodeBuilder value) {
+  set ifMixin_condition(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.ifElement ||
         kind == idl.LinkedNodeKind.ifStatement);
     _variantField_6 = value;
   }
 
-  void set importDirective_prefix(LinkedNodeBuilder value) {
+  set importDirective_prefix(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.importDirective);
     _variantField_6 = value;
   }
 
-  void set indexExpression_index(LinkedNodeBuilder value) {
+  set indexExpression_index(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.indexExpression);
     _variantField_6 = value;
   }
 
-  void set instanceCreationExpression_arguments(LinkedNodeBuilder value) {
+  set instanceCreationExpression_arguments(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
     _variantField_6 = value;
   }
 
-  void set interpolationExpression_expression(LinkedNodeBuilder value) {
+  set interpolationExpression_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.interpolationExpression);
     _variantField_6 = value;
   }
 
-  void set isExpression_expression(LinkedNodeBuilder value) {
+  set isExpression_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.isExpression);
     _variantField_6 = value;
   }
 
-  void set label_label(LinkedNodeBuilder value) {
+  set label_label(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.label);
     _variantField_6 = value;
   }
 
-  void set labeledStatement_statement(LinkedNodeBuilder value) {
+  set labeledStatement_statement(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.labeledStatement);
     _variantField_6 = value;
   }
 
-  void set libraryDirective_name(LinkedNodeBuilder value) {
+  set libraryDirective_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.libraryDirective);
     _variantField_6 = value;
   }
 
-  void set mapLiteralEntry_key(LinkedNodeBuilder value) {
+  set mapLiteralEntry_key(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
     _variantField_6 = value;
   }
 
-  void set methodDeclaration_body(LinkedNodeBuilder value) {
+  set methodDeclaration_body(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.methodDeclaration);
     _variantField_6 = value;
   }
 
-  void set methodInvocation_methodName(LinkedNodeBuilder value) {
+  set methodInvocation_methodName(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.methodInvocation);
     _variantField_6 = value;
   }
 
-  void set mixinDeclaration_onClause(LinkedNodeBuilder value) {
+  set mixinDeclaration_onClause(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.mixinDeclaration);
     _variantField_6 = value;
   }
 
-  void set namedExpression_expression(LinkedNodeBuilder value) {
+  set namedExpression_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.namedExpression);
     _variantField_6 = value;
   }
 
-  void set parenthesizedExpression_expression(LinkedNodeBuilder value) {
+  set nativeClause_name(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.nativeClause);
+    _variantField_6 = value;
+  }
+
+  set nativeFunctionBody_stringLiteral(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.nativeFunctionBody);
+    _variantField_6 = value;
+  }
+
+  set parenthesizedExpression_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
     _variantField_6 = value;
   }
 
-  void set partOfDirective_libraryName(LinkedNodeBuilder value) {
+  set partOfDirective_libraryName(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.partOfDirective);
     _variantField_6 = value;
   }
 
-  void set postfixExpression_operand(LinkedNodeBuilder value) {
+  set postfixExpression_operand(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.postfixExpression);
     _variantField_6 = value;
   }
 
-  void set prefixedIdentifier_identifier(LinkedNodeBuilder value) {
+  set prefixedIdentifier_identifier(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
     _variantField_6 = value;
   }
 
-  void set prefixExpression_operand(LinkedNodeBuilder value) {
+  set prefixExpression_operand(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.prefixExpression);
     _variantField_6 = value;
   }
 
-  void set propertyAccess_propertyName(LinkedNodeBuilder value) {
+  set propertyAccess_propertyName(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.propertyAccess);
     _variantField_6 = value;
   }
 
-  void set redirectingConstructorInvocation_arguments(LinkedNodeBuilder value) {
+  set redirectingConstructorInvocation_arguments(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
     _variantField_6 = value;
   }
 
-  void set returnStatement_expression(LinkedNodeBuilder value) {
+  set returnStatement_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.returnStatement);
     _variantField_6 = value;
   }
 
-  void set simpleFormalParameter_type(LinkedNodeBuilder value) {
+  set simpleFormalParameter_type(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.simpleFormalParameter);
     _variantField_6 = value;
   }
 
-  void set spreadElement_expression(LinkedNodeBuilder value) {
+  set spreadElement_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.spreadElement);
     _variantField_6 = value;
   }
 
-  void set superConstructorInvocation_arguments(LinkedNodeBuilder value) {
+  set superConstructorInvocation_arguments(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
     _variantField_6 = value;
   }
 
-  void set switchCase_expression(LinkedNodeBuilder value) {
+  set switchCase_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.switchCase);
     _variantField_6 = value;
   }
 
-  void set throwExpression_expression(LinkedNodeBuilder value) {
+  set throwExpression_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.throwExpression);
     _variantField_6 = value;
   }
 
-  void set topLevelVariableDeclaration_variableList(LinkedNodeBuilder value) {
+  set topLevelVariableDeclaration_variableList(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.topLevelVariableDeclaration);
     _variantField_6 = value;
   }
 
-  void set tryStatement_body(LinkedNodeBuilder value) {
+  set tryStatement_body(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.tryStatement);
     _variantField_6 = value;
   }
 
-  void set typeName_name(LinkedNodeBuilder value) {
+  set typeName_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.typeName);
     _variantField_6 = value;
   }
 
-  void set typeParameter_bound(LinkedNodeBuilder value) {
+  set typeParameter_bound(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.typeParameter);
     _variantField_6 = value;
   }
 
-  void set variableDeclaration_initializer(LinkedNodeBuilder value) {
+  set variableDeclaration_initializer(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.variableDeclaration);
     _variantField_6 = value;
   }
 
-  void set variableDeclarationList_type(LinkedNodeBuilder value) {
+  set variableDeclarationList_type(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.variableDeclarationList);
     _variantField_6 = value;
   }
 
-  void set variableDeclarationStatement_variables(LinkedNodeBuilder value) {
+  set variableDeclarationStatement_variables(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.variableDeclarationStatement);
     _variantField_6 = value;
   }
 
-  void set whileStatement_body(LinkedNodeBuilder value) {
+  set whileStatement_body(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.whileStatement);
     _variantField_6 = value;
   }
 
-  void set yieldStatement_expression(LinkedNodeBuilder value) {
+  set yieldStatement_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.yieldStatement);
     _variantField_6 = value;
   }
@@ -5917,6 +6207,12 @@
   }
 
   @override
+  int get commentReference_newKeyword {
+    assert(kind == idl.LinkedNodeKind.commentReference);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
   int get compilationUnit_beginToken {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     return _variantField_15 ??= 0;
@@ -6161,6 +6457,18 @@
   }
 
   @override
+  int get nativeClause_nativeKeyword {
+    assert(kind == idl.LinkedNodeKind.nativeClause);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
+  int get nativeFunctionBody_nativeKeyword {
+    assert(kind == idl.LinkedNodeKind.nativeFunctionBody);
+    return _variantField_15 ??= 0;
+  }
+
+  @override
   int get nullLiteral_literal {
     assert(kind == idl.LinkedNodeKind.nullLiteral);
     return _variantField_15 ??= 0;
@@ -6179,12 +6487,6 @@
   }
 
   @override
-  int get partOfDirective_semicolon {
-    assert(kind == idl.LinkedNodeKind.partOfDirective);
-    return _variantField_15 ??= 0;
-  }
-
-  @override
   int get postfixExpression_element {
     assert(kind == idl.LinkedNodeKind.postfixExpression);
     return _variantField_15 ??= 0;
@@ -6377,552 +6679,564 @@
     return _variantField_15 ??= 0;
   }
 
-  void set annotation_atSign(int value) {
+  set annotation_atSign(int value) {
     assert(kind == idl.LinkedNodeKind.annotation);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set argumentList_leftParenthesis(int value) {
+  set argumentList_leftParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.argumentList);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set asExpression_asOperator(int value) {
+  set asExpression_asOperator(int value) {
     assert(kind == idl.LinkedNodeKind.asExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set assertInitializer_assertKeyword(int value) {
+  set assertInitializer_assertKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.assertInitializer);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set assertStatement_assertKeyword(int value) {
+  set assertStatement_assertKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.assertStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set assignmentExpression_element(int value) {
+  set assignmentExpression_element(int value) {
     assert(kind == idl.LinkedNodeKind.assignmentExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set awaitExpression_awaitKeyword(int value) {
+  set awaitExpression_awaitKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.awaitExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set binaryExpression_element(int value) {
+  set binaryExpression_element(int value) {
     assert(kind == idl.LinkedNodeKind.binaryExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set block_leftBracket(int value) {
+  set block_leftBracket(int value) {
     assert(kind == idl.LinkedNodeKind.block);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set blockFunctionBody_keyword(int value) {
+  set blockFunctionBody_keyword(int value) {
     assert(kind == idl.LinkedNodeKind.blockFunctionBody);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set booleanLiteral_literal(int value) {
+  set booleanLiteral_literal(int value) {
     assert(kind == idl.LinkedNodeKind.booleanLiteral);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set breakStatement_breakKeyword(int value) {
+  set breakStatement_breakKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.breakStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set catchClause_catchKeyword(int value) {
+  set catchClause_catchKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.catchClause);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set classDeclaration_abstractKeyword(int value) {
+  set classDeclaration_abstractKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set classTypeAlias_abstractKeyword(int value) {
+  set classTypeAlias_abstractKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.classTypeAlias);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set compilationUnit_beginToken(int value) {
+  set commentReference_newKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.commentReference);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set compilationUnit_beginToken(int value) {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set conditionalExpression_colon(int value) {
+  set conditionalExpression_colon(int value) {
     assert(kind == idl.LinkedNodeKind.conditionalExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set configuration_ifKeyword(int value) {
+  set configuration_ifKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.configuration);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set constructorDeclaration_constKeyword(int value) {
+  set constructorDeclaration_constKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.constructorDeclaration);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set constructorFieldInitializer_equals(int value) {
+  set constructorFieldInitializer_equals(int value) {
     assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set constructorName_element(int value) {
+  set constructorName_element(int value) {
     assert(kind == idl.LinkedNodeKind.constructorName);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set continueStatement_continueKeyword(int value) {
+  set continueStatement_continueKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.continueStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set declaredIdentifier_keyword(int value) {
+  set declaredIdentifier_keyword(int value) {
     assert(kind == idl.LinkedNodeKind.declaredIdentifier);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set defaultFormalParameter_separator(int value) {
+  set defaultFormalParameter_separator(int value) {
     assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set doStatement_leftParenthesis(int value) {
+  set doStatement_leftParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.doStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set doubleLiteral_literal(int value) {
+  set doubleLiteral_literal(int value) {
     assert(kind == idl.LinkedNodeKind.doubleLiteral);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set emptyFunctionBody_semicolon(int value) {
+  set emptyFunctionBody_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.emptyFunctionBody);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set emptyStatement_semicolon(int value) {
+  set emptyStatement_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.emptyStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set enumDeclaration_enumKeyword(int value) {
+  set enumDeclaration_enumKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.enumDeclaration);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set expressionFunctionBody_arrow(int value) {
+  set expressionFunctionBody_arrow(int value) {
     assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set expressionStatement_semicolon(int value) {
+  set expressionStatement_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.expressionStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set extendsClause_extendsKeyword(int value) {
+  set extendsClause_extendsKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.extendsClause);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set fieldDeclaration_covariantKeyword(int value) {
+  set fieldDeclaration_covariantKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.fieldDeclaration);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set fieldFormalParameter_keyword(int value) {
+  set fieldFormalParameter_keyword(int value) {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set forEachParts_inKeyword(int value) {
+  set forEachParts_inKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration ||
         kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set formalParameterList_leftDelimiter(int value) {
+  set formalParameterList_leftDelimiter(int value) {
     assert(kind == idl.LinkedNodeKind.formalParameterList);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set forMixin_awaitKeyword(int value) {
+  set forMixin_awaitKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.forElement ||
         kind == idl.LinkedNodeKind.forStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set forParts_leftSeparator(int value) {
+  set forParts_leftSeparator(int value) {
     assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
         kind == idl.LinkedNodeKind.forPartsWithExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set functionDeclaration_externalKeyword(int value) {
+  set functionDeclaration_externalKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.functionDeclaration);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set genericFunctionType_functionKeyword(int value) {
+  set genericFunctionType_functionKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.genericFunctionType);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set ifMixin_elseKeyword(int value) {
+  set ifMixin_elseKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.ifElement ||
         kind == idl.LinkedNodeKind.ifStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set implementsClause_implementsKeyword(int value) {
+  set implementsClause_implementsKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.implementsClause);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set importDirective_asKeyword(int value) {
+  set importDirective_asKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.importDirective);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set indexExpression_element(int value) {
+  set indexExpression_element(int value) {
     assert(kind == idl.LinkedNodeKind.indexExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set instanceCreationExpression_keyword(int value) {
+  set instanceCreationExpression_keyword(int value) {
     assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set integerLiteral_literal(int value) {
+  set integerLiteral_literal(int value) {
     assert(kind == idl.LinkedNodeKind.integerLiteral);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set interpolationExpression_leftBracket(int value) {
+  set interpolationExpression_leftBracket(int value) {
     assert(kind == idl.LinkedNodeKind.interpolationExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set interpolationString_token(int value) {
+  set interpolationString_token(int value) {
     assert(kind == idl.LinkedNodeKind.interpolationString);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set isExpression_isOperator(int value) {
+  set isExpression_isOperator(int value) {
     assert(kind == idl.LinkedNodeKind.isExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set label_colon(int value) {
+  set label_colon(int value) {
     assert(kind == idl.LinkedNodeKind.label);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set listLiteral_leftBracket(int value) {
+  set listLiteral_leftBracket(int value) {
     assert(kind == idl.LinkedNodeKind.listLiteral);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set mapLiteralEntry_separator(int value) {
+  set mapLiteralEntry_separator(int value) {
     assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set methodDeclaration_externalKeyword(int value) {
+  set methodDeclaration_externalKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.methodDeclaration);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set methodInvocation_operator(int value) {
+  set methodInvocation_operator(int value) {
     assert(kind == idl.LinkedNodeKind.methodInvocation);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set mixinDeclaration_mixinKeyword(int value) {
+  set mixinDeclaration_mixinKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.mixinDeclaration);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set nullLiteral_literal(int value) {
+  set nativeClause_nativeKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.nativeClause);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set nativeFunctionBody_nativeKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.nativeFunctionBody);
+    assert(value == null || value >= 0);
+    _variantField_15 = value;
+  }
+
+  set nullLiteral_literal(int value) {
     assert(kind == idl.LinkedNodeKind.nullLiteral);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set onClause_onKeyword(int value) {
+  set onClause_onKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.onClause);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set parenthesizedExpression_leftParenthesis(int value) {
+  set parenthesizedExpression_leftParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set partOfDirective_semicolon(int value) {
-    assert(kind == idl.LinkedNodeKind.partOfDirective);
-    assert(value == null || value >= 0);
-    _variantField_15 = value;
-  }
-
-  void set postfixExpression_element(int value) {
+  set postfixExpression_element(int value) {
     assert(kind == idl.LinkedNodeKind.postfixExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set prefixedIdentifier_period(int value) {
+  set prefixedIdentifier_period(int value) {
     assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set prefixExpression_element(int value) {
+  set prefixExpression_element(int value) {
     assert(kind == idl.LinkedNodeKind.prefixExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set propertyAccess_operator(int value) {
+  set propertyAccess_operator(int value) {
     assert(kind == idl.LinkedNodeKind.propertyAccess);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set redirectingConstructorInvocation_element(int value) {
+  set redirectingConstructorInvocation_element(int value) {
     assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set rethrowExpression_rethrowKeyword(int value) {
+  set rethrowExpression_rethrowKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.rethrowExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set returnStatement_returnKeyword(int value) {
+  set returnStatement_returnKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.returnStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set scriptTag_scriptTag(int value) {
+  set scriptTag_scriptTag(int value) {
     assert(kind == idl.LinkedNodeKind.scriptTag);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set setOrMapLiteral_leftBracket(int value) {
+  set setOrMapLiteral_leftBracket(int value) {
     assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set simpleFormalParameter_keyword(int value) {
+  set simpleFormalParameter_keyword(int value) {
     assert(kind == idl.LinkedNodeKind.simpleFormalParameter);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set simpleIdentifier_element(int value) {
+  set simpleIdentifier_element(int value) {
     assert(kind == idl.LinkedNodeKind.simpleIdentifier);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set simpleStringLiteral_token(int value) {
+  set simpleStringLiteral_token(int value) {
     assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set spreadElement_spreadOperator(int value) {
+  set spreadElement_spreadOperator(int value) {
     assert(kind == idl.LinkedNodeKind.spreadElement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set superConstructorInvocation_element(int value) {
+  set superConstructorInvocation_element(int value) {
     assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set superExpression_superKeyword(int value) {
+  set superExpression_superKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.superExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set switchMember_keyword(int value) {
+  set switchMember_keyword(int value) {
     assert(kind == idl.LinkedNodeKind.switchCase ||
         kind == idl.LinkedNodeKind.switchDefault);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set switchStatement_leftParenthesis(int value) {
+  set switchStatement_leftParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.switchStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set symbolLiteral_poundSign(int value) {
+  set symbolLiteral_poundSign(int value) {
     assert(kind == idl.LinkedNodeKind.symbolLiteral);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set thisExpression_thisKeyword(int value) {
+  set thisExpression_thisKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.thisExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set throwExpression_throwKeyword(int value) {
+  set throwExpression_throwKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.throwExpression);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set topLevelVariableDeclaration_semicolon(int value) {
+  set topLevelVariableDeclaration_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.topLevelVariableDeclaration);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set tryStatement_finallyKeyword(int value) {
+  set tryStatement_finallyKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.tryStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set typeArgumentList_leftBracket(int value) {
+  set typeArgumentList_leftBracket(int value) {
     assert(kind == idl.LinkedNodeKind.typeArgumentList);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set typeName_question(int value) {
+  set typeName_question(int value) {
     assert(kind == idl.LinkedNodeKind.typeName);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set typeParameter_extendsKeyword(int value) {
+  set typeParameter_extendsKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.typeParameter);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set typeParameterList_leftBracket(int value) {
+  set typeParameterList_leftBracket(int value) {
     assert(kind == idl.LinkedNodeKind.typeParameterList);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set variableDeclaration_equals(int value) {
+  set variableDeclaration_equals(int value) {
     assert(kind == idl.LinkedNodeKind.variableDeclaration);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set variableDeclarationList_keyword(int value) {
+  set variableDeclarationList_keyword(int value) {
     assert(kind == idl.LinkedNodeKind.variableDeclarationList);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set variableDeclarationStatement_semicolon(int value) {
+  set variableDeclarationStatement_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.variableDeclarationStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set whileStatement_leftParenthesis(int value) {
+  set whileStatement_leftParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.whileStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set withClause_withKeyword(int value) {
+  set withClause_withKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.withClause);
     assert(value == null || value >= 0);
     _variantField_15 = value;
   }
 
-  void set yieldStatement_yieldKeyword(int value) {
+  set yieldStatement_yieldKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.yieldStatement);
     assert(value == null || value >= 0);
     _variantField_15 = value;
@@ -7222,253 +7536,666 @@
     return _variantField_7;
   }
 
-  void set annotation_constructorName(LinkedNodeBuilder value) {
+  set annotation_constructorName(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.annotation);
     _variantField_7 = value;
   }
 
-  void set asExpression_type(LinkedNodeBuilder value) {
+  set asExpression_type(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.asExpression);
     _variantField_7 = value;
   }
 
-  void set assertInitializer_message(LinkedNodeBuilder value) {
+  set assertInitializer_message(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.assertInitializer);
     _variantField_7 = value;
   }
 
-  void set assertStatement_message(LinkedNodeBuilder value) {
+  set assertStatement_message(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.assertStatement);
     _variantField_7 = value;
   }
 
-  void set assignmentExpression_rightHandSide(LinkedNodeBuilder value) {
+  set assignmentExpression_rightHandSide(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.assignmentExpression);
     _variantField_7 = value;
   }
 
-  void set binaryExpression_rightOperand(LinkedNodeBuilder value) {
+  set binaryExpression_rightOperand(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.binaryExpression);
     _variantField_7 = value;
   }
 
-  void set catchClause_exceptionParameter(LinkedNodeBuilder value) {
+  set catchClause_exceptionParameter(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.catchClause);
     _variantField_7 = value;
   }
 
-  void set classDeclaration_withClause(LinkedNodeBuilder value) {
+  set classDeclaration_withClause(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration);
     _variantField_7 = value;
   }
 
-  void set classTypeAlias_superclass(LinkedNodeBuilder value) {
+  set classTypeAlias_superclass(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.classTypeAlias);
     _variantField_7 = value;
   }
 
-  void set conditionalExpression_elseExpression(LinkedNodeBuilder value) {
+  set conditionalExpression_elseExpression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.conditionalExpression);
     _variantField_7 = value;
   }
 
-  void set configuration_value(LinkedNodeBuilder value) {
+  set configuration_value(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.configuration);
     _variantField_7 = value;
   }
 
-  void set constructorDeclaration_name(LinkedNodeBuilder value) {
+  set constructorDeclaration_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.constructorDeclaration);
     _variantField_7 = value;
   }
 
-  void set constructorFieldInitializer_fieldName(LinkedNodeBuilder value) {
+  set constructorFieldInitializer_fieldName(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
     _variantField_7 = value;
   }
 
-  void set constructorName_type(LinkedNodeBuilder value) {
+  set constructorName_type(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.constructorName);
     _variantField_7 = value;
   }
 
-  void set declaredIdentifier_type(LinkedNodeBuilder value) {
+  set declaredIdentifier_type(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.declaredIdentifier);
     _variantField_7 = value;
   }
 
-  void set defaultFormalParameter_parameter(LinkedNodeBuilder value) {
+  set defaultFormalParameter_parameter(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
     _variantField_7 = value;
   }
 
-  void set doStatement_condition(LinkedNodeBuilder value) {
+  set doStatement_condition(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.doStatement);
     _variantField_7 = value;
   }
 
-  void set fieldFormalParameter_typeParameters(LinkedNodeBuilder value) {
+  set fieldFormalParameter_typeParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
     _variantField_7 = value;
   }
 
-  void set forEachPartsWithDeclaration_loopVariable(LinkedNodeBuilder value) {
+  set forEachPartsWithDeclaration_loopVariable(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.forEachPartsWithDeclaration);
     _variantField_7 = value;
   }
 
-  void set forEachPartsWithIdentifier_identifier(LinkedNodeBuilder value) {
+  set forEachPartsWithIdentifier_identifier(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.forEachPartsWithIdentifier);
     _variantField_7 = value;
   }
 
-  void set forElement_body(LinkedNodeBuilder value) {
+  set forElement_body(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.forElement);
     _variantField_7 = value;
   }
 
-  void set forPartsWithDeclarations_variables(LinkedNodeBuilder value) {
+  set forPartsWithDeclarations_variables(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations);
     _variantField_7 = value;
   }
 
-  void set forPartsWithExpression_initialization(LinkedNodeBuilder value) {
+  set forPartsWithExpression_initialization(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.forPartsWithExpression);
     _variantField_7 = value;
   }
 
-  void set forStatement_body(LinkedNodeBuilder value) {
+  set forStatement_body(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.forStatement);
     _variantField_7 = value;
   }
 
-  void set functionDeclaration_returnType(LinkedNodeBuilder value) {
+  set functionDeclaration_returnType(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionDeclaration);
     _variantField_7 = value;
   }
 
-  void set functionExpression_formalParameters(LinkedNodeBuilder value) {
+  set functionExpression_formalParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionExpression);
     _variantField_7 = value;
   }
 
-  void set functionTypeAlias_returnType(LinkedNodeBuilder value) {
+  set functionTypeAlias_returnType(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionTypeAlias);
     _variantField_7 = value;
   }
 
-  void set functionTypedFormalParameter_returnType(LinkedNodeBuilder value) {
+  set functionTypedFormalParameter_returnType(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
     _variantField_7 = value;
   }
 
-  void set genericFunctionType_returnType(LinkedNodeBuilder value) {
+  set genericFunctionType_returnType(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.genericFunctionType);
     _variantField_7 = value;
   }
 
-  void set genericTypeAlias_functionType(LinkedNodeBuilder value) {
+  set genericTypeAlias_functionType(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.genericTypeAlias);
     _variantField_7 = value;
   }
 
-  void set ifStatement_elseStatement(LinkedNodeBuilder value) {
+  set ifStatement_elseStatement(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.ifStatement);
     _variantField_7 = value;
   }
 
-  void set indexExpression_target(LinkedNodeBuilder value) {
+  set indexExpression_target(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.indexExpression);
     _variantField_7 = value;
   }
 
-  void set instanceCreationExpression_constructorName(LinkedNodeBuilder value) {
+  set instanceCreationExpression_constructorName(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
     _variantField_7 = value;
   }
 
-  void set isExpression_type(LinkedNodeBuilder value) {
+  set isExpression_type(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.isExpression);
     _variantField_7 = value;
   }
 
-  void set mapLiteralEntry_value(LinkedNodeBuilder value) {
+  set mapLiteralEntry_value(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.mapLiteralEntry);
     _variantField_7 = value;
   }
 
-  void set methodDeclaration_formalParameters(LinkedNodeBuilder value) {
+  set methodDeclaration_formalParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.methodDeclaration);
     _variantField_7 = value;
   }
 
-  void set methodInvocation_target(LinkedNodeBuilder value) {
+  set methodInvocation_target(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.methodInvocation);
     _variantField_7 = value;
   }
 
-  void set namedExpression_name(LinkedNodeBuilder value) {
+  set namedExpression_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.namedExpression);
     _variantField_7 = value;
   }
 
-  void set partOfDirective_uri(LinkedNodeBuilder value) {
+  set partOfDirective_uri(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.partOfDirective);
     _variantField_7 = value;
   }
 
-  void set prefixedIdentifier_prefix(LinkedNodeBuilder value) {
+  set prefixedIdentifier_prefix(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.prefixedIdentifier);
     _variantField_7 = value;
   }
 
-  void set propertyAccess_target(LinkedNodeBuilder value) {
+  set propertyAccess_target(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.propertyAccess);
     _variantField_7 = value;
   }
 
-  void set redirectingConstructorInvocation_constructorName(
+  set redirectingConstructorInvocation_constructorName(
       LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
     _variantField_7 = value;
   }
 
-  void set superConstructorInvocation_constructorName(LinkedNodeBuilder value) {
+  set superConstructorInvocation_constructorName(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
     _variantField_7 = value;
   }
 
-  void set switchStatement_expression(LinkedNodeBuilder value) {
+  set switchStatement_expression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.switchStatement);
     _variantField_7 = value;
   }
 
-  void set tryStatement_finallyBlock(LinkedNodeBuilder value) {
+  set tryStatement_finallyBlock(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.tryStatement);
     _variantField_7 = value;
   }
 
-  void set typeName_typeArguments(LinkedNodeBuilder value) {
+  set typeName_typeArguments(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.typeName);
     _variantField_7 = value;
   }
 
-  void set typeParameter_name(LinkedNodeBuilder value) {
+  set typeParameter_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.typeParameter);
     _variantField_7 = value;
   }
 
-  void set variableDeclaration_name(LinkedNodeBuilder value) {
+  set variableDeclaration_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.variableDeclaration);
     _variantField_7 = value;
   }
 
-  void set whileStatement_condition(LinkedNodeBuilder value) {
+  set whileStatement_condition(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.whileStatement);
     _variantField_7 = value;
   }
 
   @override
+  int get annotation_element {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get assertInitializer_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get assertStatement_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get catchClause_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get configuration_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get constructorDeclaration_factoryKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get constructorFieldInitializer_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get doStatement_doKeyword {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get enumDeclaration_rightBracket {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get expressionFunctionBody_semicolon {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get fieldDeclaration_staticKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get fieldFormalParameter_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get formalParameterList_rightDelimiter {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get forMixin_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get genericFunctionType_id {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get ifMixin_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get indexExpression_leftBracket {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get methodDeclaration_operatorKeyword {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get redirectingConstructorInvocation_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get superConstructorInvocation_superKeyword {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get switchStatement_switchKeyword {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get whileStatement_whileKeyword {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  @override
+  int get yieldStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    return _variantField_17 ??= 0;
+  }
+
+  set annotation_element(int value) {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set assertInitializer_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set assertStatement_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set catchClause_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set configuration_rightParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set constructorDeclaration_factoryKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set constructorFieldInitializer_thisKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set doStatement_doKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set enumDeclaration_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set expressionFunctionBody_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set fieldDeclaration_staticKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set fieldFormalParameter_thisKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set formalParameterList_rightDelimiter(int value) {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set forMixin_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set genericFunctionType_id(int value) {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set ifMixin_leftParenthesis(int value) {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set indexExpression_leftBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set methodDeclaration_operatorKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set redirectingConstructorInvocation_thisKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set superConstructorInvocation_superKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set switchStatement_switchKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set whileStatement_whileKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  set yieldStatement_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    assert(value == null || value >= 0);
+    _variantField_17 = value;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get annotation_elementType {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    return _variantField_23;
+  }
+
+  @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;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get typeParameter_defaultType {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    return _variantField_23;
+  }
+
+  set annotation_elementType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_23 = value;
+  }
+
+  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;
+  }
+
+  set typeParameter_defaultType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    _variantField_23 = value;
+  }
+
+  @override
   LinkedNodeBuilder get annotation_name {
     assert(kind == idl.LinkedNodeKind.annotation);
     return _variantField_8;
@@ -7481,6 +8208,12 @@
   }
 
   @override
+  LinkedNodeBuilder get classDeclaration_nativeClause {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    return _variantField_8;
+  }
+
+  @override
   LinkedNodeBuilder get classTypeAlias_withClause {
     assert(kind == idl.LinkedNodeKind.classTypeAlias);
     return _variantField_8;
@@ -7558,78 +8291,82 @@
     return _variantField_8;
   }
 
-  void set annotation_name(LinkedNodeBuilder value) {
+  set annotation_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.annotation);
     _variantField_8 = value;
   }
 
-  void set catchClause_exceptionType(LinkedNodeBuilder value) {
+  set catchClause_exceptionType(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.catchClause);
     _variantField_8 = value;
   }
 
-  void set classTypeAlias_withClause(LinkedNodeBuilder value) {
+  set classDeclaration_nativeClause(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    _variantField_8 = value;
+  }
+
+  set classTypeAlias_withClause(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.classTypeAlias);
     _variantField_8 = value;
   }
 
-  void set conditionalExpression_thenExpression(LinkedNodeBuilder value) {
+  set conditionalExpression_thenExpression(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.conditionalExpression);
     _variantField_8 = value;
   }
 
-  void set configuration_uri(LinkedNodeBuilder value) {
+  set configuration_uri(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.configuration);
     _variantField_8 = value;
   }
 
-  void set constructorDeclaration_parameters(LinkedNodeBuilder value) {
+  set constructorDeclaration_parameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.constructorDeclaration);
     _variantField_8 = value;
   }
 
-  void set fieldFormalParameter_formalParameters(LinkedNodeBuilder value) {
+  set fieldFormalParameter_formalParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
     _variantField_8 = value;
   }
 
-  void set functionExpression_typeParameters(LinkedNodeBuilder value) {
+  set functionExpression_typeParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionExpression);
     _variantField_8 = value;
   }
 
-  void set functionTypeAlias_typeParameters(LinkedNodeBuilder value) {
+  set functionTypeAlias_typeParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionTypeAlias);
     _variantField_8 = value;
   }
 
-  void set functionTypedFormalParameter_typeParameters(
-      LinkedNodeBuilder value) {
+  set functionTypedFormalParameter_typeParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionTypedFormalParameter);
     _variantField_8 = value;
   }
 
-  void set genericFunctionType_formalParameters(LinkedNodeBuilder value) {
+  set genericFunctionType_formalParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.genericFunctionType);
     _variantField_8 = value;
   }
 
-  void set ifElement_thenElement(LinkedNodeBuilder value) {
+  set ifElement_thenElement(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.ifElement);
     _variantField_8 = value;
   }
 
-  void set ifStatement_thenStatement(LinkedNodeBuilder value) {
+  set ifStatement_thenStatement(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.ifStatement);
     _variantField_8 = value;
   }
 
-  void set instanceCreationExpression_typeArguments(LinkedNodeBuilder value) {
+  set instanceCreationExpression_typeArguments(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.instanceCreationExpression);
     _variantField_8 = value;
   }
 
-  void set methodDeclaration_returnType(LinkedNodeBuilder value) {
+  set methodDeclaration_returnType(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.methodDeclaration);
     _variantField_8 = value;
   }
@@ -7830,7 +8567,7 @@
   }
 
   @override
-  int get indexExpression_leftBracket {
+  int get indexExpression_period {
     assert(kind == idl.LinkedNodeKind.indexExpression);
     return _variantField_16 ??= 0;
   }
@@ -7866,6 +8603,12 @@
   }
 
   @override
+  int get nativeFunctionBody_semicolon {
+    assert(kind == idl.LinkedNodeKind.nativeFunctionBody);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
   int get parenthesizedExpression_rightParenthesis {
     assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
     return _variantField_16 ??= 0;
@@ -7951,6 +8694,12 @@
   }
 
   @override
+  int get variableDeclarationList_lateKeyword {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    return _variantField_16 ??= 0;
+  }
+
+  @override
   int get whileStatement_rightParenthesis {
     assert(kind == idl.LinkedNodeKind.whileStatement);
     return _variantField_16 ??= 0;
@@ -7962,611 +8711,347 @@
     return _variantField_16 ??= 0;
   }
 
-  void set annotation_period(int value) {
+  set annotation_period(int value) {
     assert(kind == idl.LinkedNodeKind.annotation);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set argumentList_rightParenthesis(int value) {
+  set argumentList_rightParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.argumentList);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set assertInitializer_comma(int value) {
+  set assertInitializer_comma(int value) {
     assert(kind == idl.LinkedNodeKind.assertInitializer);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set assertStatement_comma(int value) {
+  set assertStatement_comma(int value) {
     assert(kind == idl.LinkedNodeKind.assertStatement);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set assignmentExpression_operator(int value) {
+  set assignmentExpression_operator(int value) {
     assert(kind == idl.LinkedNodeKind.assignmentExpression);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set binaryExpression_operator(int value) {
+  set binaryExpression_operator(int value) {
     assert(kind == idl.LinkedNodeKind.binaryExpression);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set block_rightBracket(int value) {
+  set block_rightBracket(int value) {
     assert(kind == idl.LinkedNodeKind.block);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set blockFunctionBody_star(int value) {
+  set blockFunctionBody_star(int value) {
     assert(kind == idl.LinkedNodeKind.blockFunctionBody);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set breakStatement_semicolon(int value) {
+  set breakStatement_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.breakStatement);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set catchClause_comma(int value) {
+  set catchClause_comma(int value) {
     assert(kind == idl.LinkedNodeKind.catchClause);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set classDeclaration_classKeyword(int value) {
+  set classDeclaration_classKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set classTypeAlias_equals(int value) {
+  set classTypeAlias_equals(int value) {
     assert(kind == idl.LinkedNodeKind.classTypeAlias);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set compilationUnit_endToken(int value) {
+  set compilationUnit_endToken(int value) {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set conditionalExpression_question(int value) {
+  set conditionalExpression_question(int value) {
     assert(kind == idl.LinkedNodeKind.conditionalExpression);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set configuration_leftParenthesis(int value) {
+  set configuration_leftParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.configuration);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set constructorDeclaration_externalKeyword(int value) {
+  set constructorDeclaration_externalKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.constructorDeclaration);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set constructorFieldInitializer_period(int value) {
+  set constructorFieldInitializer_period(int value) {
     assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set constructorName_period(int value) {
+  set constructorName_period(int value) {
     assert(kind == idl.LinkedNodeKind.constructorName);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set continueStatement_semicolon(int value) {
+  set continueStatement_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.continueStatement);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set doStatement_rightParenthesis(int value) {
+  set doStatement_rightParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.doStatement);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set enumDeclaration_leftBracket(int value) {
+  set enumDeclaration_leftBracket(int value) {
     assert(kind == idl.LinkedNodeKind.enumDeclaration);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set expressionFunctionBody_keyword(int value) {
+  set expressionFunctionBody_keyword(int value) {
     assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set fieldDeclaration_semicolon(int value) {
+  set fieldDeclaration_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.fieldDeclaration);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set fieldFormalParameter_period(int value) {
+  set fieldFormalParameter_period(int value) {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set formalParameterList_leftParenthesis(int value) {
+  set formalParameterList_leftParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.formalParameterList);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set forMixin_forKeyword(int value) {
+  set forMixin_forKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.forElement ||
         kind == idl.LinkedNodeKind.forStatement);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set forParts_rightSeparator(int value) {
+  set forParts_rightSeparator(int value) {
     assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
         kind == idl.LinkedNodeKind.forPartsWithExpression);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set functionDeclaration_propertyKeyword(int value) {
+  set functionDeclaration_propertyKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.functionDeclaration);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set genericFunctionType_question(int value) {
+  set genericFunctionType_question(int value) {
     assert(kind == idl.LinkedNodeKind.genericFunctionType);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set genericTypeAlias_equals(int value) {
+  set genericTypeAlias_equals(int value) {
     assert(kind == idl.LinkedNodeKind.genericTypeAlias);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set ifMixin_ifKeyword(int value) {
+  set ifMixin_ifKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.ifElement ||
         kind == idl.LinkedNodeKind.ifStatement);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set importDirective_deferredKeyword(int value) {
+  set importDirective_deferredKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.importDirective);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set indexExpression_leftBracket(int value) {
+  set indexExpression_period(int value) {
     assert(kind == idl.LinkedNodeKind.indexExpression);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set integerLiteral_value(int value) {
+  set integerLiteral_value(int value) {
     assert(kind == idl.LinkedNodeKind.integerLiteral);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set interpolationExpression_rightBracket(int value) {
+  set interpolationExpression_rightBracket(int value) {
     assert(kind == idl.LinkedNodeKind.interpolationExpression);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set isExpression_notOperator(int value) {
+  set isExpression_notOperator(int value) {
     assert(kind == idl.LinkedNodeKind.isExpression);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set listLiteral_rightBracket(int value) {
+  set listLiteral_rightBracket(int value) {
     assert(kind == idl.LinkedNodeKind.listLiteral);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set methodDeclaration_modifierKeyword(int value) {
+  set methodDeclaration_modifierKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.methodDeclaration);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set parenthesizedExpression_rightParenthesis(int value) {
+  set nativeFunctionBody_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.nativeFunctionBody);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  set parenthesizedExpression_rightParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set partOfDirective_ofKeyword(int value) {
+  set partOfDirective_ofKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.partOfDirective);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set postfixExpression_operator(int value) {
+  set postfixExpression_operator(int value) {
     assert(kind == idl.LinkedNodeKind.postfixExpression);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set prefixExpression_operator(int value) {
+  set prefixExpression_operator(int value) {
     assert(kind == idl.LinkedNodeKind.prefixExpression);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set redirectingConstructorInvocation_period(int value) {
+  set redirectingConstructorInvocation_period(int value) {
     assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set returnStatement_semicolon(int value) {
+  set returnStatement_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.returnStatement);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set setOrMapLiteral_rightBracket(int value) {
+  set setOrMapLiteral_rightBracket(int value) {
     assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set simpleIdentifier_token(int value) {
+  set simpleIdentifier_token(int value) {
     assert(kind == idl.LinkedNodeKind.simpleIdentifier);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set superConstructorInvocation_period(int value) {
+  set superConstructorInvocation_period(int value) {
     assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set switchMember_colon(int value) {
+  set switchMember_colon(int value) {
     assert(kind == idl.LinkedNodeKind.switchCase ||
         kind == idl.LinkedNodeKind.switchDefault);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set switchStatement_rightParenthesis(int value) {
+  set switchStatement_rightParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.switchStatement);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set tryStatement_tryKeyword(int value) {
+  set tryStatement_tryKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.tryStatement);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set typeArgumentList_rightBracket(int value) {
+  set typeArgumentList_rightBracket(int value) {
     assert(kind == idl.LinkedNodeKind.typeArgumentList);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set typeParameterList_rightBracket(int value) {
+  set typeParameterList_rightBracket(int value) {
     assert(kind == idl.LinkedNodeKind.typeParameterList);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set whileStatement_rightParenthesis(int value) {
+  set variableDeclarationList_lateKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    assert(value == null || value >= 0);
+    _variantField_16 = value;
+  }
+
+  set whileStatement_rightParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.whileStatement);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
-  void set yieldStatement_star(int value) {
+  set yieldStatement_star(int value) {
     assert(kind == idl.LinkedNodeKind.yieldStatement);
     assert(value == null || value >= 0);
     _variantField_16 = value;
   }
 
   @override
-  int get assertInitializer_leftParenthesis {
-    assert(kind == idl.LinkedNodeKind.assertInitializer);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get assertStatement_leftParenthesis {
-    assert(kind == idl.LinkedNodeKind.assertStatement);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get catchClause_leftParenthesis {
-    assert(kind == idl.LinkedNodeKind.catchClause);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get configuration_rightParenthesis {
-    assert(kind == idl.LinkedNodeKind.configuration);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get constructorDeclaration_factoryKeyword {
-    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get constructorFieldInitializer_thisKeyword {
-    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get directive_keyword {
-    assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective ||
-        kind == idl.LinkedNodeKind.libraryDirective ||
-        kind == idl.LinkedNodeKind.partDirective ||
-        kind == idl.LinkedNodeKind.partOfDirective);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get doStatement_doKeyword {
-    assert(kind == idl.LinkedNodeKind.doStatement);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get enumDeclaration_rightBracket {
-    assert(kind == idl.LinkedNodeKind.enumDeclaration);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get expressionFunctionBody_semicolon {
-    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get fieldDeclaration_staticKeyword {
-    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get fieldFormalParameter_thisKeyword {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get formalParameterList_rightDelimiter {
-    assert(kind == idl.LinkedNodeKind.formalParameterList);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get forMixin_leftParenthesis {
-    assert(kind == idl.LinkedNodeKind.forElement ||
-        kind == idl.LinkedNodeKind.forStatement);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get ifMixin_leftParenthesis {
-    assert(kind == idl.LinkedNodeKind.ifElement ||
-        kind == idl.LinkedNodeKind.ifStatement);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get indexExpression_rightBracket {
-    assert(kind == idl.LinkedNodeKind.indexExpression);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get methodDeclaration_operatorKeyword {
-    assert(kind == idl.LinkedNodeKind.methodDeclaration);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get redirectingConstructorInvocation_thisKeyword {
-    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get superConstructorInvocation_superKeyword {
-    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get switchStatement_switchKeyword {
-    assert(kind == idl.LinkedNodeKind.switchStatement);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get whileStatement_whileKeyword {
-    assert(kind == idl.LinkedNodeKind.whileStatement);
-    return _variantField_17 ??= 0;
-  }
-
-  @override
-  int get yieldStatement_semicolon {
-    assert(kind == idl.LinkedNodeKind.yieldStatement);
-    return _variantField_17 ??= 0;
-  }
-
-  void set assertInitializer_leftParenthesis(int value) {
-    assert(kind == idl.LinkedNodeKind.assertInitializer);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set assertStatement_leftParenthesis(int value) {
-    assert(kind == idl.LinkedNodeKind.assertStatement);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set catchClause_leftParenthesis(int value) {
-    assert(kind == idl.LinkedNodeKind.catchClause);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set configuration_rightParenthesis(int value) {
-    assert(kind == idl.LinkedNodeKind.configuration);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set constructorDeclaration_factoryKeyword(int value) {
-    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set constructorFieldInitializer_thisKeyword(int value) {
-    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set directive_keyword(int value) {
-    assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective ||
-        kind == idl.LinkedNodeKind.libraryDirective ||
-        kind == idl.LinkedNodeKind.partDirective ||
-        kind == idl.LinkedNodeKind.partOfDirective);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set doStatement_doKeyword(int value) {
-    assert(kind == idl.LinkedNodeKind.doStatement);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set enumDeclaration_rightBracket(int value) {
-    assert(kind == idl.LinkedNodeKind.enumDeclaration);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set expressionFunctionBody_semicolon(int value) {
-    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set fieldDeclaration_staticKeyword(int value) {
-    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set fieldFormalParameter_thisKeyword(int value) {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set formalParameterList_rightDelimiter(int value) {
-    assert(kind == idl.LinkedNodeKind.formalParameterList);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set forMixin_leftParenthesis(int value) {
-    assert(kind == idl.LinkedNodeKind.forElement ||
-        kind == idl.LinkedNodeKind.forStatement);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set ifMixin_leftParenthesis(int value) {
-    assert(kind == idl.LinkedNodeKind.ifElement ||
-        kind == idl.LinkedNodeKind.ifStatement);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set indexExpression_rightBracket(int value) {
-    assert(kind == idl.LinkedNodeKind.indexExpression);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set methodDeclaration_operatorKeyword(int value) {
-    assert(kind == idl.LinkedNodeKind.methodDeclaration);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set redirectingConstructorInvocation_thisKeyword(int value) {
-    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set superConstructorInvocation_superKeyword(int value) {
-    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set switchStatement_switchKeyword(int value) {
-    assert(kind == idl.LinkedNodeKind.switchStatement);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set whileStatement_whileKeyword(int value) {
-    assert(kind == idl.LinkedNodeKind.whileStatement);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  void set yieldStatement_semicolon(int value) {
-    assert(kind == idl.LinkedNodeKind.yieldStatement);
-    assert(value == null || value >= 0);
-    _variantField_17 = value;
-  }
-
-  @override
   int get assertInitializer_rightParenthesis {
     assert(kind == idl.LinkedNodeKind.assertInitializer);
     return _variantField_18 ??= 0;
@@ -8604,6 +9089,16 @@
   }
 
   @override
+  int get directive_keyword {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
   int get doStatement_semicolon {
     assert(kind == idl.LinkedNodeKind.doStatement);
     return _variantField_18 ??= 0;
@@ -8623,17 +9118,22 @@
   }
 
   @override
+  int get indexExpression_rightBracket {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    return _variantField_18 ??= 0;
+  }
+
+  @override
   int get methodDeclaration_propertyKeyword {
     assert(kind == idl.LinkedNodeKind.methodDeclaration);
     return _variantField_18 ??= 0;
   }
 
   @override
-  int get namespaceDirective_semicolon {
-    assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective ||
-        kind == idl.LinkedNodeKind.libraryDirective ||
-        kind == idl.LinkedNodeKind.partDirective);
+  int get normalFormalParameter_requiredKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
     return _variantField_18 ??= 0;
   }
 
@@ -8651,84 +9151,99 @@
     return _variantField_18 ??= 0;
   }
 
-  void set assertInitializer_rightParenthesis(int value) {
+  set assertInitializer_rightParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.assertInitializer);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set assertStatement_rightParenthesis(int value) {
+  set assertStatement_rightParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.assertStatement);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set catchClause_onKeyword(int value) {
+  set catchClause_onKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.catchClause);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set classOrMixinDeclaration_rightBracket(int value) {
+  set classOrMixinDeclaration_rightBracket(int value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration ||
         kind == idl.LinkedNodeKind.mixinDeclaration);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set configuration_equalToken(int value) {
+  set configuration_equalToken(int value) {
     assert(kind == idl.LinkedNodeKind.configuration);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set constructorDeclaration_period(int value) {
+  set constructorDeclaration_period(int value) {
     assert(kind == idl.LinkedNodeKind.constructorDeclaration);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set doStatement_semicolon(int value) {
+  set directive_keyword(int value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  set doStatement_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.doStatement);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set formalParameterList_rightParenthesis(int value) {
+  set formalParameterList_rightParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.formalParameterList);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set ifMixin_rightParenthesis(int value) {
+  set ifMixin_rightParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.ifElement ||
         kind == idl.LinkedNodeKind.ifStatement);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set methodDeclaration_propertyKeyword(int value) {
+  set indexExpression_rightBracket(int value) {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    assert(value == null || value >= 0);
+    _variantField_18 = value;
+  }
+
+  set methodDeclaration_propertyKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.methodDeclaration);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set namespaceDirective_semicolon(int value) {
-    assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective ||
-        kind == idl.LinkedNodeKind.libraryDirective ||
-        kind == idl.LinkedNodeKind.partDirective);
+  set normalFormalParameter_requiredKeyword(int value) {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set switchStatement_leftBracket(int value) {
+  set switchStatement_leftBracket(int value) {
     assert(kind == idl.LinkedNodeKind.switchStatement);
     assert(value == null || value >= 0);
     _variantField_18 = value;
   }
 
-  void set typeAlias_typedefKeyword(int value) {
+  set typeAlias_typedefKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.classTypeAlias ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
         kind == idl.LinkedNodeKind.genericTypeAlias);
@@ -8824,58 +9339,58 @@
     return _variantField_19 ??= 0;
   }
 
-  void set assertStatement_semicolon(int value) {
+  set assertStatement_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.assertStatement);
     assert(value == null || value >= 0);
     _variantField_19 = value;
   }
 
-  void set catchClause_rightParenthesis(int value) {
+  set catchClause_rightParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.catchClause);
     assert(value == null || value >= 0);
     _variantField_19 = value;
   }
 
-  void set classOrMixinDeclaration_leftBracket(int value) {
+  set classOrMixinDeclaration_leftBracket(int value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration ||
         kind == idl.LinkedNodeKind.mixinDeclaration);
     assert(value == null || value >= 0);
     _variantField_19 = value;
   }
 
-  void set combinator_keyword(int value) {
+  set combinator_keyword(int value) {
     assert(kind == idl.LinkedNodeKind.hideCombinator ||
         kind == idl.LinkedNodeKind.showCombinator);
     assert(value == null || value >= 0);
     _variantField_19 = value;
   }
 
-  void set constructorDeclaration_separator(int value) {
+  set constructorDeclaration_separator(int value) {
     assert(kind == idl.LinkedNodeKind.constructorDeclaration);
     assert(value == null || value >= 0);
     _variantField_19 = value;
   }
 
-  void set doStatement_whileKeyword(int value) {
+  set doStatement_whileKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.doStatement);
     assert(value == null || value >= 0);
     _variantField_19 = value;
   }
 
-  void set forMixin_rightParenthesis(int value) {
+  set forMixin_rightParenthesis(int value) {
     assert(kind == idl.LinkedNodeKind.forElement ||
         kind == idl.LinkedNodeKind.forStatement);
     assert(value == null || value >= 0);
     _variantField_19 = value;
   }
 
-  void set methodDeclaration_actualProperty(int value) {
+  set methodDeclaration_actualProperty(int value) {
     assert(kind == idl.LinkedNodeKind.methodDeclaration);
     assert(value == null || value >= 0);
     _variantField_19 = value;
   }
 
-  void set normalFormalParameter_covariantKeyword(int value) {
+  set normalFormalParameter_covariantKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.simpleFormalParameter);
@@ -8883,13 +9398,13 @@
     _variantField_19 = value;
   }
 
-  void set switchStatement_rightBracket(int value) {
+  set switchStatement_rightBracket(int value) {
     assert(kind == idl.LinkedNodeKind.switchStatement);
     assert(value == null || value >= 0);
     _variantField_19 = value;
   }
 
-  void set typeAlias_semicolon(int value) {
+  set typeAlias_semicolon(int value) {
     assert(kind == idl.LinkedNodeKind.classTypeAlias ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
         kind == idl.LinkedNodeKind.genericTypeAlias);
@@ -8897,14 +9412,14 @@
     _variantField_19 = value;
   }
 
-  void set typedLiteral_constKeyword(int value) {
+  set typedLiteral_constKeyword(int value) {
     assert(kind == idl.LinkedNodeKind.listLiteral ||
         kind == idl.LinkedNodeKind.setOrMapLiteral);
     assert(value == null || value >= 0);
     _variantField_19 = value;
   }
 
-  void set uriBasedDirective_uriElement(int value) {
+  set uriBasedDirective_uriElement(int value) {
     assert(kind == idl.LinkedNodeKind.exportDirective ||
         kind == idl.LinkedNodeKind.importDirective ||
         kind == idl.LinkedNodeKind.partDirective);
@@ -8913,118 +9428,6 @@
   }
 
   @override
-  LinkedNodeTypeBuilder get binaryExpression_invokeType {
-    assert(kind == idl.LinkedNodeKind.binaryExpression);
-    return _variantField_24;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get fieldFormalParameter_type2 {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
-    return _variantField_24;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get functionDeclaration_returnType2 {
-    assert(kind == idl.LinkedNodeKind.functionDeclaration);
-    return _variantField_24;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get functionTypeAlias_returnType2 {
-    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
-    return _variantField_24;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get genericFunctionType_returnType2 {
-    assert(kind == idl.LinkedNodeKind.genericFunctionType);
-    return _variantField_24;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get invocationExpression_invokeType {
-    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
-        kind == idl.LinkedNodeKind.methodInvocation);
-    return _variantField_24;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get methodDeclaration_returnType2 {
-    assert(kind == idl.LinkedNodeKind.methodDeclaration);
-    return _variantField_24;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get simpleFormalParameter_type2 {
-    assert(kind == idl.LinkedNodeKind.simpleFormalParameter);
-    return _variantField_24;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get typeName_type {
-    assert(kind == idl.LinkedNodeKind.typeName);
-    return _variantField_24;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get variableDeclaration_type2 {
-    assert(kind == idl.LinkedNodeKind.variableDeclaration);
-    return _variantField_24;
-  }
-
-  void set binaryExpression_invokeType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.binaryExpression);
-    _variantField_24 = value;
-  }
-
-  void set fieldFormalParameter_type2(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
-    _variantField_24 = value;
-  }
-
-  void set functionDeclaration_returnType2(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.functionDeclaration);
-    _variantField_24 = value;
-  }
-
-  void set functionTypeAlias_returnType2(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
-    _variantField_24 = value;
-  }
-
-  void set genericFunctionType_returnType2(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.genericFunctionType);
-    _variantField_24 = value;
-  }
-
-  void set invocationExpression_invokeType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
-        kind == idl.LinkedNodeKind.methodInvocation);
-    _variantField_24 = value;
-  }
-
-  void set methodDeclaration_returnType2(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.methodDeclaration);
-    _variantField_24 = value;
-  }
-
-  void set simpleFormalParameter_type2(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.simpleFormalParameter);
-    _variantField_24 = value;
-  }
-
-  void set typeName_type(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.typeName);
-    _variantField_24 = value;
-  }
-
-  void set variableDeclaration_type2(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.variableDeclaration);
-    _variantField_24 = value;
-  }
-
-  @override
   bool get booleanLiteral_value {
     assert(kind == idl.LinkedNodeKind.booleanLiteral);
     return _variantField_27 ??= false;
@@ -9037,16 +9440,11 @@
   }
 
   @override
-  bool get defaultFormalParameter_isNamed {
-    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
-    return _variantField_27 ??= false;
-  }
-
-  @override
-  bool get normalFormalParameter_isCovariant {
+  bool get inheritsCovariant {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
-        kind == idl.LinkedNodeKind.simpleFormalParameter);
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
     return _variantField_27 ??= false;
   }
 
@@ -9056,33 +9454,53 @@
     return _variantField_27 ??= false;
   }
 
-  void set booleanLiteral_value(bool value) {
+  @override
+  bool get simpleIdentifier_isDeclaration {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    return _variantField_27 ??= false;
+  }
+
+  @override
+  bool get typeAlias_hasSelfReference {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias);
+    return _variantField_27 ??= false;
+  }
+
+  set booleanLiteral_value(bool value) {
     assert(kind == idl.LinkedNodeKind.booleanLiteral);
     _variantField_27 = value;
   }
 
-  void set classDeclaration_isDartObject(bool value) {
+  set classDeclaration_isDartObject(bool value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration);
     _variantField_27 = value;
   }
 
-  void set defaultFormalParameter_isNamed(bool value) {
-    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
-    _variantField_27 = value;
-  }
-
-  void set normalFormalParameter_isCovariant(bool value) {
+  set inheritsCovariant(bool value) {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
-        kind == idl.LinkedNodeKind.simpleFormalParameter);
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
     _variantField_27 = value;
   }
 
-  void set setOrMapLiteral_isMap(bool value) {
+  set setOrMapLiteral_isMap(bool value) {
     assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
     _variantField_27 = value;
   }
 
+  set simpleIdentifier_isDeclaration(bool value) {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    _variantField_27 = value;
+  }
+
+  set typeAlias_hasSelfReference(bool value) {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias);
+    _variantField_27 = value;
+  }
+
   @override
   LinkedNodeBuilder get catchClause_stackTraceParameter {
     assert(kind == idl.LinkedNodeKind.catchClause);
@@ -9113,28 +9531,27 @@
     return _variantField_9;
   }
 
-  void set catchClause_stackTraceParameter(LinkedNodeBuilder value) {
+  set catchClause_stackTraceParameter(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.catchClause);
     _variantField_9 = value;
   }
 
-  void set classTypeAlias_implementsClause(LinkedNodeBuilder value) {
+  set classTypeAlias_implementsClause(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.classTypeAlias);
     _variantField_9 = value;
   }
 
-  void set constructorDeclaration_redirectedConstructor(
-      LinkedNodeBuilder value) {
+  set constructorDeclaration_redirectedConstructor(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.constructorDeclaration);
     _variantField_9 = value;
   }
 
-  void set ifElement_elseElement(LinkedNodeBuilder value) {
+  set ifElement_elseElement(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.ifElement);
     _variantField_9 = value;
   }
 
-  void set methodDeclaration_typeParameters(LinkedNodeBuilder value) {
+  set methodDeclaration_typeParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.methodDeclaration);
     _variantField_9 = value;
   }
@@ -9161,19 +9578,19 @@
     return _variantField_12;
   }
 
-  void set classOrMixinDeclaration_implementsClause(LinkedNodeBuilder value) {
+  set classOrMixinDeclaration_implementsClause(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration ||
         kind == idl.LinkedNodeKind.mixinDeclaration);
     _variantField_12 = value;
   }
 
-  void set invocationExpression_typeArguments(LinkedNodeBuilder value) {
+  set invocationExpression_typeArguments(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
         kind == idl.LinkedNodeKind.methodInvocation);
     _variantField_12 = value;
   }
 
-  void set normalFormalParameter_identifier(LinkedNodeBuilder value) {
+  set normalFormalParameter_identifier(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.simpleFormalParameter);
@@ -9194,13 +9611,13 @@
     return _variantField_5 ??= <LinkedNodeBuilder>[];
   }
 
-  void set classOrMixinDeclaration_members(List<LinkedNodeBuilder> value) {
+  set classOrMixinDeclaration_members(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration ||
         kind == idl.LinkedNodeKind.mixinDeclaration);
     _variantField_5 = value;
   }
 
-  void set forParts_updaters(List<LinkedNodeBuilder> value) {
+  set forParts_updaters(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
         kind == idl.LinkedNodeKind.forPartsWithExpression);
     _variantField_5 = value;
@@ -9213,13 +9630,117 @@
     return _variantField_13;
   }
 
-  void set classOrMixinDeclaration_typeParameters(LinkedNodeBuilder value) {
+  set classOrMixinDeclaration_typeParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration ||
         kind == idl.LinkedNodeKind.mixinDeclaration);
     _variantField_13 = value;
   }
 
   @override
+  int get codeLength {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.compilationUnit ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.defaultFormalParameter ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    return _variantField_34 ??= 0;
+  }
+
+  set codeLength(int value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.compilationUnit ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.defaultFormalParameter ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_34 = value;
+  }
+
+  @override
+  int get codeOffset {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.compilationUnit ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.defaultFormalParameter ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    return _variantField_33 ??= 0;
+  }
+
+  @override
+  int get directive_semicolon {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    return _variantField_33 ??= 0;
+  }
+
+  set codeOffset(int value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.compilationUnit ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.defaultFormalParameter ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    assert(value == null || value >= 0);
+    _variantField_33 = value;
+  }
+
+  set directive_semicolon(int value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    assert(value == null || value >= 0);
+    _variantField_33 = value;
+  }
+
+  @override
   List<int> get comment_tokens {
     assert(kind == idl.LinkedNodeKind.comment);
     return _variantField_28 ??= <int>[];
@@ -9231,13 +9752,13 @@
     return _variantField_28 ??= <int>[];
   }
 
-  void set comment_tokens(List<int> value) {
+  set comment_tokens(List<int> value) {
     assert(kind == idl.LinkedNodeKind.comment);
     assert(value == null || value.every((e) => e >= 0));
     _variantField_28 = value;
   }
 
-  void set symbolLiteral_components(List<int> value) {
+  set symbolLiteral_components(List<int> value) {
     assert(kind == idl.LinkedNodeKind.symbolLiteral);
     assert(value == null || value.every((e) => e >= 0));
     _variantField_28 = value;
@@ -9249,7 +9770,7 @@
     return _variantField_29 ??= idl.LinkedNodeCommentType.block;
   }
 
-  void set comment_type(idl.LinkedNodeCommentType value) {
+  set comment_type(idl.LinkedNodeCommentType value) {
     assert(kind == idl.LinkedNodeKind.comment);
     _variantField_29 = value;
   }
@@ -9274,18 +9795,18 @@
     return _variantField_3 ??= <LinkedNodeBuilder>[];
   }
 
-  void set compilationUnit_directives(List<LinkedNodeBuilder> value) {
+  set compilationUnit_directives(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     _variantField_3 = value;
   }
 
-  void set namespaceDirective_configurations(List<LinkedNodeBuilder> value) {
+  set namespaceDirective_configurations(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.exportDirective ||
         kind == idl.LinkedNodeKind.importDirective);
     _variantField_3 = value;
   }
 
-  void set switchMember_labels(List<LinkedNodeBuilder> value) {
+  set switchMember_labels(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.switchCase ||
         kind == idl.LinkedNodeKind.switchDefault);
     _variantField_3 = value;
@@ -9303,23 +9824,35 @@
     return _variantField_10;
   }
 
-  void set constructorDeclaration_returnType(LinkedNodeBuilder value) {
+  set constructorDeclaration_returnType(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.constructorDeclaration);
     _variantField_10 = value;
   }
 
-  void set methodDeclaration_name(LinkedNodeBuilder value) {
+  set methodDeclaration_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.methodDeclaration);
     _variantField_10 = value;
   }
 
   @override
+  idl.LinkedNodeFormalParameterKind get defaultFormalParameter_kind {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    return _variantField_26 ??=
+        idl.LinkedNodeFormalParameterKind.requiredPositional;
+  }
+
+  set defaultFormalParameter_kind(idl.LinkedNodeFormalParameterKind value) {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    _variantField_26 = value;
+  }
+
+  @override
   double get doubleLiteral_value {
     assert(kind == idl.LinkedNodeKind.doubleLiteral);
     return _variantField_21 ??= 0.0;
   }
 
-  void set doubleLiteral_value(double value) {
+  set doubleLiteral_value(double value) {
     assert(kind == idl.LinkedNodeKind.doubleLiteral);
     _variantField_21 = value;
   }
@@ -9361,7 +9894,13 @@
     return _variantField_25;
   }
 
-  void set expression_type(LinkedNodeTypeBuilder value) {
+  @override
+  LinkedNodeTypeBuilder get genericFunctionType_type {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    return _variantField_25;
+  }
+
+  set expression_type(LinkedNodeTypeBuilder value) {
     assert(kind == idl.LinkedNodeKind.adjacentStrings ||
         kind == idl.LinkedNodeKind.assignmentExpression ||
         kind == idl.LinkedNodeKind.asExpression ||
@@ -9397,19 +9936,9 @@
     _variantField_25 = value;
   }
 
-  @override
-  idl.LinkedNodeFormalParameterKind get formalParameter_kind {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
-        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
-        kind == idl.LinkedNodeKind.simpleFormalParameter);
-    return _variantField_26 ??= idl.LinkedNodeFormalParameterKind.required;
-  }
-
-  void set formalParameter_kind(idl.LinkedNodeFormalParameterKind value) {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
-        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
-        kind == idl.LinkedNodeKind.simpleFormalParameter);
-    _variantField_26 = value;
+  set genericFunctionType_type(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_25 = value;
   }
 
   @override
@@ -9418,7 +9947,7 @@
     return _variantField_30 ??= '';
   }
 
-  void set interpolationString_value(String value) {
+  set interpolationString_value(String value) {
     assert(kind == idl.LinkedNodeKind.interpolationString);
     _variantField_30 = value;
   }
@@ -9465,13 +9994,13 @@
     return _variantField_14;
   }
 
-  void set invocationExpression_arguments(LinkedNodeBuilder value) {
+  set invocationExpression_arguments(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
         kind == idl.LinkedNodeKind.methodInvocation);
     _variantField_14 = value;
   }
 
-  void set namedCompilationUnitMember_name(LinkedNodeBuilder value) {
+  set namedCompilationUnitMember_name(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.classDeclaration ||
         kind == idl.LinkedNodeKind.classTypeAlias ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
@@ -9482,20 +10011,20 @@
     _variantField_14 = value;
   }
 
-  void set normalFormalParameter_comment(LinkedNodeBuilder value) {
+  set normalFormalParameter_comment(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.simpleFormalParameter);
     _variantField_14 = value;
   }
 
-  void set typedLiteral_typeArguments(LinkedNodeBuilder value) {
+  set typedLiteral_typeArguments(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.listLiteral ||
         kind == idl.LinkedNodeKind.setOrMapLiteral);
     _variantField_14 = value;
   }
 
-  void set uriBasedDirective_uri(LinkedNodeBuilder value) {
+  set uriBasedDirective_uri(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.exportDirective ||
         kind == idl.LinkedNodeKind.importDirective ||
         kind == idl.LinkedNodeKind.partDirective);
@@ -9505,43 +10034,33 @@
   @override
   bool get isSynthetic => _isSynthetic ??= false;
 
-  void set isSynthetic(bool value) {
+  set isSynthetic(bool value) {
     this._isSynthetic = value;
   }
 
   @override
   idl.LinkedNodeKind get kind => _kind ??= idl.LinkedNodeKind.adjacentStrings;
 
-  void set kind(idl.LinkedNodeKind value) {
+  set kind(idl.LinkedNodeKind value) {
     this._kind = value;
   }
 
   @override
-  String get namespaceDirective_selectedUriContent {
-    assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective ||
-        kind == idl.LinkedNodeKind.partDirective ||
-        kind == idl.LinkedNodeKind.partOfDirective);
-    return _variantField_23 ??= '';
+  List<String> get mixinDeclaration_superInvokedNames {
+    assert(kind == idl.LinkedNodeKind.mixinDeclaration);
+    return _variantField_36 ??= <String>[];
   }
 
-  void set namespaceDirective_selectedUriContent(String value) {
-    assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective ||
-        kind == idl.LinkedNodeKind.partDirective ||
-        kind == idl.LinkedNodeKind.partOfDirective);
-    _variantField_23 = value;
+  set mixinDeclaration_superInvokedNames(List<String> value) {
+    assert(kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_36 = value;
   }
 
   @override
-  bool get setOrMapLiteral_isSet {
-    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
-    return _variantField_31 ??= false;
-  }
-
-  void set setOrMapLiteral_isSet(bool value) {
-    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
-    _variantField_31 = value;
+  String get namespaceDirective_selectedUri {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective);
+    return _variantField_20 ??= '';
   }
 
   @override
@@ -9550,12 +10069,61 @@
     return _variantField_20 ??= '';
   }
 
-  void set simpleStringLiteral_value(String value) {
+  set namespaceDirective_selectedUri(String value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective);
+    _variantField_20 = value;
+  }
+
+  set simpleStringLiteral_value(String value) {
     assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
     _variantField_20 = value;
   }
 
   @override
+  bool get setOrMapLiteral_isSet {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    return _variantField_31 ??= false;
+  }
+
+  @override
+  bool get simplyBoundable_isSimplyBounded {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    return _variantField_31 ??= false;
+  }
+
+  set setOrMapLiteral_isSet(bool value) {
+    assert(kind == idl.LinkedNodeKind.setOrMapLiteral);
+    _variantField_31 = value;
+  }
+
+  set simplyBoundable_isSimplyBounded(bool value) {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_31 = value;
+  }
+
+  @override
+  TopLevelInferenceErrorBuilder get topLevelTypeInferenceError {
+    assert(kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    return _variantField_35;
+  }
+
+  set topLevelTypeInferenceError(TopLevelInferenceErrorBuilder value) {
+    assert(kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    _variantField_35 = value;
+  }
+
+  @override
   String get uriBasedDirective_uriContent {
     assert(kind == idl.LinkedNodeKind.exportDirective ||
         kind == idl.LinkedNodeKind.importDirective ||
@@ -9563,7 +10131,7 @@
     return _variantField_22 ??= '';
   }
 
-  void set uriBasedDirective_uriContent(String value) {
+  set uriBasedDirective_uriContent(String value) {
     assert(kind == idl.LinkedNodeKind.exportDirective ||
         kind == idl.LinkedNodeKind.importDirective ||
         kind == idl.LinkedNodeKind.partDirective);
@@ -9576,12 +10144,286 @@
     return _variantField_32;
   }
 
-  void set variableDeclaration_declaration(
+  set variableDeclaration_declaration(
       LinkedNodeVariablesDeclarationBuilder value) {
     assert(kind == idl.LinkedNodeKind.variableDeclaration);
     _variantField_32 = value;
   }
 
+  LinkedNodeBuilder.functionDeclaration({
+    LinkedNodeTypeBuilder actualReturnType,
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder functionDeclaration_functionExpression,
+    int functionDeclaration_externalKeyword,
+    LinkedNodeBuilder functionDeclaration_returnType,
+    int functionDeclaration_propertyKeyword,
+    int codeLength,
+    int codeOffset,
+    LinkedNodeBuilder namedCompilationUnitMember_name,
+  })  : _kind = idl.LinkedNodeKind.functionDeclaration,
+        _variantField_24 = actualReturnType,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = functionDeclaration_functionExpression,
+        _variantField_15 = functionDeclaration_externalKeyword,
+        _variantField_7 = functionDeclaration_returnType,
+        _variantField_16 = functionDeclaration_propertyKeyword,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_14 = namedCompilationUnitMember_name;
+
+  LinkedNodeBuilder.functionExpression({
+    LinkedNodeTypeBuilder actualReturnType,
+    LinkedNodeBuilder functionExpression_body,
+    LinkedNodeBuilder functionExpression_formalParameters,
+    LinkedNodeBuilder functionExpression_typeParameters,
+  })  : _kind = idl.LinkedNodeKind.functionExpression,
+        _variantField_24 = actualReturnType,
+        _variantField_6 = functionExpression_body,
+        _variantField_7 = functionExpression_formalParameters,
+        _variantField_8 = functionExpression_typeParameters;
+
+  LinkedNodeBuilder.functionTypeAlias({
+    LinkedNodeTypeBuilder actualReturnType,
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder functionTypeAlias_formalParameters,
+    LinkedNodeBuilder functionTypeAlias_returnType,
+    LinkedNodeBuilder functionTypeAlias_typeParameters,
+    int typeAlias_typedefKeyword,
+    int typeAlias_semicolon,
+    bool typeAlias_hasSelfReference,
+    int codeLength,
+    int codeOffset,
+    LinkedNodeBuilder namedCompilationUnitMember_name,
+    bool simplyBoundable_isSimplyBounded,
+  })  : _kind = idl.LinkedNodeKind.functionTypeAlias,
+        _variantField_24 = actualReturnType,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = functionTypeAlias_formalParameters,
+        _variantField_7 = functionTypeAlias_returnType,
+        _variantField_8 = functionTypeAlias_typeParameters,
+        _variantField_18 = typeAlias_typedefKeyword,
+        _variantField_19 = typeAlias_semicolon,
+        _variantField_27 = typeAlias_hasSelfReference,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_14 = namedCompilationUnitMember_name,
+        _variantField_31 = simplyBoundable_isSimplyBounded;
+
+  LinkedNodeBuilder.genericFunctionType({
+    LinkedNodeTypeBuilder actualReturnType,
+    LinkedNodeBuilder genericFunctionType_typeParameters,
+    int genericFunctionType_functionKeyword,
+    LinkedNodeBuilder genericFunctionType_returnType,
+    int genericFunctionType_id,
+    LinkedNodeBuilder genericFunctionType_formalParameters,
+    int genericFunctionType_question,
+    LinkedNodeTypeBuilder genericFunctionType_type,
+  })  : _kind = idl.LinkedNodeKind.genericFunctionType,
+        _variantField_24 = actualReturnType,
+        _variantField_6 = genericFunctionType_typeParameters,
+        _variantField_15 = genericFunctionType_functionKeyword,
+        _variantField_7 = genericFunctionType_returnType,
+        _variantField_17 = genericFunctionType_id,
+        _variantField_8 = genericFunctionType_formalParameters,
+        _variantField_16 = genericFunctionType_question,
+        _variantField_25 = genericFunctionType_type;
+
+  LinkedNodeBuilder.methodDeclaration({
+    LinkedNodeTypeBuilder actualReturnType,
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder methodDeclaration_body,
+    int methodDeclaration_externalKeyword,
+    LinkedNodeBuilder methodDeclaration_formalParameters,
+    int methodDeclaration_operatorKeyword,
+    LinkedNodeBuilder methodDeclaration_returnType,
+    int methodDeclaration_modifierKeyword,
+    int methodDeclaration_propertyKeyword,
+    int methodDeclaration_actualProperty,
+    LinkedNodeBuilder methodDeclaration_typeParameters,
+    int codeLength,
+    int codeOffset,
+    LinkedNodeBuilder methodDeclaration_name,
+  })  : _kind = idl.LinkedNodeKind.methodDeclaration,
+        _variantField_24 = actualReturnType,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = methodDeclaration_body,
+        _variantField_15 = methodDeclaration_externalKeyword,
+        _variantField_7 = methodDeclaration_formalParameters,
+        _variantField_17 = methodDeclaration_operatorKeyword,
+        _variantField_8 = methodDeclaration_returnType,
+        _variantField_16 = methodDeclaration_modifierKeyword,
+        _variantField_18 = methodDeclaration_propertyKeyword,
+        _variantField_19 = methodDeclaration_actualProperty,
+        _variantField_9 = methodDeclaration_typeParameters,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_10 = methodDeclaration_name;
+
+  LinkedNodeBuilder.fieldFormalParameter({
+    LinkedNodeTypeBuilder actualType,
+    List<LinkedNodeBuilder> normalFormalParameter_metadata,
+    LinkedNodeBuilder fieldFormalParameter_type,
+    int fieldFormalParameter_keyword,
+    LinkedNodeBuilder fieldFormalParameter_typeParameters,
+    int fieldFormalParameter_thisKeyword,
+    LinkedNodeBuilder fieldFormalParameter_formalParameters,
+    int fieldFormalParameter_period,
+    int normalFormalParameter_requiredKeyword,
+    int normalFormalParameter_covariantKeyword,
+    bool inheritsCovariant,
+    LinkedNodeBuilder normalFormalParameter_identifier,
+    int codeLength,
+    int codeOffset,
+    LinkedNodeBuilder normalFormalParameter_comment,
+  })  : _kind = idl.LinkedNodeKind.fieldFormalParameter,
+        _variantField_24 = actualType,
+        _variantField_4 = normalFormalParameter_metadata,
+        _variantField_6 = fieldFormalParameter_type,
+        _variantField_15 = fieldFormalParameter_keyword,
+        _variantField_7 = fieldFormalParameter_typeParameters,
+        _variantField_17 = fieldFormalParameter_thisKeyword,
+        _variantField_8 = fieldFormalParameter_formalParameters,
+        _variantField_16 = fieldFormalParameter_period,
+        _variantField_18 = normalFormalParameter_requiredKeyword,
+        _variantField_19 = normalFormalParameter_covariantKeyword,
+        _variantField_27 = inheritsCovariant,
+        _variantField_12 = normalFormalParameter_identifier,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_14 = normalFormalParameter_comment;
+
+  LinkedNodeBuilder.functionTypedFormalParameter({
+    LinkedNodeTypeBuilder actualType,
+    List<LinkedNodeBuilder> normalFormalParameter_metadata,
+    LinkedNodeBuilder functionTypedFormalParameter_formalParameters,
+    LinkedNodeBuilder functionTypedFormalParameter_returnType,
+    LinkedNodeBuilder functionTypedFormalParameter_typeParameters,
+    int normalFormalParameter_requiredKeyword,
+    int normalFormalParameter_covariantKeyword,
+    bool inheritsCovariant,
+    LinkedNodeBuilder normalFormalParameter_identifier,
+    int codeLength,
+    int codeOffset,
+    LinkedNodeBuilder normalFormalParameter_comment,
+  })  : _kind = idl.LinkedNodeKind.functionTypedFormalParameter,
+        _variantField_24 = actualType,
+        _variantField_4 = normalFormalParameter_metadata,
+        _variantField_6 = functionTypedFormalParameter_formalParameters,
+        _variantField_7 = functionTypedFormalParameter_returnType,
+        _variantField_8 = functionTypedFormalParameter_typeParameters,
+        _variantField_18 = normalFormalParameter_requiredKeyword,
+        _variantField_19 = normalFormalParameter_covariantKeyword,
+        _variantField_27 = inheritsCovariant,
+        _variantField_12 = normalFormalParameter_identifier,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_14 = normalFormalParameter_comment;
+
+  LinkedNodeBuilder.simpleFormalParameter({
+    LinkedNodeTypeBuilder actualType,
+    List<LinkedNodeBuilder> normalFormalParameter_metadata,
+    LinkedNodeBuilder simpleFormalParameter_type,
+    int simpleFormalParameter_keyword,
+    int normalFormalParameter_requiredKeyword,
+    int normalFormalParameter_covariantKeyword,
+    bool inheritsCovariant,
+    LinkedNodeBuilder normalFormalParameter_identifier,
+    int codeLength,
+    int codeOffset,
+    LinkedNodeBuilder normalFormalParameter_comment,
+    TopLevelInferenceErrorBuilder topLevelTypeInferenceError,
+  })  : _kind = idl.LinkedNodeKind.simpleFormalParameter,
+        _variantField_24 = actualType,
+        _variantField_4 = normalFormalParameter_metadata,
+        _variantField_6 = simpleFormalParameter_type,
+        _variantField_15 = simpleFormalParameter_keyword,
+        _variantField_18 = normalFormalParameter_requiredKeyword,
+        _variantField_19 = normalFormalParameter_covariantKeyword,
+        _variantField_27 = inheritsCovariant,
+        _variantField_12 = normalFormalParameter_identifier,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_14 = normalFormalParameter_comment,
+        _variantField_35 = topLevelTypeInferenceError;
+
+  LinkedNodeBuilder.variableDeclaration({
+    LinkedNodeTypeBuilder actualType,
+    LinkedNodeBuilder annotatedNode_comment,
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder variableDeclaration_initializer,
+    int variableDeclaration_equals,
+    LinkedNodeBuilder variableDeclaration_name,
+    bool inheritsCovariant,
+    int codeLength,
+    int codeOffset,
+    TopLevelInferenceErrorBuilder topLevelTypeInferenceError,
+    LinkedNodeVariablesDeclarationBuilder variableDeclaration_declaration,
+  })  : _kind = idl.LinkedNodeKind.variableDeclaration,
+        _variantField_24 = actualType,
+        _variantField_11 = annotatedNode_comment,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = variableDeclaration_initializer,
+        _variantField_15 = variableDeclaration_equals,
+        _variantField_7 = variableDeclaration_name,
+        _variantField_27 = inheritsCovariant,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_35 = topLevelTypeInferenceError,
+        _variantField_32 = variableDeclaration_declaration;
+
+  LinkedNodeBuilder.binaryExpression({
+    LinkedNodeTypeBuilder binaryExpression_invokeType,
+    LinkedNodeBuilder binaryExpression_leftOperand,
+    int binaryExpression_element,
+    LinkedNodeBuilder binaryExpression_rightOperand,
+    LinkedNodeTypeBuilder binaryExpression_elementType,
+    int binaryExpression_operator,
+    LinkedNodeTypeBuilder expression_type,
+  })  : _kind = idl.LinkedNodeKind.binaryExpression,
+        _variantField_24 = binaryExpression_invokeType,
+        _variantField_6 = binaryExpression_leftOperand,
+        _variantField_15 = binaryExpression_element,
+        _variantField_7 = binaryExpression_rightOperand,
+        _variantField_23 = binaryExpression_elementType,
+        _variantField_16 = binaryExpression_operator,
+        _variantField_25 = expression_type;
+
+  LinkedNodeBuilder.functionExpressionInvocation({
+    LinkedNodeTypeBuilder invocationExpression_invokeType,
+    LinkedNodeBuilder functionExpressionInvocation_function,
+    LinkedNodeBuilder invocationExpression_typeArguments,
+    LinkedNodeTypeBuilder expression_type,
+    LinkedNodeBuilder invocationExpression_arguments,
+  })  : _kind = idl.LinkedNodeKind.functionExpressionInvocation,
+        _variantField_24 = invocationExpression_invokeType,
+        _variantField_6 = functionExpressionInvocation_function,
+        _variantField_12 = invocationExpression_typeArguments,
+        _variantField_25 = expression_type,
+        _variantField_14 = invocationExpression_arguments;
+
+  LinkedNodeBuilder.methodInvocation({
+    LinkedNodeTypeBuilder invocationExpression_invokeType,
+    LinkedNodeBuilder methodInvocation_methodName,
+    int methodInvocation_operator,
+    LinkedNodeBuilder methodInvocation_target,
+    LinkedNodeBuilder invocationExpression_typeArguments,
+    LinkedNodeTypeBuilder expression_type,
+    LinkedNodeBuilder invocationExpression_arguments,
+  })  : _kind = idl.LinkedNodeKind.methodInvocation,
+        _variantField_24 = invocationExpression_invokeType,
+        _variantField_6 = methodInvocation_methodName,
+        _variantField_15 = methodInvocation_operator,
+        _variantField_7 = methodInvocation_target,
+        _variantField_12 = invocationExpression_typeArguments,
+        _variantField_25 = expression_type,
+        _variantField_14 = invocationExpression_arguments;
+
   LinkedNodeBuilder.adjacentStrings({
     List<LinkedNodeBuilder> adjacentStrings_strings,
     LinkedNodeTypeBuilder expression_type,
@@ -9616,17 +10458,30 @@
         _variantField_6 = cascadeExpression_target,
         _variantField_25 = expression_type;
 
+  LinkedNodeBuilder.comment({
+    List<LinkedNodeBuilder> comment_references,
+    List<int> comment_tokens,
+    idl.LinkedNodeCommentType comment_type,
+  })  : _kind = idl.LinkedNodeKind.comment,
+        _variantField_2 = comment_references,
+        _variantField_28 = comment_tokens,
+        _variantField_29 = comment_type;
+
   LinkedNodeBuilder.compilationUnit({
     List<LinkedNodeBuilder> compilationUnit_declarations,
     LinkedNodeBuilder compilationUnit_scriptTag,
     int compilationUnit_beginToken,
     int compilationUnit_endToken,
+    int codeLength,
+    int codeOffset,
     List<LinkedNodeBuilder> compilationUnit_directives,
   })  : _kind = idl.LinkedNodeKind.compilationUnit,
         _variantField_2 = compilationUnit_declarations,
         _variantField_6 = compilationUnit_scriptTag,
         _variantField_15 = compilationUnit_beginToken,
         _variantField_16 = compilationUnit_endToken,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
         _variantField_3 = compilationUnit_directives;
 
   LinkedNodeBuilder.constructorDeclaration({
@@ -9636,12 +10491,14 @@
     LinkedNodeBuilder constructorDeclaration_body,
     int constructorDeclaration_constKeyword,
     LinkedNodeBuilder constructorDeclaration_name,
+    int constructorDeclaration_factoryKeyword,
     LinkedNodeBuilder constructorDeclaration_parameters,
     int constructorDeclaration_externalKeyword,
-    int constructorDeclaration_factoryKeyword,
     int constructorDeclaration_period,
     int constructorDeclaration_separator,
     LinkedNodeBuilder constructorDeclaration_redirectedConstructor,
+    int codeLength,
+    int codeOffset,
     LinkedNodeBuilder constructorDeclaration_returnType,
   })  : _kind = idl.LinkedNodeKind.constructorDeclaration,
         _variantField_2 = constructorDeclaration_initializers,
@@ -9650,12 +10507,14 @@
         _variantField_6 = constructorDeclaration_body,
         _variantField_15 = constructorDeclaration_constKeyword,
         _variantField_7 = constructorDeclaration_name,
+        _variantField_17 = constructorDeclaration_factoryKeyword,
         _variantField_8 = constructorDeclaration_parameters,
         _variantField_16 = constructorDeclaration_externalKeyword,
-        _variantField_17 = constructorDeclaration_factoryKeyword,
         _variantField_18 = constructorDeclaration_period,
         _variantField_19 = constructorDeclaration_separator,
         _variantField_9 = constructorDeclaration_redirectedConstructor,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
         _variantField_10 = constructorDeclaration_returnType;
 
   LinkedNodeBuilder.dottedName({
@@ -9668,29 +10527,33 @@
     LinkedNodeBuilder annotatedNode_comment,
     List<LinkedNodeBuilder> annotatedNode_metadata,
     int enumDeclaration_enumKeyword,
-    int enumDeclaration_leftBracket,
     int enumDeclaration_rightBracket,
+    int enumDeclaration_leftBracket,
+    int codeLength,
+    int codeOffset,
     LinkedNodeBuilder namedCompilationUnitMember_name,
   })  : _kind = idl.LinkedNodeKind.enumDeclaration,
         _variantField_2 = enumDeclaration_constants,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
         _variantField_15 = enumDeclaration_enumKeyword,
-        _variantField_16 = enumDeclaration_leftBracket,
         _variantField_17 = enumDeclaration_rightBracket,
+        _variantField_16 = enumDeclaration_leftBracket,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
         _variantField_14 = namedCompilationUnitMember_name;
 
   LinkedNodeBuilder.formalParameterList({
     List<LinkedNodeBuilder> formalParameterList_parameters,
     int formalParameterList_leftDelimiter,
-    int formalParameterList_leftParenthesis,
     int formalParameterList_rightDelimiter,
+    int formalParameterList_leftParenthesis,
     int formalParameterList_rightParenthesis,
   })  : _kind = idl.LinkedNodeKind.formalParameterList,
         _variantField_2 = formalParameterList_parameters,
         _variantField_15 = formalParameterList_leftDelimiter,
-        _variantField_16 = formalParameterList_leftParenthesis,
         _variantField_17 = formalParameterList_rightDelimiter,
+        _variantField_16 = formalParameterList_leftParenthesis,
         _variantField_18 = formalParameterList_rightParenthesis;
 
   LinkedNodeBuilder.hideCombinator({
@@ -9739,22 +10602,22 @@
     LinkedNodeBuilder annotatedNode_comment,
     List<LinkedNodeBuilder> annotatedNode_metadata,
     int directive_keyword,
-    int namespaceDirective_semicolon,
     int uriBasedDirective_uriElement,
+    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,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
-        _variantField_17 = directive_keyword,
-        _variantField_18 = namespaceDirective_semicolon,
+        _variantField_18 = directive_keyword,
         _variantField_19 = uriBasedDirective_uriElement,
+        _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({
@@ -9765,11 +10628,11 @@
     int importDirective_asKeyword,
     int importDirective_deferredKeyword,
     int directive_keyword,
-    int namespaceDirective_semicolon,
     int uriBasedDirective_uriElement,
+    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,
@@ -9778,12 +10641,12 @@
         _variantField_6 = importDirective_prefix,
         _variantField_15 = importDirective_asKeyword,
         _variantField_16 = importDirective_deferredKeyword,
-        _variantField_17 = directive_keyword,
-        _variantField_18 = namespaceDirective_semicolon,
+        _variantField_18 = directive_keyword,
         _variantField_19 = uriBasedDirective_uriElement,
+        _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({
@@ -9830,16 +10693,16 @@
     List<LinkedNodeBuilder> switchStatement_members,
     int switchStatement_leftParenthesis,
     LinkedNodeBuilder switchStatement_expression,
-    int switchStatement_rightParenthesis,
     int switchStatement_switchKeyword,
+    int switchStatement_rightParenthesis,
     int switchStatement_leftBracket,
     int switchStatement_rightBracket,
   })  : _kind = idl.LinkedNodeKind.switchStatement,
         _variantField_2 = switchStatement_members,
         _variantField_15 = switchStatement_leftParenthesis,
         _variantField_7 = switchStatement_expression,
-        _variantField_16 = switchStatement_rightParenthesis,
         _variantField_17 = switchStatement_switchKeyword,
+        _variantField_16 = switchStatement_rightParenthesis,
         _variantField_18 = switchStatement_leftBracket,
         _variantField_19 = switchStatement_rightBracket;
 
@@ -9880,12 +10743,14 @@
     List<LinkedNodeBuilder> annotatedNode_metadata,
     LinkedNodeBuilder variableDeclarationList_type,
     int variableDeclarationList_keyword,
+    int variableDeclarationList_lateKeyword,
   })  : _kind = idl.LinkedNodeKind.variableDeclarationList,
         _variantField_2 = variableDeclarationList_variables,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = variableDeclarationList_type,
-        _variantField_15 = variableDeclarationList_keyword;
+        _variantField_15 = variableDeclarationList_keyword,
+        _variantField_16 = variableDeclarationList_lateKeyword;
 
   LinkedNodeBuilder.withClause({
     List<LinkedNodeBuilder> withClause_mixinTypes,
@@ -9900,6 +10765,7 @@
     LinkedNodeBuilder classDeclaration_extendsClause,
     int classDeclaration_abstractKeyword,
     LinkedNodeBuilder classDeclaration_withClause,
+    LinkedNodeBuilder classDeclaration_nativeClause,
     int classDeclaration_classKeyword,
     int classOrMixinDeclaration_rightBracket,
     int classOrMixinDeclaration_leftBracket,
@@ -9907,13 +10773,17 @@
     LinkedNodeBuilder classOrMixinDeclaration_implementsClause,
     List<LinkedNodeBuilder> classOrMixinDeclaration_members,
     LinkedNodeBuilder classOrMixinDeclaration_typeParameters,
+    int codeLength,
+    int codeOffset,
     LinkedNodeBuilder namedCompilationUnitMember_name,
+    bool simplyBoundable_isSimplyBounded,
   })  : _kind = idl.LinkedNodeKind.classDeclaration,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = classDeclaration_extendsClause,
         _variantField_15 = classDeclaration_abstractKeyword,
         _variantField_7 = classDeclaration_withClause,
+        _variantField_8 = classDeclaration_nativeClause,
         _variantField_16 = classDeclaration_classKeyword,
         _variantField_18 = classOrMixinDeclaration_rightBracket,
         _variantField_19 = classOrMixinDeclaration_leftBracket,
@@ -9921,7 +10791,10 @@
         _variantField_12 = classOrMixinDeclaration_implementsClause,
         _variantField_5 = classOrMixinDeclaration_members,
         _variantField_13 = classOrMixinDeclaration_typeParameters,
-        _variantField_14 = namedCompilationUnitMember_name;
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_14 = namedCompilationUnitMember_name,
+        _variantField_31 = simplyBoundable_isSimplyBounded;
 
   LinkedNodeBuilder.classTypeAlias({
     LinkedNodeBuilder annotatedNode_comment,
@@ -9934,7 +10807,10 @@
     int typeAlias_typedefKeyword,
     int typeAlias_semicolon,
     LinkedNodeBuilder classTypeAlias_implementsClause,
+    int codeLength,
+    int codeOffset,
     LinkedNodeBuilder namedCompilationUnitMember_name,
+    bool simplyBoundable_isSimplyBounded,
   })  : _kind = idl.LinkedNodeKind.classTypeAlias,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
@@ -9946,7 +10822,10 @@
         _variantField_18 = typeAlias_typedefKeyword,
         _variantField_19 = typeAlias_semicolon,
         _variantField_9 = classTypeAlias_implementsClause,
-        _variantField_14 = namedCompilationUnitMember_name;
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_14 = namedCompilationUnitMember_name,
+        _variantField_31 = simplyBoundable_isSimplyBounded;
 
   LinkedNodeBuilder.declaredIdentifier({
     LinkedNodeBuilder annotatedNode_comment,
@@ -9975,55 +10854,15 @@
     List<LinkedNodeBuilder> annotatedNode_metadata,
     LinkedNodeBuilder fieldDeclaration_fields,
     int fieldDeclaration_covariantKeyword,
-    int fieldDeclaration_semicolon,
     int fieldDeclaration_staticKeyword,
+    int fieldDeclaration_semicolon,
   })  : _kind = idl.LinkedNodeKind.fieldDeclaration,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = fieldDeclaration_fields,
         _variantField_15 = fieldDeclaration_covariantKeyword,
-        _variantField_16 = fieldDeclaration_semicolon,
-        _variantField_17 = fieldDeclaration_staticKeyword;
-
-  LinkedNodeBuilder.functionDeclaration({
-    LinkedNodeBuilder annotatedNode_comment,
-    List<LinkedNodeBuilder> annotatedNode_metadata,
-    LinkedNodeBuilder functionDeclaration_functionExpression,
-    int functionDeclaration_externalKeyword,
-    LinkedNodeBuilder functionDeclaration_returnType,
-    int functionDeclaration_propertyKeyword,
-    LinkedNodeTypeBuilder functionDeclaration_returnType2,
-    LinkedNodeBuilder namedCompilationUnitMember_name,
-  })  : _kind = idl.LinkedNodeKind.functionDeclaration,
-        _variantField_11 = annotatedNode_comment,
-        _variantField_4 = annotatedNode_metadata,
-        _variantField_6 = functionDeclaration_functionExpression,
-        _variantField_15 = functionDeclaration_externalKeyword,
-        _variantField_7 = functionDeclaration_returnType,
-        _variantField_16 = functionDeclaration_propertyKeyword,
-        _variantField_24 = functionDeclaration_returnType2,
-        _variantField_14 = namedCompilationUnitMember_name;
-
-  LinkedNodeBuilder.functionTypeAlias({
-    LinkedNodeBuilder annotatedNode_comment,
-    List<LinkedNodeBuilder> annotatedNode_metadata,
-    LinkedNodeBuilder functionTypeAlias_formalParameters,
-    LinkedNodeBuilder functionTypeAlias_returnType,
-    LinkedNodeBuilder functionTypeAlias_typeParameters,
-    int typeAlias_typedefKeyword,
-    int typeAlias_semicolon,
-    LinkedNodeTypeBuilder functionTypeAlias_returnType2,
-    LinkedNodeBuilder namedCompilationUnitMember_name,
-  })  : _kind = idl.LinkedNodeKind.functionTypeAlias,
-        _variantField_11 = annotatedNode_comment,
-        _variantField_4 = annotatedNode_metadata,
-        _variantField_6 = functionTypeAlias_formalParameters,
-        _variantField_7 = functionTypeAlias_returnType,
-        _variantField_8 = functionTypeAlias_typeParameters,
-        _variantField_18 = typeAlias_typedefKeyword,
-        _variantField_19 = typeAlias_semicolon,
-        _variantField_24 = functionTypeAlias_returnType2,
-        _variantField_14 = namedCompilationUnitMember_name;
+        _variantField_17 = fieldDeclaration_staticKeyword,
+        _variantField_16 = fieldDeclaration_semicolon;
 
   LinkedNodeBuilder.genericTypeAlias({
     LinkedNodeBuilder annotatedNode_comment,
@@ -10033,7 +10872,11 @@
     int genericTypeAlias_equals,
     int typeAlias_typedefKeyword,
     int typeAlias_semicolon,
+    bool typeAlias_hasSelfReference,
+    int codeLength,
+    int codeOffset,
     LinkedNodeBuilder namedCompilationUnitMember_name,
+    bool simplyBoundable_isSimplyBounded,
   })  : _kind = idl.LinkedNodeKind.genericTypeAlias,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
@@ -10042,49 +10885,24 @@
         _variantField_16 = genericTypeAlias_equals,
         _variantField_18 = typeAlias_typedefKeyword,
         _variantField_19 = typeAlias_semicolon,
-        _variantField_14 = namedCompilationUnitMember_name;
+        _variantField_27 = typeAlias_hasSelfReference,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_14 = namedCompilationUnitMember_name,
+        _variantField_31 = simplyBoundable_isSimplyBounded;
 
   LinkedNodeBuilder.libraryDirective({
     LinkedNodeBuilder annotatedNode_comment,
     List<LinkedNodeBuilder> annotatedNode_metadata,
     LinkedNodeBuilder libraryDirective_name,
     int directive_keyword,
-    int namespaceDirective_semicolon,
+    int directive_semicolon,
   })  : _kind = idl.LinkedNodeKind.libraryDirective,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = libraryDirective_name,
-        _variantField_17 = directive_keyword,
-        _variantField_18 = namespaceDirective_semicolon;
-
-  LinkedNodeBuilder.methodDeclaration({
-    LinkedNodeBuilder annotatedNode_comment,
-    List<LinkedNodeBuilder> annotatedNode_metadata,
-    LinkedNodeBuilder methodDeclaration_body,
-    int methodDeclaration_externalKeyword,
-    LinkedNodeBuilder methodDeclaration_formalParameters,
-    LinkedNodeBuilder methodDeclaration_returnType,
-    int methodDeclaration_modifierKeyword,
-    int methodDeclaration_operatorKeyword,
-    int methodDeclaration_propertyKeyword,
-    int methodDeclaration_actualProperty,
-    LinkedNodeTypeBuilder methodDeclaration_returnType2,
-    LinkedNodeBuilder methodDeclaration_typeParameters,
-    LinkedNodeBuilder methodDeclaration_name,
-  })  : _kind = idl.LinkedNodeKind.methodDeclaration,
-        _variantField_11 = annotatedNode_comment,
-        _variantField_4 = annotatedNode_metadata,
-        _variantField_6 = methodDeclaration_body,
-        _variantField_15 = methodDeclaration_externalKeyword,
-        _variantField_7 = methodDeclaration_formalParameters,
-        _variantField_8 = methodDeclaration_returnType,
-        _variantField_16 = methodDeclaration_modifierKeyword,
-        _variantField_17 = methodDeclaration_operatorKeyword,
-        _variantField_18 = methodDeclaration_propertyKeyword,
-        _variantField_19 = methodDeclaration_actualProperty,
-        _variantField_24 = methodDeclaration_returnType2,
-        _variantField_9 = methodDeclaration_typeParameters,
-        _variantField_10 = methodDeclaration_name;
+        _variantField_18 = directive_keyword,
+        _variantField_33 = directive_semicolon;
 
   LinkedNodeBuilder.mixinDeclaration({
     LinkedNodeBuilder annotatedNode_comment,
@@ -10096,7 +10914,11 @@
     LinkedNodeBuilder classOrMixinDeclaration_implementsClause,
     List<LinkedNodeBuilder> classOrMixinDeclaration_members,
     LinkedNodeBuilder classOrMixinDeclaration_typeParameters,
+    int codeLength,
+    int codeOffset,
     LinkedNodeBuilder namedCompilationUnitMember_name,
+    List<String> mixinDeclaration_superInvokedNames,
+    bool simplyBoundable_isSimplyBounded,
   })  : _kind = idl.LinkedNodeKind.mixinDeclaration,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
@@ -10107,45 +10929,45 @@
         _variantField_12 = classOrMixinDeclaration_implementsClause,
         _variantField_5 = classOrMixinDeclaration_members,
         _variantField_13 = classOrMixinDeclaration_typeParameters,
-        _variantField_14 = namedCompilationUnitMember_name;
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_14 = namedCompilationUnitMember_name,
+        _variantField_36 = mixinDeclaration_superInvokedNames,
+        _variantField_31 = simplyBoundable_isSimplyBounded;
 
   LinkedNodeBuilder.partDirective({
     LinkedNodeBuilder annotatedNode_comment,
     List<LinkedNodeBuilder> annotatedNode_metadata,
     int directive_keyword,
-    int namespaceDirective_semicolon,
     int uriBasedDirective_uriElement,
+    int directive_semicolon,
     LinkedNodeBuilder uriBasedDirective_uri,
-    String namespaceDirective_selectedUriContent,
     String uriBasedDirective_uriContent,
   })  : _kind = idl.LinkedNodeKind.partDirective,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
-        _variantField_17 = directive_keyword,
-        _variantField_18 = namespaceDirective_semicolon,
+        _variantField_18 = directive_keyword,
         _variantField_19 = uriBasedDirective_uriElement,
+        _variantField_33 = directive_semicolon,
         _variantField_14 = uriBasedDirective_uri,
-        _variantField_23 = namespaceDirective_selectedUriContent,
         _variantField_22 = uriBasedDirective_uriContent;
 
   LinkedNodeBuilder.partOfDirective({
     LinkedNodeBuilder annotatedNode_comment,
     List<LinkedNodeBuilder> annotatedNode_metadata,
     LinkedNodeBuilder partOfDirective_libraryName,
-    int partOfDirective_semicolon,
     LinkedNodeBuilder partOfDirective_uri,
     int partOfDirective_ofKeyword,
     int directive_keyword,
-    String namespaceDirective_selectedUriContent,
+    int directive_semicolon,
   })  : _kind = idl.LinkedNodeKind.partOfDirective,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = partOfDirective_libraryName,
-        _variantField_15 = partOfDirective_semicolon,
         _variantField_7 = partOfDirective_uri,
         _variantField_16 = partOfDirective_ofKeyword,
-        _variantField_17 = directive_keyword,
-        _variantField_23 = namespaceDirective_selectedUriContent;
+        _variantField_18 = directive_keyword,
+        _variantField_33 = directive_semicolon;
 
   LinkedNodeBuilder.topLevelVariableDeclaration({
     LinkedNodeBuilder annotatedNode_comment,
@@ -10164,100 +10986,18 @@
     LinkedNodeBuilder typeParameter_bound,
     int typeParameter_extendsKeyword,
     LinkedNodeBuilder typeParameter_name,
+    LinkedNodeTypeBuilder typeParameter_defaultType,
+    int codeLength,
+    int codeOffset,
   })  : _kind = idl.LinkedNodeKind.typeParameter,
         _variantField_11 = annotatedNode_comment,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = typeParameter_bound,
         _variantField_15 = typeParameter_extendsKeyword,
-        _variantField_7 = typeParameter_name;
-
-  LinkedNodeBuilder.variableDeclaration({
-    LinkedNodeBuilder annotatedNode_comment,
-    List<LinkedNodeBuilder> annotatedNode_metadata,
-    LinkedNodeBuilder variableDeclaration_initializer,
-    int variableDeclaration_equals,
-    LinkedNodeBuilder variableDeclaration_name,
-    LinkedNodeTypeBuilder variableDeclaration_type2,
-    LinkedNodeVariablesDeclarationBuilder variableDeclaration_declaration,
-  })  : _kind = idl.LinkedNodeKind.variableDeclaration,
-        _variantField_11 = annotatedNode_comment,
-        _variantField_4 = annotatedNode_metadata,
-        _variantField_6 = variableDeclaration_initializer,
-        _variantField_15 = variableDeclaration_equals,
-        _variantField_7 = variableDeclaration_name,
-        _variantField_24 = variableDeclaration_type2,
-        _variantField_32 = variableDeclaration_declaration;
-
-  LinkedNodeBuilder.fieldFormalParameter({
-    List<LinkedNodeBuilder> normalFormalParameter_metadata,
-    LinkedNodeBuilder fieldFormalParameter_type,
-    int fieldFormalParameter_keyword,
-    LinkedNodeBuilder fieldFormalParameter_typeParameters,
-    LinkedNodeBuilder fieldFormalParameter_formalParameters,
-    int fieldFormalParameter_period,
-    int fieldFormalParameter_thisKeyword,
-    int normalFormalParameter_covariantKeyword,
-    LinkedNodeTypeBuilder fieldFormalParameter_type2,
-    bool normalFormalParameter_isCovariant,
-    LinkedNodeBuilder normalFormalParameter_identifier,
-    idl.LinkedNodeFormalParameterKind formalParameter_kind,
-    LinkedNodeBuilder normalFormalParameter_comment,
-  })  : _kind = idl.LinkedNodeKind.fieldFormalParameter,
-        _variantField_4 = normalFormalParameter_metadata,
-        _variantField_6 = fieldFormalParameter_type,
-        _variantField_15 = fieldFormalParameter_keyword,
-        _variantField_7 = fieldFormalParameter_typeParameters,
-        _variantField_8 = fieldFormalParameter_formalParameters,
-        _variantField_16 = fieldFormalParameter_period,
-        _variantField_17 = fieldFormalParameter_thisKeyword,
-        _variantField_19 = normalFormalParameter_covariantKeyword,
-        _variantField_24 = fieldFormalParameter_type2,
-        _variantField_27 = normalFormalParameter_isCovariant,
-        _variantField_12 = normalFormalParameter_identifier,
-        _variantField_26 = formalParameter_kind,
-        _variantField_14 = normalFormalParameter_comment;
-
-  LinkedNodeBuilder.functionTypedFormalParameter({
-    List<LinkedNodeBuilder> normalFormalParameter_metadata,
-    LinkedNodeBuilder functionTypedFormalParameter_formalParameters,
-    LinkedNodeBuilder functionTypedFormalParameter_returnType,
-    LinkedNodeBuilder functionTypedFormalParameter_typeParameters,
-    int normalFormalParameter_covariantKeyword,
-    bool normalFormalParameter_isCovariant,
-    LinkedNodeBuilder normalFormalParameter_identifier,
-    idl.LinkedNodeFormalParameterKind formalParameter_kind,
-    LinkedNodeBuilder normalFormalParameter_comment,
-  })  : _kind = idl.LinkedNodeKind.functionTypedFormalParameter,
-        _variantField_4 = normalFormalParameter_metadata,
-        _variantField_6 = functionTypedFormalParameter_formalParameters,
-        _variantField_7 = functionTypedFormalParameter_returnType,
-        _variantField_8 = functionTypedFormalParameter_typeParameters,
-        _variantField_19 = normalFormalParameter_covariantKeyword,
-        _variantField_27 = normalFormalParameter_isCovariant,
-        _variantField_12 = normalFormalParameter_identifier,
-        _variantField_26 = formalParameter_kind,
-        _variantField_14 = normalFormalParameter_comment;
-
-  LinkedNodeBuilder.simpleFormalParameter({
-    List<LinkedNodeBuilder> normalFormalParameter_metadata,
-    LinkedNodeBuilder simpleFormalParameter_type,
-    int simpleFormalParameter_keyword,
-    int normalFormalParameter_covariantKeyword,
-    LinkedNodeTypeBuilder simpleFormalParameter_type2,
-    bool normalFormalParameter_isCovariant,
-    LinkedNodeBuilder normalFormalParameter_identifier,
-    idl.LinkedNodeFormalParameterKind formalParameter_kind,
-    LinkedNodeBuilder normalFormalParameter_comment,
-  })  : _kind = idl.LinkedNodeKind.simpleFormalParameter,
-        _variantField_4 = normalFormalParameter_metadata,
-        _variantField_6 = simpleFormalParameter_type,
-        _variantField_15 = simpleFormalParameter_keyword,
-        _variantField_19 = normalFormalParameter_covariantKeyword,
-        _variantField_24 = simpleFormalParameter_type2,
-        _variantField_27 = normalFormalParameter_isCovariant,
-        _variantField_12 = normalFormalParameter_identifier,
-        _variantField_26 = formalParameter_kind,
-        _variantField_14 = normalFormalParameter_comment;
+        _variantField_7 = typeParameter_name,
+        _variantField_23 = typeParameter_defaultType,
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset;
 
   LinkedNodeBuilder.switchCase({
     List<LinkedNodeBuilder> switchMember_statements,
@@ -10287,12 +11027,16 @@
     LinkedNodeBuilder annotation_arguments,
     int annotation_atSign,
     LinkedNodeBuilder annotation_constructorName,
+    int annotation_element,
+    LinkedNodeTypeBuilder annotation_elementType,
     LinkedNodeBuilder annotation_name,
     int annotation_period,
   })  : _kind = idl.LinkedNodeKind.annotation,
         _variantField_6 = annotation_arguments,
         _variantField_15 = annotation_atSign,
         _variantField_7 = annotation_constructorName,
+        _variantField_17 = annotation_element,
+        _variantField_23 = annotation_elementType,
         _variantField_8 = annotation_name,
         _variantField_16 = annotation_period;
 
@@ -10311,31 +11055,31 @@
     LinkedNodeBuilder assertInitializer_condition,
     int assertInitializer_assertKeyword,
     LinkedNodeBuilder assertInitializer_message,
-    int assertInitializer_comma,
     int assertInitializer_leftParenthesis,
+    int assertInitializer_comma,
     int assertInitializer_rightParenthesis,
   })  : _kind = idl.LinkedNodeKind.assertInitializer,
         _variantField_6 = assertInitializer_condition,
         _variantField_15 = assertInitializer_assertKeyword,
         _variantField_7 = assertInitializer_message,
-        _variantField_16 = assertInitializer_comma,
         _variantField_17 = assertInitializer_leftParenthesis,
+        _variantField_16 = assertInitializer_comma,
         _variantField_18 = assertInitializer_rightParenthesis;
 
   LinkedNodeBuilder.assertStatement({
     LinkedNodeBuilder assertStatement_condition,
     int assertStatement_assertKeyword,
     LinkedNodeBuilder assertStatement_message,
-    int assertStatement_comma,
     int assertStatement_leftParenthesis,
+    int assertStatement_comma,
     int assertStatement_rightParenthesis,
     int assertStatement_semicolon,
   })  : _kind = idl.LinkedNodeKind.assertStatement,
         _variantField_6 = assertStatement_condition,
         _variantField_15 = assertStatement_assertKeyword,
         _variantField_7 = assertStatement_message,
-        _variantField_16 = assertStatement_comma,
         _variantField_17 = assertStatement_leftParenthesis,
+        _variantField_16 = assertStatement_comma,
         _variantField_18 = assertStatement_rightParenthesis,
         _variantField_19 = assertStatement_semicolon;
 
@@ -10343,12 +11087,14 @@
     LinkedNodeBuilder assignmentExpression_leftHandSide,
     int assignmentExpression_element,
     LinkedNodeBuilder assignmentExpression_rightHandSide,
+    LinkedNodeTypeBuilder assignmentExpression_elementType,
     int assignmentExpression_operator,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.assignmentExpression,
         _variantField_6 = assignmentExpression_leftHandSide,
         _variantField_15 = assignmentExpression_element,
         _variantField_7 = assignmentExpression_rightHandSide,
+        _variantField_23 = assignmentExpression_elementType,
         _variantField_16 = assignmentExpression_operator,
         _variantField_25 = expression_type;
 
@@ -10361,21 +11107,6 @@
         _variantField_15 = awaitExpression_awaitKeyword,
         _variantField_25 = expression_type;
 
-  LinkedNodeBuilder.binaryExpression({
-    LinkedNodeBuilder binaryExpression_leftOperand,
-    int binaryExpression_element,
-    LinkedNodeBuilder binaryExpression_rightOperand,
-    int binaryExpression_operator,
-    LinkedNodeTypeBuilder binaryExpression_invokeType,
-    LinkedNodeTypeBuilder expression_type,
-  })  : _kind = idl.LinkedNodeKind.binaryExpression,
-        _variantField_6 = binaryExpression_leftOperand,
-        _variantField_15 = binaryExpression_element,
-        _variantField_7 = binaryExpression_rightOperand,
-        _variantField_16 = binaryExpression_operator,
-        _variantField_24 = binaryExpression_invokeType,
-        _variantField_25 = expression_type;
-
   LinkedNodeBuilder.blockFunctionBody({
     LinkedNodeBuilder blockFunctionBody_block,
     int blockFunctionBody_keyword,
@@ -10398,9 +11129,9 @@
     LinkedNodeBuilder catchClause_body,
     int catchClause_catchKeyword,
     LinkedNodeBuilder catchClause_exceptionParameter,
+    int catchClause_leftParenthesis,
     LinkedNodeBuilder catchClause_exceptionType,
     int catchClause_comma,
-    int catchClause_leftParenthesis,
     int catchClause_onKeyword,
     int catchClause_rightParenthesis,
     LinkedNodeBuilder catchClause_stackTraceParameter,
@@ -10408,13 +11139,20 @@
         _variantField_6 = catchClause_body,
         _variantField_15 = catchClause_catchKeyword,
         _variantField_7 = catchClause_exceptionParameter,
+        _variantField_17 = catchClause_leftParenthesis,
         _variantField_8 = catchClause_exceptionType,
         _variantField_16 = catchClause_comma,
-        _variantField_17 = catchClause_leftParenthesis,
         _variantField_18 = catchClause_onKeyword,
         _variantField_19 = catchClause_rightParenthesis,
         _variantField_9 = catchClause_stackTraceParameter;
 
+  LinkedNodeBuilder.commentReference({
+    LinkedNodeBuilder commentReference_identifier,
+    int commentReference_newKeyword,
+  })  : _kind = idl.LinkedNodeKind.commentReference,
+        _variantField_6 = commentReference_identifier,
+        _variantField_15 = commentReference_newKeyword;
+
   LinkedNodeBuilder.conditionalExpression({
     LinkedNodeBuilder conditionalExpression_condition,
     int conditionalExpression_colon,
@@ -10434,41 +11172,43 @@
     LinkedNodeBuilder configuration_name,
     int configuration_ifKeyword,
     LinkedNodeBuilder configuration_value,
+    int configuration_rightParenthesis,
     LinkedNodeBuilder configuration_uri,
     int configuration_leftParenthesis,
-    int configuration_rightParenthesis,
     int configuration_equalToken,
   })  : _kind = idl.LinkedNodeKind.configuration,
         _variantField_6 = configuration_name,
         _variantField_15 = configuration_ifKeyword,
         _variantField_7 = configuration_value,
+        _variantField_17 = configuration_rightParenthesis,
         _variantField_8 = configuration_uri,
         _variantField_16 = configuration_leftParenthesis,
-        _variantField_17 = configuration_rightParenthesis,
         _variantField_18 = configuration_equalToken;
 
   LinkedNodeBuilder.constructorFieldInitializer({
     LinkedNodeBuilder constructorFieldInitializer_expression,
     int constructorFieldInitializer_equals,
     LinkedNodeBuilder constructorFieldInitializer_fieldName,
-    int constructorFieldInitializer_period,
     int constructorFieldInitializer_thisKeyword,
+    int constructorFieldInitializer_period,
   })  : _kind = idl.LinkedNodeKind.constructorFieldInitializer,
         _variantField_6 = constructorFieldInitializer_expression,
         _variantField_15 = constructorFieldInitializer_equals,
         _variantField_7 = constructorFieldInitializer_fieldName,
-        _variantField_16 = constructorFieldInitializer_period,
-        _variantField_17 = constructorFieldInitializer_thisKeyword;
+        _variantField_17 = constructorFieldInitializer_thisKeyword,
+        _variantField_16 = constructorFieldInitializer_period;
 
   LinkedNodeBuilder.constructorName({
     LinkedNodeBuilder constructorName_name,
     int constructorName_element,
     LinkedNodeBuilder constructorName_type,
+    LinkedNodeTypeBuilder constructorName_elementType,
     int constructorName_period,
   })  : _kind = idl.LinkedNodeKind.constructorName,
         _variantField_6 = constructorName_name,
         _variantField_15 = constructorName_element,
         _variantField_7 = constructorName_type,
+        _variantField_23 = constructorName_elementType,
         _variantField_16 = constructorName_period;
 
   LinkedNodeBuilder.continueStatement({
@@ -10484,40 +11224,44 @@
     LinkedNodeBuilder defaultFormalParameter_defaultValue,
     int defaultFormalParameter_separator,
     LinkedNodeBuilder defaultFormalParameter_parameter,
-    bool defaultFormalParameter_isNamed,
+    int codeLength,
+    int codeOffset,
+    idl.LinkedNodeFormalParameterKind defaultFormalParameter_kind,
   })  : _kind = idl.LinkedNodeKind.defaultFormalParameter,
         _variantField_6 = defaultFormalParameter_defaultValue,
         _variantField_15 = defaultFormalParameter_separator,
         _variantField_7 = defaultFormalParameter_parameter,
-        _variantField_27 = defaultFormalParameter_isNamed;
+        _variantField_34 = codeLength,
+        _variantField_33 = codeOffset,
+        _variantField_26 = defaultFormalParameter_kind;
 
   LinkedNodeBuilder.doStatement({
     LinkedNodeBuilder doStatement_body,
     int doStatement_leftParenthesis,
     LinkedNodeBuilder doStatement_condition,
-    int doStatement_rightParenthesis,
     int doStatement_doKeyword,
+    int doStatement_rightParenthesis,
     int doStatement_semicolon,
     int doStatement_whileKeyword,
   })  : _kind = idl.LinkedNodeKind.doStatement,
         _variantField_6 = doStatement_body,
         _variantField_15 = doStatement_leftParenthesis,
         _variantField_7 = doStatement_condition,
-        _variantField_16 = doStatement_rightParenthesis,
         _variantField_17 = doStatement_doKeyword,
+        _variantField_16 = doStatement_rightParenthesis,
         _variantField_18 = doStatement_semicolon,
         _variantField_19 = doStatement_whileKeyword;
 
   LinkedNodeBuilder.expressionFunctionBody({
     LinkedNodeBuilder expressionFunctionBody_expression,
     int expressionFunctionBody_arrow,
-    int expressionFunctionBody_keyword,
     int expressionFunctionBody_semicolon,
+    int expressionFunctionBody_keyword,
   })  : _kind = idl.LinkedNodeKind.expressionFunctionBody,
         _variantField_6 = expressionFunctionBody_expression,
         _variantField_15 = expressionFunctionBody_arrow,
-        _variantField_16 = expressionFunctionBody_keyword,
-        _variantField_17 = expressionFunctionBody_semicolon;
+        _variantField_17 = expressionFunctionBody_semicolon,
+        _variantField_16 = expressionFunctionBody_keyword;
 
   LinkedNodeBuilder.expressionStatement({
     LinkedNodeBuilder expressionStatement_expression,
@@ -10555,30 +11299,30 @@
     LinkedNodeBuilder forMixin_forLoopParts,
     int forMixin_awaitKeyword,
     LinkedNodeBuilder forElement_body,
-    int forMixin_forKeyword,
     int forMixin_leftParenthesis,
+    int forMixin_forKeyword,
     int forMixin_rightParenthesis,
   })  : _kind = idl.LinkedNodeKind.forElement,
         _variantField_6 = forMixin_forLoopParts,
         _variantField_15 = forMixin_awaitKeyword,
         _variantField_7 = forElement_body,
-        _variantField_16 = forMixin_forKeyword,
         _variantField_17 = forMixin_leftParenthesis,
+        _variantField_16 = forMixin_forKeyword,
         _variantField_19 = forMixin_rightParenthesis;
 
   LinkedNodeBuilder.forStatement({
     LinkedNodeBuilder forMixin_forLoopParts,
     int forMixin_awaitKeyword,
     LinkedNodeBuilder forStatement_body,
-    int forMixin_forKeyword,
     int forMixin_leftParenthesis,
+    int forMixin_forKeyword,
     int forMixin_rightParenthesis,
   })  : _kind = idl.LinkedNodeKind.forStatement,
         _variantField_6 = forMixin_forLoopParts,
         _variantField_15 = forMixin_awaitKeyword,
         _variantField_7 = forStatement_body,
-        _variantField_16 = forMixin_forKeyword,
         _variantField_17 = forMixin_leftParenthesis,
+        _variantField_16 = forMixin_forKeyword,
         _variantField_19 = forMixin_rightParenthesis;
 
   LinkedNodeBuilder.forPartsWithDeclarations({
@@ -10612,57 +11356,20 @@
   })  : _kind = idl.LinkedNodeKind.functionDeclarationStatement,
         _variantField_6 = functionDeclarationStatement_functionDeclaration;
 
-  LinkedNodeBuilder.functionExpression({
-    LinkedNodeBuilder functionExpression_body,
-    LinkedNodeBuilder functionExpression_formalParameters,
-    LinkedNodeBuilder functionExpression_typeParameters,
-  })  : _kind = idl.LinkedNodeKind.functionExpression,
-        _variantField_6 = functionExpression_body,
-        _variantField_7 = functionExpression_formalParameters,
-        _variantField_8 = functionExpression_typeParameters;
-
-  LinkedNodeBuilder.functionExpressionInvocation({
-    LinkedNodeBuilder functionExpressionInvocation_function,
-    LinkedNodeTypeBuilder invocationExpression_invokeType,
-    LinkedNodeBuilder invocationExpression_typeArguments,
-    LinkedNodeTypeBuilder expression_type,
-    LinkedNodeBuilder invocationExpression_arguments,
-  })  : _kind = idl.LinkedNodeKind.functionExpressionInvocation,
-        _variantField_6 = functionExpressionInvocation_function,
-        _variantField_24 = invocationExpression_invokeType,
-        _variantField_12 = invocationExpression_typeArguments,
-        _variantField_25 = expression_type,
-        _variantField_14 = invocationExpression_arguments;
-
-  LinkedNodeBuilder.genericFunctionType({
-    LinkedNodeBuilder genericFunctionType_typeParameters,
-    int genericFunctionType_functionKeyword,
-    LinkedNodeBuilder genericFunctionType_returnType,
-    LinkedNodeBuilder genericFunctionType_formalParameters,
-    int genericFunctionType_question,
-    LinkedNodeTypeBuilder genericFunctionType_returnType2,
-  })  : _kind = idl.LinkedNodeKind.genericFunctionType,
-        _variantField_6 = genericFunctionType_typeParameters,
-        _variantField_15 = genericFunctionType_functionKeyword,
-        _variantField_7 = genericFunctionType_returnType,
-        _variantField_8 = genericFunctionType_formalParameters,
-        _variantField_16 = genericFunctionType_question,
-        _variantField_24 = genericFunctionType_returnType2;
-
   LinkedNodeBuilder.ifElement({
     LinkedNodeBuilder ifMixin_condition,
     int ifMixin_elseKeyword,
+    int ifMixin_leftParenthesis,
     LinkedNodeBuilder ifElement_thenElement,
     int ifMixin_ifKeyword,
-    int ifMixin_leftParenthesis,
     int ifMixin_rightParenthesis,
     LinkedNodeBuilder ifElement_elseElement,
   })  : _kind = idl.LinkedNodeKind.ifElement,
         _variantField_6 = ifMixin_condition,
         _variantField_15 = ifMixin_elseKeyword,
+        _variantField_17 = ifMixin_leftParenthesis,
         _variantField_8 = ifElement_thenElement,
         _variantField_16 = ifMixin_ifKeyword,
-        _variantField_17 = ifMixin_leftParenthesis,
         _variantField_18 = ifMixin_rightParenthesis,
         _variantField_9 = ifElement_elseElement;
 
@@ -10670,17 +11377,17 @@
     LinkedNodeBuilder ifMixin_condition,
     int ifMixin_elseKeyword,
     LinkedNodeBuilder ifStatement_elseStatement,
+    int ifMixin_leftParenthesis,
     LinkedNodeBuilder ifStatement_thenStatement,
     int ifMixin_ifKeyword,
-    int ifMixin_leftParenthesis,
     int ifMixin_rightParenthesis,
   })  : _kind = idl.LinkedNodeKind.ifStatement,
         _variantField_6 = ifMixin_condition,
         _variantField_15 = ifMixin_elseKeyword,
         _variantField_7 = ifStatement_elseStatement,
+        _variantField_17 = ifMixin_leftParenthesis,
         _variantField_8 = ifStatement_thenStatement,
         _variantField_16 = ifMixin_ifKeyword,
-        _variantField_17 = ifMixin_leftParenthesis,
         _variantField_18 = ifMixin_rightParenthesis;
 
   LinkedNodeBuilder.indexExpression({
@@ -10688,14 +11395,18 @@
     int indexExpression_element,
     LinkedNodeBuilder indexExpression_target,
     int indexExpression_leftBracket,
+    LinkedNodeTypeBuilder indexExpression_elementType,
+    int indexExpression_period,
     int indexExpression_rightBracket,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.indexExpression,
         _variantField_6 = indexExpression_index,
         _variantField_15 = indexExpression_element,
         _variantField_7 = indexExpression_target,
-        _variantField_16 = indexExpression_leftBracket,
-        _variantField_17 = indexExpression_rightBracket,
+        _variantField_17 = indexExpression_leftBracket,
+        _variantField_23 = indexExpression_elementType,
+        _variantField_16 = indexExpression_period,
+        _variantField_18 = indexExpression_rightBracket,
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.instanceCreationExpression({
@@ -10749,23 +11460,6 @@
         _variantField_15 = mapLiteralEntry_separator,
         _variantField_7 = mapLiteralEntry_value;
 
-  LinkedNodeBuilder.methodInvocation({
-    LinkedNodeBuilder methodInvocation_methodName,
-    int methodInvocation_operator,
-    LinkedNodeBuilder methodInvocation_target,
-    LinkedNodeTypeBuilder invocationExpression_invokeType,
-    LinkedNodeBuilder invocationExpression_typeArguments,
-    LinkedNodeTypeBuilder expression_type,
-    LinkedNodeBuilder invocationExpression_arguments,
-  })  : _kind = idl.LinkedNodeKind.methodInvocation,
-        _variantField_6 = methodInvocation_methodName,
-        _variantField_15 = methodInvocation_operator,
-        _variantField_7 = methodInvocation_target,
-        _variantField_24 = invocationExpression_invokeType,
-        _variantField_12 = invocationExpression_typeArguments,
-        _variantField_25 = expression_type,
-        _variantField_14 = invocationExpression_arguments;
-
   LinkedNodeBuilder.namedExpression({
     LinkedNodeBuilder namedExpression_expression,
     LinkedNodeBuilder namedExpression_name,
@@ -10775,6 +11469,22 @@
         _variantField_7 = namedExpression_name,
         _variantField_25 = expression_type;
 
+  LinkedNodeBuilder.nativeClause({
+    LinkedNodeBuilder nativeClause_name,
+    int nativeClause_nativeKeyword,
+  })  : _kind = idl.LinkedNodeKind.nativeClause,
+        _variantField_6 = nativeClause_name,
+        _variantField_15 = nativeClause_nativeKeyword;
+
+  LinkedNodeBuilder.nativeFunctionBody({
+    LinkedNodeBuilder nativeFunctionBody_stringLiteral,
+    int nativeFunctionBody_nativeKeyword,
+    int nativeFunctionBody_semicolon,
+  })  : _kind = idl.LinkedNodeKind.nativeFunctionBody,
+        _variantField_6 = nativeFunctionBody_stringLiteral,
+        _variantField_15 = nativeFunctionBody_nativeKeyword,
+        _variantField_16 = nativeFunctionBody_semicolon;
+
   LinkedNodeBuilder.parenthesizedExpression({
     LinkedNodeBuilder parenthesizedExpression_expression,
     int parenthesizedExpression_leftParenthesis,
@@ -10789,11 +11499,13 @@
   LinkedNodeBuilder.postfixExpression({
     LinkedNodeBuilder postfixExpression_operand,
     int postfixExpression_element,
+    LinkedNodeTypeBuilder postfixExpression_elementType,
     int postfixExpression_operator,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.postfixExpression,
         _variantField_6 = postfixExpression_operand,
         _variantField_15 = postfixExpression_element,
+        _variantField_23 = postfixExpression_elementType,
         _variantField_16 = postfixExpression_operator,
         _variantField_25 = expression_type;
 
@@ -10811,11 +11523,13 @@
   LinkedNodeBuilder.prefixExpression({
     LinkedNodeBuilder prefixExpression_operand,
     int prefixExpression_element,
+    LinkedNodeTypeBuilder prefixExpression_elementType,
     int prefixExpression_operator,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.prefixExpression,
         _variantField_6 = prefixExpression_operand,
         _variantField_15 = prefixExpression_element,
+        _variantField_23 = prefixExpression_elementType,
         _variantField_16 = prefixExpression_operator,
         _variantField_25 = expression_type;
 
@@ -10834,14 +11548,16 @@
     LinkedNodeBuilder redirectingConstructorInvocation_arguments,
     int redirectingConstructorInvocation_element,
     LinkedNodeBuilder redirectingConstructorInvocation_constructorName,
-    int redirectingConstructorInvocation_period,
     int redirectingConstructorInvocation_thisKeyword,
+    LinkedNodeTypeBuilder redirectingConstructorInvocation_elementType,
+    int redirectingConstructorInvocation_period,
   })  : _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,
+        _variantField_16 = redirectingConstructorInvocation_period;
 
   LinkedNodeBuilder.returnStatement({
     LinkedNodeBuilder returnStatement_expression,
@@ -10863,14 +11579,16 @@
     LinkedNodeBuilder superConstructorInvocation_arguments,
     int superConstructorInvocation_element,
     LinkedNodeBuilder superConstructorInvocation_constructorName,
-    int superConstructorInvocation_period,
     int superConstructorInvocation_superKeyword,
+    LinkedNodeTypeBuilder superConstructorInvocation_elementType,
+    int superConstructorInvocation_period,
   })  : _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,
+        _variantField_16 = superConstructorInvocation_period;
 
   LinkedNodeBuilder.throwExpression({
     LinkedNodeBuilder throwExpression_expression,
@@ -10890,7 +11608,7 @@
         _variantField_6 = typeName_name,
         _variantField_15 = typeName_question,
         _variantField_7 = typeName_typeArguments,
-        _variantField_24 = typeName_type;
+        _variantField_23 = typeName_type;
 
   LinkedNodeBuilder.variableDeclarationStatement({
     LinkedNodeBuilder variableDeclarationStatement_variables,
@@ -10903,25 +11621,25 @@
     LinkedNodeBuilder whileStatement_body,
     int whileStatement_leftParenthesis,
     LinkedNodeBuilder whileStatement_condition,
-    int whileStatement_rightParenthesis,
     int whileStatement_whileKeyword,
+    int whileStatement_rightParenthesis,
   })  : _kind = idl.LinkedNodeKind.whileStatement,
         _variantField_6 = whileStatement_body,
         _variantField_15 = whileStatement_leftParenthesis,
         _variantField_7 = whileStatement_condition,
-        _variantField_16 = whileStatement_rightParenthesis,
-        _variantField_17 = whileStatement_whileKeyword;
+        _variantField_17 = whileStatement_whileKeyword,
+        _variantField_16 = whileStatement_rightParenthesis;
 
   LinkedNodeBuilder.yieldStatement({
     LinkedNodeBuilder yieldStatement_expression,
     int yieldStatement_yieldKeyword,
-    int yieldStatement_star,
     int yieldStatement_semicolon,
+    int yieldStatement_star,
   })  : _kind = idl.LinkedNodeKind.yieldStatement,
         _variantField_6 = yieldStatement_expression,
         _variantField_15 = yieldStatement_yieldKeyword,
-        _variantField_16 = yieldStatement_star,
-        _variantField_17 = yieldStatement_semicolon;
+        _variantField_17 = yieldStatement_semicolon,
+        _variantField_16 = yieldStatement_star;
 
   LinkedNodeBuilder.booleanLiteral({
     int booleanLiteral_literal,
@@ -10988,11 +11706,15 @@
 
   LinkedNodeBuilder.simpleIdentifier({
     int simpleIdentifier_element,
+    LinkedNodeTypeBuilder simpleIdentifier_elementType,
     int simpleIdentifier_token,
+    bool simpleIdentifier_isDeclaration,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.simpleIdentifier,
         _variantField_15 = simpleIdentifier_element,
+        _variantField_23 = simpleIdentifier_elementType,
         _variantField_16 = simpleIdentifier_token,
+        _variantField_27 = simpleIdentifier_isDeclaration,
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.simpleStringLiteral({
@@ -11027,24 +11749,16 @@
         _variantField_15 = thisExpression_thisKeyword,
         _variantField_25 = expression_type;
 
-  LinkedNodeBuilder.comment({
-    List<int> comment_tokens,
-    idl.LinkedNodeCommentType comment_type,
-  })  : _kind = idl.LinkedNodeKind.comment,
-        _variantField_28 = comment_tokens,
-        _variantField_29 = comment_type;
-
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
+    _variantField_24?.flushInformative();
     _variantField_2?.forEach((b) => b.flushInformative());
     _variantField_11?.flushInformative();
     _variantField_4?.forEach((b) => b.flushInformative());
     _variantField_6?.flushInformative();
     _variantField_7?.flushInformative();
+    _variantField_23?.flushInformative();
     _variantField_8?.flushInformative();
-    _variantField_24?.flushInformative();
     _variantField_9?.flushInformative();
     _variantField_12?.flushInformative();
     _variantField_5?.forEach((b) => b.flushInformative());
@@ -11053,12 +11767,11 @@
     _variantField_10?.flushInformative();
     _variantField_25?.flushInformative();
     _variantField_14?.flushInformative();
+    _variantField_35?.flushInformative();
     _variantField_32?.flushInformative();
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addInt(this._kind == null ? 0 : this._kind.index);
     signature.addBool(this._isSynthetic == true);
@@ -11120,7 +11833,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);
@@ -11142,16 +11856,29 @@
     signature.addBool(this._variantField_31 == true);
     signature.addBool(this._variantField_32 != null);
     this._variantField_32?.collectApiSignature(signature);
+    signature.addInt(this._variantField_33 ?? 0);
+    signature.addInt(this._variantField_34 ?? 0);
+    signature.addBool(this._variantField_35 != null);
+    this._variantField_35?.collectApiSignature(signature);
+    if (this._variantField_36 == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._variantField_36.length);
+      for (var x in this._variantField_36) {
+        signature.addString(x);
+      }
+    }
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_variantField_24;
     fb.Offset offset_variantField_2;
     fb.Offset offset_variantField_11;
     fb.Offset offset_variantField_4;
     fb.Offset offset_variantField_6;
     fb.Offset offset_variantField_7;
+    fb.Offset offset_variantField_23;
     fb.Offset offset_variantField_8;
-    fb.Offset offset_variantField_24;
     fb.Offset offset_variantField_9;
     fb.Offset offset_variantField_12;
     fb.Offset offset_variantField_5;
@@ -11162,10 +11889,14 @@
     fb.Offset offset_variantField_25;
     fb.Offset offset_variantField_30;
     fb.Offset offset_variantField_14;
-    fb.Offset offset_variantField_23;
+    fb.Offset offset_variantField_36;
     fb.Offset offset_variantField_20;
+    fb.Offset offset_variantField_35;
     fb.Offset offset_variantField_22;
     fb.Offset offset_variantField_32;
+    if (_variantField_24 != null) {
+      offset_variantField_24 = _variantField_24.finish(fbBuilder);
+    }
     if (!(_variantField_2 == null || _variantField_2.isEmpty)) {
       offset_variantField_2 = fbBuilder
           .writeList(_variantField_2.map((b) => b.finish(fbBuilder)).toList());
@@ -11183,12 +11914,12 @@
     if (_variantField_7 != null) {
       offset_variantField_7 = _variantField_7.finish(fbBuilder);
     }
+    if (_variantField_23 != null) {
+      offset_variantField_23 = _variantField_23.finish(fbBuilder);
+    }
     if (_variantField_8 != null) {
       offset_variantField_8 = _variantField_8.finish(fbBuilder);
     }
-    if (_variantField_24 != null) {
-      offset_variantField_24 = _variantField_24.finish(fbBuilder);
-    }
     if (_variantField_9 != null) {
       offset_variantField_9 = _variantField_9.finish(fbBuilder);
     }
@@ -11221,12 +11952,16 @@
     if (_variantField_14 != null) {
       offset_variantField_14 = _variantField_14.finish(fbBuilder);
     }
-    if (_variantField_23 != null) {
-      offset_variantField_23 = fbBuilder.writeString(_variantField_23);
+    if (!(_variantField_36 == null || _variantField_36.isEmpty)) {
+      offset_variantField_36 = fbBuilder.writeList(
+          _variantField_36.map((b) => fbBuilder.writeString(b)).toList());
     }
     if (_variantField_20 != null) {
       offset_variantField_20 = fbBuilder.writeString(_variantField_20);
     }
+    if (_variantField_35 != null) {
+      offset_variantField_35 = _variantField_35.finish(fbBuilder);
+    }
     if (_variantField_22 != null) {
       offset_variantField_22 = fbBuilder.writeString(_variantField_22);
     }
@@ -11234,6 +11969,9 @@
       offset_variantField_32 = _variantField_32.finish(fbBuilder);
     }
     fbBuilder.startTable();
+    if (offset_variantField_24 != null) {
+      fbBuilder.addOffset(24, offset_variantField_24);
+    }
     if (offset_variantField_2 != null) {
       fbBuilder.addOffset(2, offset_variantField_2);
     }
@@ -11252,24 +11990,24 @@
     if (offset_variantField_7 != null) {
       fbBuilder.addOffset(7, offset_variantField_7);
     }
+    if (_variantField_17 != null && _variantField_17 != 0) {
+      fbBuilder.addUint32(17, _variantField_17);
+    }
+    if (offset_variantField_23 != null) {
+      fbBuilder.addOffset(23, offset_variantField_23);
+    }
     if (offset_variantField_8 != null) {
       fbBuilder.addOffset(8, offset_variantField_8);
     }
     if (_variantField_16 != null && _variantField_16 != 0) {
       fbBuilder.addUint32(16, _variantField_16);
     }
-    if (_variantField_17 != null && _variantField_17 != 0) {
-      fbBuilder.addUint32(17, _variantField_17);
-    }
     if (_variantField_18 != null && _variantField_18 != 0) {
       fbBuilder.addUint32(18, _variantField_18);
     }
     if (_variantField_19 != null && _variantField_19 != 0) {
       fbBuilder.addUint32(19, _variantField_19);
     }
-    if (offset_variantField_24 != null) {
-      fbBuilder.addOffset(24, offset_variantField_24);
-    }
     if (_variantField_27 == true) {
       fbBuilder.addBool(27, true);
     }
@@ -11285,6 +12023,12 @@
     if (offset_variantField_13 != null) {
       fbBuilder.addOffset(13, offset_variantField_13);
     }
+    if (_variantField_34 != null && _variantField_34 != 0) {
+      fbBuilder.addUint32(34, _variantField_34);
+    }
+    if (_variantField_33 != null && _variantField_33 != 0) {
+      fbBuilder.addUint32(33, _variantField_33);
+    }
     if (offset_variantField_28 != null) {
       fbBuilder.addOffset(28, offset_variantField_28);
     }
@@ -11298,16 +12042,17 @@
     if (offset_variantField_10 != null) {
       fbBuilder.addOffset(10, offset_variantField_10);
     }
+    if (_variantField_26 != null &&
+        _variantField_26 !=
+            idl.LinkedNodeFormalParameterKind.requiredPositional) {
+      fbBuilder.addUint8(26, _variantField_26.index);
+    }
     if (_variantField_21 != null && _variantField_21 != 0.0) {
       fbBuilder.addFloat64(21, _variantField_21);
     }
     if (offset_variantField_25 != null) {
       fbBuilder.addOffset(25, offset_variantField_25);
     }
-    if (_variantField_26 != null &&
-        _variantField_26 != idl.LinkedNodeFormalParameterKind.required) {
-      fbBuilder.addUint8(26, _variantField_26.index);
-    }
     if (offset_variantField_30 != null) {
       fbBuilder.addOffset(30, offset_variantField_30);
     }
@@ -11320,14 +12065,17 @@
     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_36 != null) {
+      fbBuilder.addOffset(36, offset_variantField_36);
+    }
+    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_35 != null) {
+      fbBuilder.addOffset(35, offset_variantField_35);
     }
     if (offset_variantField_22 != null) {
       fbBuilder.addOffset(22, offset_variantField_22);
@@ -11355,41 +12103,85 @@
 
   _LinkedNodeImpl(this._bc, this._bcOffset);
 
+  idl.LinkedNodeType _variantField_24;
   List<idl.LinkedNode> _variantField_2;
   idl.LinkedNode _variantField_11;
   List<idl.LinkedNode> _variantField_4;
   idl.LinkedNode _variantField_6;
   int _variantField_15;
   idl.LinkedNode _variantField_7;
+  int _variantField_17;
+  idl.LinkedNodeType _variantField_23;
   idl.LinkedNode _variantField_8;
   int _variantField_16;
-  int _variantField_17;
   int _variantField_18;
   int _variantField_19;
-  idl.LinkedNodeType _variantField_24;
   bool _variantField_27;
   idl.LinkedNode _variantField_9;
   idl.LinkedNode _variantField_12;
   List<idl.LinkedNode> _variantField_5;
   idl.LinkedNode _variantField_13;
+  int _variantField_34;
+  int _variantField_33;
   List<int> _variantField_28;
   idl.LinkedNodeCommentType _variantField_29;
   List<idl.LinkedNode> _variantField_3;
   idl.LinkedNode _variantField_10;
+  idl.LinkedNodeFormalParameterKind _variantField_26;
   double _variantField_21;
   idl.LinkedNodeType _variantField_25;
-  idl.LinkedNodeFormalParameterKind _variantField_26;
   String _variantField_30;
   idl.LinkedNode _variantField_14;
   bool _isSynthetic;
   idl.LinkedNodeKind _kind;
-  String _variantField_23;
-  bool _variantField_31;
+  List<String> _variantField_36;
   String _variantField_20;
+  bool _variantField_31;
+  idl.TopLevelInferenceError _variantField_35;
   String _variantField_22;
   idl.LinkedNodeVariablesDeclaration _variantField_32;
 
   @override
+  idl.LinkedNodeType get actualReturnType {
+    assert(kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionExpression ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericFunctionType ||
+        kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_24 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
+    return _variantField_24;
+  }
+
+  @override
+  idl.LinkedNodeType get actualType {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    _variantField_24 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
+    return _variantField_24;
+  }
+
+  @override
+  idl.LinkedNodeType get binaryExpression_invokeType {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_24 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
+    return _variantField_24;
+  }
+
+  @override
+  idl.LinkedNodeType get invocationExpression_invokeType {
+    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
+        kind == idl.LinkedNodeKind.methodInvocation);
+    _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 ??=
@@ -11426,6 +12218,15 @@
   }
 
   @override
+  List<idl.LinkedNode> get comment_references {
+    assert(kind == idl.LinkedNodeKind.comment);
+    _variantField_2 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 2, const <idl.LinkedNode>[]);
+    return _variantField_2;
+  }
+
+  @override
   List<idl.LinkedNode> get compilationUnit_declarations {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     _variantField_2 ??=
@@ -11798,6 +12599,14 @@
   }
 
   @override
+  idl.LinkedNode get commentReference_identifier {
+    assert(kind == idl.LinkedNodeKind.commentReference);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
   idl.LinkedNode get compilationUnit_scriptTag {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     _variantField_6 ??=
@@ -12130,6 +12939,22 @@
   }
 
   @override
+  idl.LinkedNode get nativeClause_name {
+    assert(kind == idl.LinkedNodeKind.nativeClause);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
+  idl.LinkedNode get nativeFunctionBody_stringLiteral {
+    assert(kind == idl.LinkedNodeKind.nativeFunctionBody);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
   idl.LinkedNode get parenthesizedExpression_expression {
     assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
     _variantField_6 ??=
@@ -12426,6 +13251,14 @@
   }
 
   @override
+  int get commentReference_newKeyword {
+    assert(kind == idl.LinkedNodeKind.commentReference);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
   int get compilationUnit_beginToken {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     _variantField_15 ??=
@@ -12750,6 +13583,22 @@
   }
 
   @override
+  int get nativeClause_nativeKeyword {
+    assert(kind == idl.LinkedNodeKind.nativeClause);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
+  int get nativeFunctionBody_nativeKeyword {
+    assert(kind == idl.LinkedNodeKind.nativeFunctionBody);
+    _variantField_15 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
+    return _variantField_15;
+  }
+
+  @override
   int get nullLiteral_literal {
     assert(kind == idl.LinkedNodeKind.nullLiteral);
     _variantField_15 ??=
@@ -12774,14 +13623,6 @@
   }
 
   @override
-  int get partOfDirective_semicolon {
-    assert(kind == idl.LinkedNodeKind.partOfDirective);
-    _variantField_15 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
-    return _variantField_15;
-  }
-
-  @override
   int get postfixExpression_element {
     assert(kind == idl.LinkedNodeKind.postfixExpression);
     _variantField_15 ??=
@@ -13431,6 +14272,288 @@
   }
 
   @override
+  int get annotation_element {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get assertInitializer_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertInitializer);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get assertStatement_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.assertStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get catchClause_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.catchClause);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get configuration_rightParenthesis {
+    assert(kind == idl.LinkedNodeKind.configuration);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get constructorDeclaration_factoryKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get constructorFieldInitializer_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get doStatement_doKeyword {
+    assert(kind == idl.LinkedNodeKind.doStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get enumDeclaration_rightBracket {
+    assert(kind == idl.LinkedNodeKind.enumDeclaration);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get expressionFunctionBody_semicolon {
+    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get fieldDeclaration_staticKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get fieldFormalParameter_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get formalParameterList_rightDelimiter {
+    assert(kind == idl.LinkedNodeKind.formalParameterList);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get forMixin_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.forElement ||
+        kind == idl.LinkedNodeKind.forStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get genericFunctionType_id {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get ifMixin_leftParenthesis {
+    assert(kind == idl.LinkedNodeKind.ifElement ||
+        kind == idl.LinkedNodeKind.ifStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get indexExpression_leftBracket {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get methodDeclaration_operatorKeyword {
+    assert(kind == idl.LinkedNodeKind.methodDeclaration);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get redirectingConstructorInvocation_thisKeyword {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get superConstructorInvocation_superKeyword {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get switchStatement_switchKeyword {
+    assert(kind == idl.LinkedNodeKind.switchStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get whileStatement_whileKeyword {
+    assert(kind == idl.LinkedNodeKind.whileStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  int get yieldStatement_semicolon {
+    assert(kind == idl.LinkedNodeKind.yieldStatement);
+    _variantField_17 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
+    return _variantField_17;
+  }
+
+  @override
+  idl.LinkedNodeType get annotation_elementType {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @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
+  idl.LinkedNodeType get typeParameter_defaultType {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
   idl.LinkedNode get annotation_name {
     assert(kind == idl.LinkedNodeKind.annotation);
     _variantField_8 ??=
@@ -13447,6 +14570,14 @@
   }
 
   @override
+  idl.LinkedNode get classDeclaration_nativeClause {
+    assert(kind == idl.LinkedNodeKind.classDeclaration);
+    _variantField_8 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 8, null);
+    return _variantField_8;
+  }
+
+  @override
   idl.LinkedNode get classTypeAlias_withClause {
     assert(kind == idl.LinkedNodeKind.classTypeAlias);
     _variantField_8 ??=
@@ -13810,7 +14941,7 @@
   }
 
   @override
-  int get indexExpression_leftBracket {
+  int get indexExpression_period {
     assert(kind == idl.LinkedNodeKind.indexExpression);
     _variantField_16 ??=
         const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
@@ -13858,6 +14989,14 @@
   }
 
   @override
+  int get nativeFunctionBody_semicolon {
+    assert(kind == idl.LinkedNodeKind.nativeFunctionBody);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
   int get parenthesizedExpression_rightParenthesis {
     assert(kind == idl.LinkedNodeKind.parenthesizedExpression);
     _variantField_16 ??=
@@ -13971,6 +15110,14 @@
   }
 
   @override
+  int get variableDeclarationList_lateKeyword {
+    assert(kind == idl.LinkedNodeKind.variableDeclarationList);
+    _variantField_16 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 16, 0);
+    return _variantField_16;
+  }
+
+  @override
   int get whileStatement_rightParenthesis {
     assert(kind == idl.LinkedNodeKind.whileStatement);
     _variantField_16 ??=
@@ -13987,188 +15134,6 @@
   }
 
   @override
-  int get assertInitializer_leftParenthesis {
-    assert(kind == idl.LinkedNodeKind.assertInitializer);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get assertStatement_leftParenthesis {
-    assert(kind == idl.LinkedNodeKind.assertStatement);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get catchClause_leftParenthesis {
-    assert(kind == idl.LinkedNodeKind.catchClause);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get configuration_rightParenthesis {
-    assert(kind == idl.LinkedNodeKind.configuration);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get constructorDeclaration_factoryKeyword {
-    assert(kind == idl.LinkedNodeKind.constructorDeclaration);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get constructorFieldInitializer_thisKeyword {
-    assert(kind == idl.LinkedNodeKind.constructorFieldInitializer);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get directive_keyword {
-    assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective ||
-        kind == idl.LinkedNodeKind.libraryDirective ||
-        kind == idl.LinkedNodeKind.partDirective ||
-        kind == idl.LinkedNodeKind.partOfDirective);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get doStatement_doKeyword {
-    assert(kind == idl.LinkedNodeKind.doStatement);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get enumDeclaration_rightBracket {
-    assert(kind == idl.LinkedNodeKind.enumDeclaration);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get expressionFunctionBody_semicolon {
-    assert(kind == idl.LinkedNodeKind.expressionFunctionBody);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get fieldDeclaration_staticKeyword {
-    assert(kind == idl.LinkedNodeKind.fieldDeclaration);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get fieldFormalParameter_thisKeyword {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get formalParameterList_rightDelimiter {
-    assert(kind == idl.LinkedNodeKind.formalParameterList);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get forMixin_leftParenthesis {
-    assert(kind == idl.LinkedNodeKind.forElement ||
-        kind == idl.LinkedNodeKind.forStatement);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get ifMixin_leftParenthesis {
-    assert(kind == idl.LinkedNodeKind.ifElement ||
-        kind == idl.LinkedNodeKind.ifStatement);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get indexExpression_rightBracket {
-    assert(kind == idl.LinkedNodeKind.indexExpression);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get methodDeclaration_operatorKeyword {
-    assert(kind == idl.LinkedNodeKind.methodDeclaration);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get redirectingConstructorInvocation_thisKeyword {
-    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get superConstructorInvocation_superKeyword {
-    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get switchStatement_switchKeyword {
-    assert(kind == idl.LinkedNodeKind.switchStatement);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get whileStatement_whileKeyword {
-    assert(kind == idl.LinkedNodeKind.whileStatement);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
-  int get yieldStatement_semicolon {
-    assert(kind == idl.LinkedNodeKind.yieldStatement);
-    _variantField_17 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 17, 0);
-    return _variantField_17;
-  }
-
-  @override
   int get assertInitializer_rightParenthesis {
     assert(kind == idl.LinkedNodeKind.assertInitializer);
     _variantField_18 ??=
@@ -14218,6 +15183,18 @@
   }
 
   @override
+  int get directive_keyword {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
   int get doStatement_semicolon {
     assert(kind == idl.LinkedNodeKind.doStatement);
     _variantField_18 ??=
@@ -14243,6 +15220,14 @@
   }
 
   @override
+  int get indexExpression_rightBracket {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_18 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
+    return _variantField_18;
+  }
+
+  @override
   int get methodDeclaration_propertyKeyword {
     assert(kind == idl.LinkedNodeKind.methodDeclaration);
     _variantField_18 ??=
@@ -14251,11 +15236,10 @@
   }
 
   @override
-  int get namespaceDirective_semicolon {
-    assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective ||
-        kind == idl.LinkedNodeKind.libraryDirective ||
-        kind == idl.LinkedNodeKind.partDirective);
+  int get normalFormalParameter_requiredKeyword {
+    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter);
     _variantField_18 ??=
         const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
     return _variantField_18;
@@ -14394,87 +15378,6 @@
   }
 
   @override
-  idl.LinkedNodeType get binaryExpression_invokeType {
-    assert(kind == idl.LinkedNodeKind.binaryExpression);
-    _variantField_24 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
-    return _variantField_24;
-  }
-
-  @override
-  idl.LinkedNodeType get fieldFormalParameter_type2 {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
-    _variantField_24 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
-    return _variantField_24;
-  }
-
-  @override
-  idl.LinkedNodeType get functionDeclaration_returnType2 {
-    assert(kind == idl.LinkedNodeKind.functionDeclaration);
-    _variantField_24 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
-    return _variantField_24;
-  }
-
-  @override
-  idl.LinkedNodeType get functionTypeAlias_returnType2 {
-    assert(kind == idl.LinkedNodeKind.functionTypeAlias);
-    _variantField_24 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
-    return _variantField_24;
-  }
-
-  @override
-  idl.LinkedNodeType get genericFunctionType_returnType2 {
-    assert(kind == idl.LinkedNodeKind.genericFunctionType);
-    _variantField_24 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
-    return _variantField_24;
-  }
-
-  @override
-  idl.LinkedNodeType get invocationExpression_invokeType {
-    assert(kind == idl.LinkedNodeKind.functionExpressionInvocation ||
-        kind == idl.LinkedNodeKind.methodInvocation);
-    _variantField_24 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
-    return _variantField_24;
-  }
-
-  @override
-  idl.LinkedNodeType get methodDeclaration_returnType2 {
-    assert(kind == idl.LinkedNodeKind.methodDeclaration);
-    _variantField_24 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
-    return _variantField_24;
-  }
-
-  @override
-  idl.LinkedNodeType get simpleFormalParameter_type2 {
-    assert(kind == idl.LinkedNodeKind.simpleFormalParameter);
-    _variantField_24 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
-    return _variantField_24;
-  }
-
-  @override
-  idl.LinkedNodeType get typeName_type {
-    assert(kind == idl.LinkedNodeKind.typeName);
-    _variantField_24 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
-    return _variantField_24;
-  }
-
-  @override
-  idl.LinkedNodeType get variableDeclaration_type2 {
-    assert(kind == idl.LinkedNodeKind.variableDeclaration);
-    _variantField_24 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 24, null);
-    return _variantField_24;
-  }
-
-  @override
   bool get booleanLiteral_value {
     assert(kind == idl.LinkedNodeKind.booleanLiteral);
     _variantField_27 ??=
@@ -14491,18 +15394,11 @@
   }
 
   @override
-  bool get defaultFormalParameter_isNamed {
-    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
-    _variantField_27 ??=
-        const fb.BoolReader().vTableGet(_bc, _bcOffset, 27, false);
-    return _variantField_27;
-  }
-
-  @override
-  bool get normalFormalParameter_isCovariant {
+  bool get inheritsCovariant {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
-        kind == idl.LinkedNodeKind.simpleFormalParameter);
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
     _variantField_27 ??=
         const fb.BoolReader().vTableGet(_bc, _bcOffset, 27, false);
     return _variantField_27;
@@ -14517,6 +15413,23 @@
   }
 
   @override
+  bool get simpleIdentifier_isDeclaration {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    _variantField_27 ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 27, false);
+    return _variantField_27;
+  }
+
+  @override
+  bool get typeAlias_hasSelfReference {
+    assert(kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias);
+    _variantField_27 ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 27, false);
+    return _variantField_27;
+  }
+
+  @override
   idl.LinkedNode get catchClause_stackTraceParameter {
     assert(kind == idl.LinkedNodeKind.catchClause);
     _variantField_9 ??=
@@ -14614,6 +15527,64 @@
   }
 
   @override
+  int get codeLength {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.compilationUnit ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.defaultFormalParameter ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    _variantField_34 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 34, 0);
+    return _variantField_34;
+  }
+
+  @override
+  int get codeOffset {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.compilationUnit ||
+        kind == idl.LinkedNodeKind.constructorDeclaration ||
+        kind == idl.LinkedNodeKind.defaultFormalParameter ||
+        kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.fieldFormalParameter ||
+        kind == idl.LinkedNodeKind.functionDeclaration ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.methodDeclaration ||
+        kind == idl.LinkedNodeKind.mixinDeclaration ||
+        kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.typeParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    _variantField_33 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 33, 0);
+    return _variantField_33;
+  }
+
+  @override
+  int get directive_semicolon {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective ||
+        kind == idl.LinkedNodeKind.libraryDirective ||
+        kind == idl.LinkedNodeKind.partDirective ||
+        kind == idl.LinkedNodeKind.partOfDirective);
+    _variantField_33 ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 33, 0);
+    return _variantField_33;
+  }
+
+  @override
   List<int> get comment_tokens {
     assert(kind == idl.LinkedNodeKind.comment);
     _variantField_28 ??= const fb.Uint32ListReader()
@@ -14683,6 +15654,17 @@
   }
 
   @override
+  idl.LinkedNodeFormalParameterKind get defaultFormalParameter_kind {
+    assert(kind == idl.LinkedNodeKind.defaultFormalParameter);
+    _variantField_26 ??= const _LinkedNodeFormalParameterKindReader().vTableGet(
+        _bc,
+        _bcOffset,
+        26,
+        idl.LinkedNodeFormalParameterKind.requiredPositional);
+    return _variantField_26;
+  }
+
+  @override
   double get doubleLiteral_value {
     assert(kind == idl.LinkedNodeKind.doubleLiteral);
     _variantField_21 ??=
@@ -14730,13 +15712,11 @@
   }
 
   @override
-  idl.LinkedNodeFormalParameterKind get formalParameter_kind {
-    assert(kind == idl.LinkedNodeKind.fieldFormalParameter ||
-        kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
-        kind == idl.LinkedNodeKind.simpleFormalParameter);
-    _variantField_26 ??= const _LinkedNodeFormalParameterKindReader().vTableGet(
-        _bc, _bcOffset, 26, idl.LinkedNodeFormalParameterKind.required);
-    return _variantField_26;
+  idl.LinkedNodeType get genericFunctionType_type {
+    assert(kind == idl.LinkedNodeKind.genericFunctionType);
+    _variantField_25 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 25, null);
+    return _variantField_25;
   }
 
   @override
@@ -14813,14 +15793,28 @@
   }
 
   @override
-  String get namespaceDirective_selectedUriContent {
+  List<String> get mixinDeclaration_superInvokedNames {
+    assert(kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_36 ??= const fb.ListReader<String>(const fb.StringReader())
+        .vTableGet(_bc, _bcOffset, 36, const <String>[]);
+    return _variantField_36;
+  }
+
+  @override
+  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
@@ -14832,11 +15826,24 @@
   }
 
   @override
-  String get simpleStringLiteral_value {
-    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
-    _variantField_20 ??=
-        const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
-    return _variantField_20;
+  bool get simplyBoundable_isSimplyBounded {
+    assert(kind == idl.LinkedNodeKind.classDeclaration ||
+        kind == idl.LinkedNodeKind.classTypeAlias ||
+        kind == idl.LinkedNodeKind.functionTypeAlias ||
+        kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.mixinDeclaration);
+    _variantField_31 ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 31, false);
+    return _variantField_31;
+  }
+
+  @override
+  idl.TopLevelInferenceError get topLevelTypeInferenceError {
+    assert(kind == idl.LinkedNodeKind.simpleFormalParameter ||
+        kind == idl.LinkedNodeKind.variableDeclaration);
+    _variantField_35 ??= const _TopLevelInferenceErrorReader()
+        .vTableGet(_bc, _bcOffset, 35, null);
+    return _variantField_35;
   }
 
   @override
@@ -14865,6 +15872,324 @@
     if (isSynthetic != false) _result["isSynthetic"] = isSynthetic;
     if (kind != idl.LinkedNodeKind.adjacentStrings)
       _result["kind"] = kind.toString().split('.')[1];
+    if (kind == idl.LinkedNodeKind.functionDeclaration) {
+      if (actualReturnType != null)
+        _result["actualReturnType"] = actualReturnType.toJson();
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (functionDeclaration_functionExpression != null)
+        _result["functionDeclaration_functionExpression"] =
+            functionDeclaration_functionExpression.toJson();
+      if (functionDeclaration_externalKeyword != 0)
+        _result["functionDeclaration_externalKeyword"] =
+            functionDeclaration_externalKeyword;
+      if (functionDeclaration_returnType != null)
+        _result["functionDeclaration_returnType"] =
+            functionDeclaration_returnType.toJson();
+      if (functionDeclaration_propertyKeyword != 0)
+        _result["functionDeclaration_propertyKeyword"] =
+            functionDeclaration_propertyKeyword;
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
+      if (namedCompilationUnitMember_name != null)
+        _result["namedCompilationUnitMember_name"] =
+            namedCompilationUnitMember_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.functionExpression) {
+      if (actualReturnType != null)
+        _result["actualReturnType"] = actualReturnType.toJson();
+      if (functionExpression_body != null)
+        _result["functionExpression_body"] = functionExpression_body.toJson();
+      if (functionExpression_formalParameters != null)
+        _result["functionExpression_formalParameters"] =
+            functionExpression_formalParameters.toJson();
+      if (functionExpression_typeParameters != null)
+        _result["functionExpression_typeParameters"] =
+            functionExpression_typeParameters.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.functionTypeAlias) {
+      if (actualReturnType != null)
+        _result["actualReturnType"] = actualReturnType.toJson();
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (functionTypeAlias_formalParameters != null)
+        _result["functionTypeAlias_formalParameters"] =
+            functionTypeAlias_formalParameters.toJson();
+      if (functionTypeAlias_returnType != null)
+        _result["functionTypeAlias_returnType"] =
+            functionTypeAlias_returnType.toJson();
+      if (functionTypeAlias_typeParameters != null)
+        _result["functionTypeAlias_typeParameters"] =
+            functionTypeAlias_typeParameters.toJson();
+      if (typeAlias_typedefKeyword != 0)
+        _result["typeAlias_typedefKeyword"] = typeAlias_typedefKeyword;
+      if (typeAlias_semicolon != 0)
+        _result["typeAlias_semicolon"] = typeAlias_semicolon;
+      if (typeAlias_hasSelfReference != false)
+        _result["typeAlias_hasSelfReference"] = typeAlias_hasSelfReference;
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
+      if (namedCompilationUnitMember_name != null)
+        _result["namedCompilationUnitMember_name"] =
+            namedCompilationUnitMember_name.toJson();
+      if (simplyBoundable_isSimplyBounded != false)
+        _result["simplyBoundable_isSimplyBounded"] =
+            simplyBoundable_isSimplyBounded;
+    }
+    if (kind == idl.LinkedNodeKind.genericFunctionType) {
+      if (actualReturnType != null)
+        _result["actualReturnType"] = actualReturnType.toJson();
+      if (genericFunctionType_typeParameters != null)
+        _result["genericFunctionType_typeParameters"] =
+            genericFunctionType_typeParameters.toJson();
+      if (genericFunctionType_functionKeyword != 0)
+        _result["genericFunctionType_functionKeyword"] =
+            genericFunctionType_functionKeyword;
+      if (genericFunctionType_returnType != null)
+        _result["genericFunctionType_returnType"] =
+            genericFunctionType_returnType.toJson();
+      if (genericFunctionType_id != 0)
+        _result["genericFunctionType_id"] = genericFunctionType_id;
+      if (genericFunctionType_formalParameters != null)
+        _result["genericFunctionType_formalParameters"] =
+            genericFunctionType_formalParameters.toJson();
+      if (genericFunctionType_question != 0)
+        _result["genericFunctionType_question"] = genericFunctionType_question;
+      if (genericFunctionType_type != null)
+        _result["genericFunctionType_type"] = genericFunctionType_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.methodDeclaration) {
+      if (actualReturnType != null)
+        _result["actualReturnType"] = actualReturnType.toJson();
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (methodDeclaration_body != null)
+        _result["methodDeclaration_body"] = methodDeclaration_body.toJson();
+      if (methodDeclaration_externalKeyword != 0)
+        _result["methodDeclaration_externalKeyword"] =
+            methodDeclaration_externalKeyword;
+      if (methodDeclaration_formalParameters != null)
+        _result["methodDeclaration_formalParameters"] =
+            methodDeclaration_formalParameters.toJson();
+      if (methodDeclaration_operatorKeyword != 0)
+        _result["methodDeclaration_operatorKeyword"] =
+            methodDeclaration_operatorKeyword;
+      if (methodDeclaration_returnType != null)
+        _result["methodDeclaration_returnType"] =
+            methodDeclaration_returnType.toJson();
+      if (methodDeclaration_modifierKeyword != 0)
+        _result["methodDeclaration_modifierKeyword"] =
+            methodDeclaration_modifierKeyword;
+      if (methodDeclaration_propertyKeyword != 0)
+        _result["methodDeclaration_propertyKeyword"] =
+            methodDeclaration_propertyKeyword;
+      if (methodDeclaration_actualProperty != 0)
+        _result["methodDeclaration_actualProperty"] =
+            methodDeclaration_actualProperty;
+      if (methodDeclaration_typeParameters != null)
+        _result["methodDeclaration_typeParameters"] =
+            methodDeclaration_typeParameters.toJson();
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
+      if (methodDeclaration_name != null)
+        _result["methodDeclaration_name"] = methodDeclaration_name.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.fieldFormalParameter) {
+      if (actualType != null) _result["actualType"] = actualType.toJson();
+      if (normalFormalParameter_metadata.isNotEmpty)
+        _result["normalFormalParameter_metadata"] =
+            normalFormalParameter_metadata
+                .map((_value) => _value.toJson())
+                .toList();
+      if (fieldFormalParameter_type != null)
+        _result["fieldFormalParameter_type"] =
+            fieldFormalParameter_type.toJson();
+      if (fieldFormalParameter_keyword != 0)
+        _result["fieldFormalParameter_keyword"] = fieldFormalParameter_keyword;
+      if (fieldFormalParameter_typeParameters != null)
+        _result["fieldFormalParameter_typeParameters"] =
+            fieldFormalParameter_typeParameters.toJson();
+      if (fieldFormalParameter_thisKeyword != 0)
+        _result["fieldFormalParameter_thisKeyword"] =
+            fieldFormalParameter_thisKeyword;
+      if (fieldFormalParameter_formalParameters != null)
+        _result["fieldFormalParameter_formalParameters"] =
+            fieldFormalParameter_formalParameters.toJson();
+      if (fieldFormalParameter_period != 0)
+        _result["fieldFormalParameter_period"] = fieldFormalParameter_period;
+      if (normalFormalParameter_requiredKeyword != 0)
+        _result["normalFormalParameter_requiredKeyword"] =
+            normalFormalParameter_requiredKeyword;
+      if (normalFormalParameter_covariantKeyword != 0)
+        _result["normalFormalParameter_covariantKeyword"] =
+            normalFormalParameter_covariantKeyword;
+      if (inheritsCovariant != false)
+        _result["inheritsCovariant"] = inheritsCovariant;
+      if (normalFormalParameter_identifier != null)
+        _result["normalFormalParameter_identifier"] =
+            normalFormalParameter_identifier.toJson();
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
+      if (normalFormalParameter_comment != null)
+        _result["normalFormalParameter_comment"] =
+            normalFormalParameter_comment.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
+      if (actualType != null) _result["actualType"] = actualType.toJson();
+      if (normalFormalParameter_metadata.isNotEmpty)
+        _result["normalFormalParameter_metadata"] =
+            normalFormalParameter_metadata
+                .map((_value) => _value.toJson())
+                .toList();
+      if (functionTypedFormalParameter_formalParameters != null)
+        _result["functionTypedFormalParameter_formalParameters"] =
+            functionTypedFormalParameter_formalParameters.toJson();
+      if (functionTypedFormalParameter_returnType != null)
+        _result["functionTypedFormalParameter_returnType"] =
+            functionTypedFormalParameter_returnType.toJson();
+      if (functionTypedFormalParameter_typeParameters != null)
+        _result["functionTypedFormalParameter_typeParameters"] =
+            functionTypedFormalParameter_typeParameters.toJson();
+      if (normalFormalParameter_requiredKeyword != 0)
+        _result["normalFormalParameter_requiredKeyword"] =
+            normalFormalParameter_requiredKeyword;
+      if (normalFormalParameter_covariantKeyword != 0)
+        _result["normalFormalParameter_covariantKeyword"] =
+            normalFormalParameter_covariantKeyword;
+      if (inheritsCovariant != false)
+        _result["inheritsCovariant"] = inheritsCovariant;
+      if (normalFormalParameter_identifier != null)
+        _result["normalFormalParameter_identifier"] =
+            normalFormalParameter_identifier.toJson();
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
+      if (normalFormalParameter_comment != null)
+        _result["normalFormalParameter_comment"] =
+            normalFormalParameter_comment.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
+      if (actualType != null) _result["actualType"] = actualType.toJson();
+      if (normalFormalParameter_metadata.isNotEmpty)
+        _result["normalFormalParameter_metadata"] =
+            normalFormalParameter_metadata
+                .map((_value) => _value.toJson())
+                .toList();
+      if (simpleFormalParameter_type != null)
+        _result["simpleFormalParameter_type"] =
+            simpleFormalParameter_type.toJson();
+      if (simpleFormalParameter_keyword != 0)
+        _result["simpleFormalParameter_keyword"] =
+            simpleFormalParameter_keyword;
+      if (normalFormalParameter_requiredKeyword != 0)
+        _result["normalFormalParameter_requiredKeyword"] =
+            normalFormalParameter_requiredKeyword;
+      if (normalFormalParameter_covariantKeyword != 0)
+        _result["normalFormalParameter_covariantKeyword"] =
+            normalFormalParameter_covariantKeyword;
+      if (inheritsCovariant != false)
+        _result["inheritsCovariant"] = inheritsCovariant;
+      if (normalFormalParameter_identifier != null)
+        _result["normalFormalParameter_identifier"] =
+            normalFormalParameter_identifier.toJson();
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
+      if (normalFormalParameter_comment != null)
+        _result["normalFormalParameter_comment"] =
+            normalFormalParameter_comment.toJson();
+      if (topLevelTypeInferenceError != null)
+        _result["topLevelTypeInferenceError"] =
+            topLevelTypeInferenceError.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.variableDeclaration) {
+      if (actualType != null) _result["actualType"] = actualType.toJson();
+      if (annotatedNode_comment != null)
+        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (variableDeclaration_initializer != null)
+        _result["variableDeclaration_initializer"] =
+            variableDeclaration_initializer.toJson();
+      if (variableDeclaration_equals != 0)
+        _result["variableDeclaration_equals"] = variableDeclaration_equals;
+      if (variableDeclaration_name != null)
+        _result["variableDeclaration_name"] = variableDeclaration_name.toJson();
+      if (inheritsCovariant != false)
+        _result["inheritsCovariant"] = inheritsCovariant;
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
+      if (topLevelTypeInferenceError != null)
+        _result["topLevelTypeInferenceError"] =
+            topLevelTypeInferenceError.toJson();
+      if (variableDeclaration_declaration != null)
+        _result["variableDeclaration_declaration"] =
+            variableDeclaration_declaration.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.binaryExpression) {
+      if (binaryExpression_invokeType != null)
+        _result["binaryExpression_invokeType"] =
+            binaryExpression_invokeType.toJson();
+      if (binaryExpression_leftOperand != null)
+        _result["binaryExpression_leftOperand"] =
+            binaryExpression_leftOperand.toJson();
+      if (binaryExpression_element != 0)
+        _result["binaryExpression_element"] = binaryExpression_element;
+      if (binaryExpression_rightOperand != null)
+        _result["binaryExpression_rightOperand"] =
+            binaryExpression_rightOperand.toJson();
+      if (binaryExpression_elementType != null)
+        _result["binaryExpression_elementType"] =
+            binaryExpression_elementType.toJson();
+      if (binaryExpression_operator != 0)
+        _result["binaryExpression_operator"] = binaryExpression_operator;
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.functionExpressionInvocation) {
+      if (invocationExpression_invokeType != null)
+        _result["invocationExpression_invokeType"] =
+            invocationExpression_invokeType.toJson();
+      if (functionExpressionInvocation_function != null)
+        _result["functionExpressionInvocation_function"] =
+            functionExpressionInvocation_function.toJson();
+      if (invocationExpression_typeArguments != null)
+        _result["invocationExpression_typeArguments"] =
+            invocationExpression_typeArguments.toJson();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+      if (invocationExpression_arguments != null)
+        _result["invocationExpression_arguments"] =
+            invocationExpression_arguments.toJson();
+    }
+    if (kind == idl.LinkedNodeKind.methodInvocation) {
+      if (invocationExpression_invokeType != null)
+        _result["invocationExpression_invokeType"] =
+            invocationExpression_invokeType.toJson();
+      if (methodInvocation_methodName != null)
+        _result["methodInvocation_methodName"] =
+            methodInvocation_methodName.toJson();
+      if (methodInvocation_operator != 0)
+        _result["methodInvocation_operator"] = methodInvocation_operator;
+      if (methodInvocation_target != null)
+        _result["methodInvocation_target"] = methodInvocation_target.toJson();
+      if (invocationExpression_typeArguments != null)
+        _result["invocationExpression_typeArguments"] =
+            invocationExpression_typeArguments.toJson();
+      if (expression_type != null)
+        _result["expression_type"] = expression_type.toJson();
+      if (invocationExpression_arguments != null)
+        _result["invocationExpression_arguments"] =
+            invocationExpression_arguments.toJson();
+    }
     if (kind == idl.LinkedNodeKind.adjacentStrings) {
       if (adjacentStrings_strings.isNotEmpty)
         _result["adjacentStrings_strings"] =
@@ -14901,6 +16226,14 @@
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
+    if (kind == idl.LinkedNodeKind.comment) {
+      if (comment_references.isNotEmpty)
+        _result["comment_references"] =
+            comment_references.map((_value) => _value.toJson()).toList();
+      if (comment_tokens.isNotEmpty) _result["comment_tokens"] = comment_tokens;
+      if (comment_type != idl.LinkedNodeCommentType.block)
+        _result["comment_type"] = comment_type.toString().split('.')[1];
+    }
     if (kind == idl.LinkedNodeKind.compilationUnit) {
       if (compilationUnit_declarations.isNotEmpty)
         _result["compilationUnit_declarations"] = compilationUnit_declarations
@@ -14913,6 +16246,8 @@
         _result["compilationUnit_beginToken"] = compilationUnit_beginToken;
       if (compilationUnit_endToken != 0)
         _result["compilationUnit_endToken"] = compilationUnit_endToken;
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
       if (compilationUnit_directives.isNotEmpty)
         _result["compilationUnit_directives"] = compilationUnit_directives
             .map((_value) => _value.toJson())
@@ -14938,15 +16273,15 @@
       if (constructorDeclaration_name != null)
         _result["constructorDeclaration_name"] =
             constructorDeclaration_name.toJson();
+      if (constructorDeclaration_factoryKeyword != 0)
+        _result["constructorDeclaration_factoryKeyword"] =
+            constructorDeclaration_factoryKeyword;
       if (constructorDeclaration_parameters != null)
         _result["constructorDeclaration_parameters"] =
             constructorDeclaration_parameters.toJson();
       if (constructorDeclaration_externalKeyword != 0)
         _result["constructorDeclaration_externalKeyword"] =
             constructorDeclaration_externalKeyword;
-      if (constructorDeclaration_factoryKeyword != 0)
-        _result["constructorDeclaration_factoryKeyword"] =
-            constructorDeclaration_factoryKeyword;
       if (constructorDeclaration_period != 0)
         _result["constructorDeclaration_period"] =
             constructorDeclaration_period;
@@ -14956,6 +16291,8 @@
       if (constructorDeclaration_redirectedConstructor != null)
         _result["constructorDeclaration_redirectedConstructor"] =
             constructorDeclaration_redirectedConstructor.toJson();
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
       if (constructorDeclaration_returnType != null)
         _result["constructorDeclaration_returnType"] =
             constructorDeclaration_returnType.toJson();
@@ -14976,10 +16313,12 @@
             annotatedNode_metadata.map((_value) => _value.toJson()).toList();
       if (enumDeclaration_enumKeyword != 0)
         _result["enumDeclaration_enumKeyword"] = enumDeclaration_enumKeyword;
-      if (enumDeclaration_leftBracket != 0)
-        _result["enumDeclaration_leftBracket"] = enumDeclaration_leftBracket;
       if (enumDeclaration_rightBracket != 0)
         _result["enumDeclaration_rightBracket"] = enumDeclaration_rightBracket;
+      if (enumDeclaration_leftBracket != 0)
+        _result["enumDeclaration_leftBracket"] = enumDeclaration_leftBracket;
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
       if (namedCompilationUnitMember_name != null)
         _result["namedCompilationUnitMember_name"] =
             namedCompilationUnitMember_name.toJson();
@@ -14993,12 +16332,12 @@
       if (formalParameterList_leftDelimiter != 0)
         _result["formalParameterList_leftDelimiter"] =
             formalParameterList_leftDelimiter;
-      if (formalParameterList_leftParenthesis != 0)
-        _result["formalParameterList_leftParenthesis"] =
-            formalParameterList_leftParenthesis;
       if (formalParameterList_rightDelimiter != 0)
         _result["formalParameterList_rightDelimiter"] =
             formalParameterList_rightDelimiter;
+      if (formalParameterList_leftParenthesis != 0)
+        _result["formalParameterList_leftParenthesis"] =
+            formalParameterList_leftParenthesis;
       if (formalParameterList_rightParenthesis != 0)
         _result["formalParameterList_rightParenthesis"] =
             formalParameterList_rightParenthesis;
@@ -15063,10 +16402,10 @@
             annotatedNode_metadata.map((_value) => _value.toJson()).toList();
       if (directive_keyword != 0)
         _result["directive_keyword"] = directive_keyword;
-      if (namespaceDirective_semicolon != 0)
-        _result["namespaceDirective_semicolon"] = namespaceDirective_semicolon;
       if (uriBasedDirective_uriElement != 0)
         _result["uriBasedDirective_uriElement"] = uriBasedDirective_uriElement;
+      if (directive_semicolon != 0)
+        _result["directive_semicolon"] = directive_semicolon;
       if (namespaceDirective_configurations.isNotEmpty)
         _result["namespaceDirective_configurations"] =
             namespaceDirective_configurations
@@ -15074,9 +16413,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;
     }
@@ -15100,10 +16439,10 @@
             importDirective_deferredKeyword;
       if (directive_keyword != 0)
         _result["directive_keyword"] = directive_keyword;
-      if (namespaceDirective_semicolon != 0)
-        _result["namespaceDirective_semicolon"] = namespaceDirective_semicolon;
       if (uriBasedDirective_uriElement != 0)
         _result["uriBasedDirective_uriElement"] = uriBasedDirective_uriElement;
+      if (directive_semicolon != 0)
+        _result["directive_semicolon"] = directive_semicolon;
       if (namespaceDirective_configurations.isNotEmpty)
         _result["namespaceDirective_configurations"] =
             namespaceDirective_configurations
@@ -15111,9 +16450,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;
     }
@@ -15171,12 +16510,12 @@
       if (switchStatement_expression != null)
         _result["switchStatement_expression"] =
             switchStatement_expression.toJson();
-      if (switchStatement_rightParenthesis != 0)
-        _result["switchStatement_rightParenthesis"] =
-            switchStatement_rightParenthesis;
       if (switchStatement_switchKeyword != 0)
         _result["switchStatement_switchKeyword"] =
             switchStatement_switchKeyword;
+      if (switchStatement_rightParenthesis != 0)
+        _result["switchStatement_rightParenthesis"] =
+            switchStatement_rightParenthesis;
       if (switchStatement_leftBracket != 0)
         _result["switchStatement_leftBracket"] = switchStatement_leftBracket;
       if (switchStatement_rightBracket != 0)
@@ -15237,6 +16576,9 @@
       if (variableDeclarationList_keyword != 0)
         _result["variableDeclarationList_keyword"] =
             variableDeclarationList_keyword;
+      if (variableDeclarationList_lateKeyword != 0)
+        _result["variableDeclarationList_lateKeyword"] =
+            variableDeclarationList_lateKeyword;
     }
     if (kind == idl.LinkedNodeKind.withClause) {
       if (withClause_mixinTypes.isNotEmpty)
@@ -15260,6 +16602,9 @@
       if (classDeclaration_withClause != null)
         _result["classDeclaration_withClause"] =
             classDeclaration_withClause.toJson();
+      if (classDeclaration_nativeClause != null)
+        _result["classDeclaration_nativeClause"] =
+            classDeclaration_nativeClause.toJson();
       if (classDeclaration_classKeyword != 0)
         _result["classDeclaration_classKeyword"] =
             classDeclaration_classKeyword;
@@ -15283,9 +16628,14 @@
       if (classOrMixinDeclaration_typeParameters != null)
         _result["classOrMixinDeclaration_typeParameters"] =
             classOrMixinDeclaration_typeParameters.toJson();
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
       if (namedCompilationUnitMember_name != null)
         _result["namedCompilationUnitMember_name"] =
             namedCompilationUnitMember_name.toJson();
+      if (simplyBoundable_isSimplyBounded != false)
+        _result["simplyBoundable_isSimplyBounded"] =
+            simplyBoundable_isSimplyBounded;
     }
     if (kind == idl.LinkedNodeKind.classTypeAlias) {
       if (annotatedNode_comment != null)
@@ -15314,9 +16664,14 @@
       if (classTypeAlias_implementsClause != null)
         _result["classTypeAlias_implementsClause"] =
             classTypeAlias_implementsClause.toJson();
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
       if (namedCompilationUnitMember_name != null)
         _result["namedCompilationUnitMember_name"] =
             namedCompilationUnitMember_name.toJson();
+      if (simplyBoundable_isSimplyBounded != false)
+        _result["simplyBoundable_isSimplyBounded"] =
+            simplyBoundable_isSimplyBounded;
     }
     if (kind == idl.LinkedNodeKind.declaredIdentifier) {
       if (annotatedNode_comment != null)
@@ -15353,62 +16708,11 @@
       if (fieldDeclaration_covariantKeyword != 0)
         _result["fieldDeclaration_covariantKeyword"] =
             fieldDeclaration_covariantKeyword;
-      if (fieldDeclaration_semicolon != 0)
-        _result["fieldDeclaration_semicolon"] = fieldDeclaration_semicolon;
       if (fieldDeclaration_staticKeyword != 0)
         _result["fieldDeclaration_staticKeyword"] =
             fieldDeclaration_staticKeyword;
-    }
-    if (kind == idl.LinkedNodeKind.functionDeclaration) {
-      if (annotatedNode_comment != null)
-        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
-      if (annotatedNode_metadata.isNotEmpty)
-        _result["annotatedNode_metadata"] =
-            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
-      if (functionDeclaration_functionExpression != null)
-        _result["functionDeclaration_functionExpression"] =
-            functionDeclaration_functionExpression.toJson();
-      if (functionDeclaration_externalKeyword != 0)
-        _result["functionDeclaration_externalKeyword"] =
-            functionDeclaration_externalKeyword;
-      if (functionDeclaration_returnType != null)
-        _result["functionDeclaration_returnType"] =
-            functionDeclaration_returnType.toJson();
-      if (functionDeclaration_propertyKeyword != 0)
-        _result["functionDeclaration_propertyKeyword"] =
-            functionDeclaration_propertyKeyword;
-      if (functionDeclaration_returnType2 != null)
-        _result["functionDeclaration_returnType2"] =
-            functionDeclaration_returnType2.toJson();
-      if (namedCompilationUnitMember_name != null)
-        _result["namedCompilationUnitMember_name"] =
-            namedCompilationUnitMember_name.toJson();
-    }
-    if (kind == idl.LinkedNodeKind.functionTypeAlias) {
-      if (annotatedNode_comment != null)
-        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
-      if (annotatedNode_metadata.isNotEmpty)
-        _result["annotatedNode_metadata"] =
-            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
-      if (functionTypeAlias_formalParameters != null)
-        _result["functionTypeAlias_formalParameters"] =
-            functionTypeAlias_formalParameters.toJson();
-      if (functionTypeAlias_returnType != null)
-        _result["functionTypeAlias_returnType"] =
-            functionTypeAlias_returnType.toJson();
-      if (functionTypeAlias_typeParameters != null)
-        _result["functionTypeAlias_typeParameters"] =
-            functionTypeAlias_typeParameters.toJson();
-      if (typeAlias_typedefKeyword != 0)
-        _result["typeAlias_typedefKeyword"] = typeAlias_typedefKeyword;
-      if (typeAlias_semicolon != 0)
-        _result["typeAlias_semicolon"] = typeAlias_semicolon;
-      if (functionTypeAlias_returnType2 != null)
-        _result["functionTypeAlias_returnType2"] =
-            functionTypeAlias_returnType2.toJson();
-      if (namedCompilationUnitMember_name != null)
-        _result["namedCompilationUnitMember_name"] =
-            namedCompilationUnitMember_name.toJson();
+      if (fieldDeclaration_semicolon != 0)
+        _result["fieldDeclaration_semicolon"] = fieldDeclaration_semicolon;
     }
     if (kind == idl.LinkedNodeKind.genericTypeAlias) {
       if (annotatedNode_comment != null)
@@ -15428,9 +16732,16 @@
         _result["typeAlias_typedefKeyword"] = typeAlias_typedefKeyword;
       if (typeAlias_semicolon != 0)
         _result["typeAlias_semicolon"] = typeAlias_semicolon;
+      if (typeAlias_hasSelfReference != false)
+        _result["typeAlias_hasSelfReference"] = typeAlias_hasSelfReference;
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
       if (namedCompilationUnitMember_name != null)
         _result["namedCompilationUnitMember_name"] =
             namedCompilationUnitMember_name.toJson();
+      if (simplyBoundable_isSimplyBounded != false)
+        _result["simplyBoundable_isSimplyBounded"] =
+            simplyBoundable_isSimplyBounded;
     }
     if (kind == idl.LinkedNodeKind.libraryDirective) {
       if (annotatedNode_comment != null)
@@ -15442,46 +16753,8 @@
         _result["libraryDirective_name"] = libraryDirective_name.toJson();
       if (directive_keyword != 0)
         _result["directive_keyword"] = directive_keyword;
-      if (namespaceDirective_semicolon != 0)
-        _result["namespaceDirective_semicolon"] = namespaceDirective_semicolon;
-    }
-    if (kind == idl.LinkedNodeKind.methodDeclaration) {
-      if (annotatedNode_comment != null)
-        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
-      if (annotatedNode_metadata.isNotEmpty)
-        _result["annotatedNode_metadata"] =
-            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
-      if (methodDeclaration_body != null)
-        _result["methodDeclaration_body"] = methodDeclaration_body.toJson();
-      if (methodDeclaration_externalKeyword != 0)
-        _result["methodDeclaration_externalKeyword"] =
-            methodDeclaration_externalKeyword;
-      if (methodDeclaration_formalParameters != null)
-        _result["methodDeclaration_formalParameters"] =
-            methodDeclaration_formalParameters.toJson();
-      if (methodDeclaration_returnType != null)
-        _result["methodDeclaration_returnType"] =
-            methodDeclaration_returnType.toJson();
-      if (methodDeclaration_modifierKeyword != 0)
-        _result["methodDeclaration_modifierKeyword"] =
-            methodDeclaration_modifierKeyword;
-      if (methodDeclaration_operatorKeyword != 0)
-        _result["methodDeclaration_operatorKeyword"] =
-            methodDeclaration_operatorKeyword;
-      if (methodDeclaration_propertyKeyword != 0)
-        _result["methodDeclaration_propertyKeyword"] =
-            methodDeclaration_propertyKeyword;
-      if (methodDeclaration_actualProperty != 0)
-        _result["methodDeclaration_actualProperty"] =
-            methodDeclaration_actualProperty;
-      if (methodDeclaration_returnType2 != null)
-        _result["methodDeclaration_returnType2"] =
-            methodDeclaration_returnType2.toJson();
-      if (methodDeclaration_typeParameters != null)
-        _result["methodDeclaration_typeParameters"] =
-            methodDeclaration_typeParameters.toJson();
-      if (methodDeclaration_name != null)
-        _result["methodDeclaration_name"] = methodDeclaration_name.toJson();
+      if (directive_semicolon != 0)
+        _result["directive_semicolon"] = directive_semicolon;
     }
     if (kind == idl.LinkedNodeKind.mixinDeclaration) {
       if (annotatedNode_comment != null)
@@ -15512,9 +16785,17 @@
       if (classOrMixinDeclaration_typeParameters != null)
         _result["classOrMixinDeclaration_typeParameters"] =
             classOrMixinDeclaration_typeParameters.toJson();
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
       if (namedCompilationUnitMember_name != null)
         _result["namedCompilationUnitMember_name"] =
             namedCompilationUnitMember_name.toJson();
+      if (mixinDeclaration_superInvokedNames.isNotEmpty)
+        _result["mixinDeclaration_superInvokedNames"] =
+            mixinDeclaration_superInvokedNames;
+      if (simplyBoundable_isSimplyBounded != false)
+        _result["simplyBoundable_isSimplyBounded"] =
+            simplyBoundable_isSimplyBounded;
     }
     if (kind == idl.LinkedNodeKind.partDirective) {
       if (annotatedNode_comment != null)
@@ -15524,15 +16805,12 @@
             annotatedNode_metadata.map((_value) => _value.toJson()).toList();
       if (directive_keyword != 0)
         _result["directive_keyword"] = directive_keyword;
-      if (namespaceDirective_semicolon != 0)
-        _result["namespaceDirective_semicolon"] = namespaceDirective_semicolon;
       if (uriBasedDirective_uriElement != 0)
         _result["uriBasedDirective_uriElement"] = uriBasedDirective_uriElement;
+      if (directive_semicolon != 0)
+        _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;
     }
@@ -15545,17 +16823,14 @@
       if (partOfDirective_libraryName != null)
         _result["partOfDirective_libraryName"] =
             partOfDirective_libraryName.toJson();
-      if (partOfDirective_semicolon != 0)
-        _result["partOfDirective_semicolon"] = partOfDirective_semicolon;
       if (partOfDirective_uri != null)
         _result["partOfDirective_uri"] = partOfDirective_uri.toJson();
       if (partOfDirective_ofKeyword != 0)
         _result["partOfDirective_ofKeyword"] = partOfDirective_ofKeyword;
       if (directive_keyword != 0)
         _result["directive_keyword"] = directive_keyword;
-      if (namespaceDirective_selectedUriContent != '')
-        _result["namespaceDirective_selectedUriContent"] =
-            namespaceDirective_selectedUriContent;
+      if (directive_semicolon != 0)
+        _result["directive_semicolon"] = directive_semicolon;
     }
     if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
       if (annotatedNode_comment != null)
@@ -15582,129 +16857,11 @@
         _result["typeParameter_extendsKeyword"] = typeParameter_extendsKeyword;
       if (typeParameter_name != null)
         _result["typeParameter_name"] = typeParameter_name.toJson();
-    }
-    if (kind == idl.LinkedNodeKind.variableDeclaration) {
-      if (annotatedNode_comment != null)
-        _result["annotatedNode_comment"] = annotatedNode_comment.toJson();
-      if (annotatedNode_metadata.isNotEmpty)
-        _result["annotatedNode_metadata"] =
-            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
-      if (variableDeclaration_initializer != null)
-        _result["variableDeclaration_initializer"] =
-            variableDeclaration_initializer.toJson();
-      if (variableDeclaration_equals != 0)
-        _result["variableDeclaration_equals"] = variableDeclaration_equals;
-      if (variableDeclaration_name != null)
-        _result["variableDeclaration_name"] = variableDeclaration_name.toJson();
-      if (variableDeclaration_type2 != null)
-        _result["variableDeclaration_type2"] =
-            variableDeclaration_type2.toJson();
-      if (variableDeclaration_declaration != null)
-        _result["variableDeclaration_declaration"] =
-            variableDeclaration_declaration.toJson();
-    }
-    if (kind == idl.LinkedNodeKind.fieldFormalParameter) {
-      if (normalFormalParameter_metadata.isNotEmpty)
-        _result["normalFormalParameter_metadata"] =
-            normalFormalParameter_metadata
-                .map((_value) => _value.toJson())
-                .toList();
-      if (fieldFormalParameter_type != null)
-        _result["fieldFormalParameter_type"] =
-            fieldFormalParameter_type.toJson();
-      if (fieldFormalParameter_keyword != 0)
-        _result["fieldFormalParameter_keyword"] = fieldFormalParameter_keyword;
-      if (fieldFormalParameter_typeParameters != null)
-        _result["fieldFormalParameter_typeParameters"] =
-            fieldFormalParameter_typeParameters.toJson();
-      if (fieldFormalParameter_formalParameters != null)
-        _result["fieldFormalParameter_formalParameters"] =
-            fieldFormalParameter_formalParameters.toJson();
-      if (fieldFormalParameter_period != 0)
-        _result["fieldFormalParameter_period"] = fieldFormalParameter_period;
-      if (fieldFormalParameter_thisKeyword != 0)
-        _result["fieldFormalParameter_thisKeyword"] =
-            fieldFormalParameter_thisKeyword;
-      if (normalFormalParameter_covariantKeyword != 0)
-        _result["normalFormalParameter_covariantKeyword"] =
-            normalFormalParameter_covariantKeyword;
-      if (fieldFormalParameter_type2 != null)
-        _result["fieldFormalParameter_type2"] =
-            fieldFormalParameter_type2.toJson();
-      if (normalFormalParameter_isCovariant != false)
-        _result["normalFormalParameter_isCovariant"] =
-            normalFormalParameter_isCovariant;
-      if (normalFormalParameter_identifier != null)
-        _result["normalFormalParameter_identifier"] =
-            normalFormalParameter_identifier.toJson();
-      if (formalParameter_kind != idl.LinkedNodeFormalParameterKind.required)
-        _result["formalParameter_kind"] =
-            formalParameter_kind.toString().split('.')[1];
-      if (normalFormalParameter_comment != null)
-        _result["normalFormalParameter_comment"] =
-            normalFormalParameter_comment.toJson();
-    }
-    if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
-      if (normalFormalParameter_metadata.isNotEmpty)
-        _result["normalFormalParameter_metadata"] =
-            normalFormalParameter_metadata
-                .map((_value) => _value.toJson())
-                .toList();
-      if (functionTypedFormalParameter_formalParameters != null)
-        _result["functionTypedFormalParameter_formalParameters"] =
-            functionTypedFormalParameter_formalParameters.toJson();
-      if (functionTypedFormalParameter_returnType != null)
-        _result["functionTypedFormalParameter_returnType"] =
-            functionTypedFormalParameter_returnType.toJson();
-      if (functionTypedFormalParameter_typeParameters != null)
-        _result["functionTypedFormalParameter_typeParameters"] =
-            functionTypedFormalParameter_typeParameters.toJson();
-      if (normalFormalParameter_covariantKeyword != 0)
-        _result["normalFormalParameter_covariantKeyword"] =
-            normalFormalParameter_covariantKeyword;
-      if (normalFormalParameter_isCovariant != false)
-        _result["normalFormalParameter_isCovariant"] =
-            normalFormalParameter_isCovariant;
-      if (normalFormalParameter_identifier != null)
-        _result["normalFormalParameter_identifier"] =
-            normalFormalParameter_identifier.toJson();
-      if (formalParameter_kind != idl.LinkedNodeFormalParameterKind.required)
-        _result["formalParameter_kind"] =
-            formalParameter_kind.toString().split('.')[1];
-      if (normalFormalParameter_comment != null)
-        _result["normalFormalParameter_comment"] =
-            normalFormalParameter_comment.toJson();
-    }
-    if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
-      if (normalFormalParameter_metadata.isNotEmpty)
-        _result["normalFormalParameter_metadata"] =
-            normalFormalParameter_metadata
-                .map((_value) => _value.toJson())
-                .toList();
-      if (simpleFormalParameter_type != null)
-        _result["simpleFormalParameter_type"] =
-            simpleFormalParameter_type.toJson();
-      if (simpleFormalParameter_keyword != 0)
-        _result["simpleFormalParameter_keyword"] =
-            simpleFormalParameter_keyword;
-      if (normalFormalParameter_covariantKeyword != 0)
-        _result["normalFormalParameter_covariantKeyword"] =
-            normalFormalParameter_covariantKeyword;
-      if (simpleFormalParameter_type2 != null)
-        _result["simpleFormalParameter_type2"] =
-            simpleFormalParameter_type2.toJson();
-      if (normalFormalParameter_isCovariant != false)
-        _result["normalFormalParameter_isCovariant"] =
-            normalFormalParameter_isCovariant;
-      if (normalFormalParameter_identifier != null)
-        _result["normalFormalParameter_identifier"] =
-            normalFormalParameter_identifier.toJson();
-      if (formalParameter_kind != idl.LinkedNodeFormalParameterKind.required)
-        _result["formalParameter_kind"] =
-            formalParameter_kind.toString().split('.')[1];
-      if (normalFormalParameter_comment != null)
-        _result["normalFormalParameter_comment"] =
-            normalFormalParameter_comment.toJson();
+      if (typeParameter_defaultType != null)
+        _result["typeParameter_defaultType"] =
+            typeParameter_defaultType.toJson();
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
     }
     if (kind == idl.LinkedNodeKind.switchCase) {
       if (switchMember_statements.isNotEmpty)
@@ -15740,6 +16897,10 @@
       if (annotation_constructorName != null)
         _result["annotation_constructorName"] =
             annotation_constructorName.toJson();
+      if (annotation_element != 0)
+        _result["annotation_element"] = annotation_element;
+      if (annotation_elementType != null)
+        _result["annotation_elementType"] = annotation_elementType.toJson();
       if (annotation_name != null)
         _result["annotation_name"] = annotation_name.toJson();
       if (annotation_period != 0)
@@ -15765,11 +16926,11 @@
       if (assertInitializer_message != null)
         _result["assertInitializer_message"] =
             assertInitializer_message.toJson();
-      if (assertInitializer_comma != 0)
-        _result["assertInitializer_comma"] = assertInitializer_comma;
       if (assertInitializer_leftParenthesis != 0)
         _result["assertInitializer_leftParenthesis"] =
             assertInitializer_leftParenthesis;
+      if (assertInitializer_comma != 0)
+        _result["assertInitializer_comma"] = assertInitializer_comma;
       if (assertInitializer_rightParenthesis != 0)
         _result["assertInitializer_rightParenthesis"] =
             assertInitializer_rightParenthesis;
@@ -15783,11 +16944,11 @@
             assertStatement_assertKeyword;
       if (assertStatement_message != null)
         _result["assertStatement_message"] = assertStatement_message.toJson();
-      if (assertStatement_comma != 0)
-        _result["assertStatement_comma"] = assertStatement_comma;
       if (assertStatement_leftParenthesis != 0)
         _result["assertStatement_leftParenthesis"] =
             assertStatement_leftParenthesis;
+      if (assertStatement_comma != 0)
+        _result["assertStatement_comma"] = assertStatement_comma;
       if (assertStatement_rightParenthesis != 0)
         _result["assertStatement_rightParenthesis"] =
             assertStatement_rightParenthesis;
@@ -15803,6 +16964,9 @@
       if (assignmentExpression_rightHandSide != null)
         _result["assignmentExpression_rightHandSide"] =
             assignmentExpression_rightHandSide.toJson();
+      if (assignmentExpression_elementType != null)
+        _result["assignmentExpression_elementType"] =
+            assignmentExpression_elementType.toJson();
       if (assignmentExpression_operator != 0)
         _result["assignmentExpression_operator"] =
             assignmentExpression_operator;
@@ -15818,23 +16982,6 @@
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
-    if (kind == idl.LinkedNodeKind.binaryExpression) {
-      if (binaryExpression_leftOperand != null)
-        _result["binaryExpression_leftOperand"] =
-            binaryExpression_leftOperand.toJson();
-      if (binaryExpression_element != 0)
-        _result["binaryExpression_element"] = binaryExpression_element;
-      if (binaryExpression_rightOperand != null)
-        _result["binaryExpression_rightOperand"] =
-            binaryExpression_rightOperand.toJson();
-      if (binaryExpression_operator != 0)
-        _result["binaryExpression_operator"] = binaryExpression_operator;
-      if (binaryExpression_invokeType != null)
-        _result["binaryExpression_invokeType"] =
-            binaryExpression_invokeType.toJson();
-      if (expression_type != null)
-        _result["expression_type"] = expression_type.toJson();
-    }
     if (kind == idl.LinkedNodeKind.blockFunctionBody) {
       if (blockFunctionBody_block != null)
         _result["blockFunctionBody_block"] = blockFunctionBody_block.toJson();
@@ -15859,13 +17006,13 @@
       if (catchClause_exceptionParameter != null)
         _result["catchClause_exceptionParameter"] =
             catchClause_exceptionParameter.toJson();
+      if (catchClause_leftParenthesis != 0)
+        _result["catchClause_leftParenthesis"] = catchClause_leftParenthesis;
       if (catchClause_exceptionType != null)
         _result["catchClause_exceptionType"] =
             catchClause_exceptionType.toJson();
       if (catchClause_comma != 0)
         _result["catchClause_comma"] = catchClause_comma;
-      if (catchClause_leftParenthesis != 0)
-        _result["catchClause_leftParenthesis"] = catchClause_leftParenthesis;
       if (catchClause_onKeyword != 0)
         _result["catchClause_onKeyword"] = catchClause_onKeyword;
       if (catchClause_rightParenthesis != 0)
@@ -15874,6 +17021,13 @@
         _result["catchClause_stackTraceParameter"] =
             catchClause_stackTraceParameter.toJson();
     }
+    if (kind == idl.LinkedNodeKind.commentReference) {
+      if (commentReference_identifier != null)
+        _result["commentReference_identifier"] =
+            commentReference_identifier.toJson();
+      if (commentReference_newKeyword != 0)
+        _result["commentReference_newKeyword"] = commentReference_newKeyword;
+    }
     if (kind == idl.LinkedNodeKind.conditionalExpression) {
       if (conditionalExpression_condition != null)
         _result["conditionalExpression_condition"] =
@@ -15899,14 +17053,14 @@
         _result["configuration_ifKeyword"] = configuration_ifKeyword;
       if (configuration_value != null)
         _result["configuration_value"] = configuration_value.toJson();
+      if (configuration_rightParenthesis != 0)
+        _result["configuration_rightParenthesis"] =
+            configuration_rightParenthesis;
       if (configuration_uri != null)
         _result["configuration_uri"] = configuration_uri.toJson();
       if (configuration_leftParenthesis != 0)
         _result["configuration_leftParenthesis"] =
             configuration_leftParenthesis;
-      if (configuration_rightParenthesis != 0)
-        _result["configuration_rightParenthesis"] =
-            configuration_rightParenthesis;
       if (configuration_equalToken != 0)
         _result["configuration_equalToken"] = configuration_equalToken;
     }
@@ -15920,12 +17074,12 @@
       if (constructorFieldInitializer_fieldName != null)
         _result["constructorFieldInitializer_fieldName"] =
             constructorFieldInitializer_fieldName.toJson();
-      if (constructorFieldInitializer_period != 0)
-        _result["constructorFieldInitializer_period"] =
-            constructorFieldInitializer_period;
       if (constructorFieldInitializer_thisKeyword != 0)
         _result["constructorFieldInitializer_thisKeyword"] =
             constructorFieldInitializer_thisKeyword;
+      if (constructorFieldInitializer_period != 0)
+        _result["constructorFieldInitializer_period"] =
+            constructorFieldInitializer_period;
     }
     if (kind == idl.LinkedNodeKind.constructorName) {
       if (constructorName_name != null)
@@ -15934,6 +17088,9 @@
         _result["constructorName_element"] = constructorName_element;
       if (constructorName_type != null)
         _result["constructorName_type"] = constructorName_type.toJson();
+      if (constructorName_elementType != null)
+        _result["constructorName_elementType"] =
+            constructorName_elementType.toJson();
       if (constructorName_period != 0)
         _result["constructorName_period"] = constructorName_period;
     }
@@ -15956,9 +17113,12 @@
       if (defaultFormalParameter_parameter != null)
         _result["defaultFormalParameter_parameter"] =
             defaultFormalParameter_parameter.toJson();
-      if (defaultFormalParameter_isNamed != false)
-        _result["defaultFormalParameter_isNamed"] =
-            defaultFormalParameter_isNamed;
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
+      if (defaultFormalParameter_kind !=
+          idl.LinkedNodeFormalParameterKind.requiredPositional)
+        _result["defaultFormalParameter_kind"] =
+            defaultFormalParameter_kind.toString().split('.')[1];
     }
     if (kind == idl.LinkedNodeKind.doStatement) {
       if (doStatement_body != null)
@@ -15967,10 +17127,10 @@
         _result["doStatement_leftParenthesis"] = doStatement_leftParenthesis;
       if (doStatement_condition != null)
         _result["doStatement_condition"] = doStatement_condition.toJson();
-      if (doStatement_rightParenthesis != 0)
-        _result["doStatement_rightParenthesis"] = doStatement_rightParenthesis;
       if (doStatement_doKeyword != 0)
         _result["doStatement_doKeyword"] = doStatement_doKeyword;
+      if (doStatement_rightParenthesis != 0)
+        _result["doStatement_rightParenthesis"] = doStatement_rightParenthesis;
       if (doStatement_semicolon != 0)
         _result["doStatement_semicolon"] = doStatement_semicolon;
       if (doStatement_whileKeyword != 0)
@@ -15982,12 +17142,12 @@
             expressionFunctionBody_expression.toJson();
       if (expressionFunctionBody_arrow != 0)
         _result["expressionFunctionBody_arrow"] = expressionFunctionBody_arrow;
-      if (expressionFunctionBody_keyword != 0)
-        _result["expressionFunctionBody_keyword"] =
-            expressionFunctionBody_keyword;
       if (expressionFunctionBody_semicolon != 0)
         _result["expressionFunctionBody_semicolon"] =
             expressionFunctionBody_semicolon;
+      if (expressionFunctionBody_keyword != 0)
+        _result["expressionFunctionBody_keyword"] =
+            expressionFunctionBody_keyword;
     }
     if (kind == idl.LinkedNodeKind.expressionStatement) {
       if (expressionStatement_expression != null)
@@ -16028,10 +17188,10 @@
         _result["forMixin_awaitKeyword"] = forMixin_awaitKeyword;
       if (forElement_body != null)
         _result["forElement_body"] = forElement_body.toJson();
-      if (forMixin_forKeyword != 0)
-        _result["forMixin_forKeyword"] = forMixin_forKeyword;
       if (forMixin_leftParenthesis != 0)
         _result["forMixin_leftParenthesis"] = forMixin_leftParenthesis;
+      if (forMixin_forKeyword != 0)
+        _result["forMixin_forKeyword"] = forMixin_forKeyword;
       if (forMixin_rightParenthesis != 0)
         _result["forMixin_rightParenthesis"] = forMixin_rightParenthesis;
     }
@@ -16042,10 +17202,10 @@
         _result["forMixin_awaitKeyword"] = forMixin_awaitKeyword;
       if (forStatement_body != null)
         _result["forStatement_body"] = forStatement_body.toJson();
-      if (forMixin_forKeyword != 0)
-        _result["forMixin_forKeyword"] = forMixin_forKeyword;
       if (forMixin_leftParenthesis != 0)
         _result["forMixin_leftParenthesis"] = forMixin_leftParenthesis;
+      if (forMixin_forKeyword != 0)
+        _result["forMixin_forKeyword"] = forMixin_forKeyword;
       if (forMixin_rightParenthesis != 0)
         _result["forMixin_rightParenthesis"] = forMixin_rightParenthesis;
     }
@@ -16082,62 +17242,17 @@
         _result["functionDeclarationStatement_functionDeclaration"] =
             functionDeclarationStatement_functionDeclaration.toJson();
     }
-    if (kind == idl.LinkedNodeKind.functionExpression) {
-      if (functionExpression_body != null)
-        _result["functionExpression_body"] = functionExpression_body.toJson();
-      if (functionExpression_formalParameters != null)
-        _result["functionExpression_formalParameters"] =
-            functionExpression_formalParameters.toJson();
-      if (functionExpression_typeParameters != null)
-        _result["functionExpression_typeParameters"] =
-            functionExpression_typeParameters.toJson();
-    }
-    if (kind == idl.LinkedNodeKind.functionExpressionInvocation) {
-      if (functionExpressionInvocation_function != null)
-        _result["functionExpressionInvocation_function"] =
-            functionExpressionInvocation_function.toJson();
-      if (invocationExpression_invokeType != null)
-        _result["invocationExpression_invokeType"] =
-            invocationExpression_invokeType.toJson();
-      if (invocationExpression_typeArguments != null)
-        _result["invocationExpression_typeArguments"] =
-            invocationExpression_typeArguments.toJson();
-      if (expression_type != null)
-        _result["expression_type"] = expression_type.toJson();
-      if (invocationExpression_arguments != null)
-        _result["invocationExpression_arguments"] =
-            invocationExpression_arguments.toJson();
-    }
-    if (kind == idl.LinkedNodeKind.genericFunctionType) {
-      if (genericFunctionType_typeParameters != null)
-        _result["genericFunctionType_typeParameters"] =
-            genericFunctionType_typeParameters.toJson();
-      if (genericFunctionType_functionKeyword != 0)
-        _result["genericFunctionType_functionKeyword"] =
-            genericFunctionType_functionKeyword;
-      if (genericFunctionType_returnType != null)
-        _result["genericFunctionType_returnType"] =
-            genericFunctionType_returnType.toJson();
-      if (genericFunctionType_formalParameters != null)
-        _result["genericFunctionType_formalParameters"] =
-            genericFunctionType_formalParameters.toJson();
-      if (genericFunctionType_question != 0)
-        _result["genericFunctionType_question"] = genericFunctionType_question;
-      if (genericFunctionType_returnType2 != null)
-        _result["genericFunctionType_returnType2"] =
-            genericFunctionType_returnType2.toJson();
-    }
     if (kind == idl.LinkedNodeKind.ifElement) {
       if (ifMixin_condition != null)
         _result["ifMixin_condition"] = ifMixin_condition.toJson();
       if (ifMixin_elseKeyword != 0)
         _result["ifMixin_elseKeyword"] = ifMixin_elseKeyword;
+      if (ifMixin_leftParenthesis != 0)
+        _result["ifMixin_leftParenthesis"] = ifMixin_leftParenthesis;
       if (ifElement_thenElement != null)
         _result["ifElement_thenElement"] = ifElement_thenElement.toJson();
       if (ifMixin_ifKeyword != 0)
         _result["ifMixin_ifKeyword"] = ifMixin_ifKeyword;
-      if (ifMixin_leftParenthesis != 0)
-        _result["ifMixin_leftParenthesis"] = ifMixin_leftParenthesis;
       if (ifMixin_rightParenthesis != 0)
         _result["ifMixin_rightParenthesis"] = ifMixin_rightParenthesis;
       if (ifElement_elseElement != null)
@@ -16151,13 +17266,13 @@
       if (ifStatement_elseStatement != null)
         _result["ifStatement_elseStatement"] =
             ifStatement_elseStatement.toJson();
+      if (ifMixin_leftParenthesis != 0)
+        _result["ifMixin_leftParenthesis"] = ifMixin_leftParenthesis;
       if (ifStatement_thenStatement != null)
         _result["ifStatement_thenStatement"] =
             ifStatement_thenStatement.toJson();
       if (ifMixin_ifKeyword != 0)
         _result["ifMixin_ifKeyword"] = ifMixin_ifKeyword;
-      if (ifMixin_leftParenthesis != 0)
-        _result["ifMixin_leftParenthesis"] = ifMixin_leftParenthesis;
       if (ifMixin_rightParenthesis != 0)
         _result["ifMixin_rightParenthesis"] = ifMixin_rightParenthesis;
     }
@@ -16170,6 +17285,11 @@
         _result["indexExpression_target"] = indexExpression_target.toJson();
       if (indexExpression_leftBracket != 0)
         _result["indexExpression_leftBracket"] = indexExpression_leftBracket;
+      if (indexExpression_elementType != null)
+        _result["indexExpression_elementType"] =
+            indexExpression_elementType.toJson();
+      if (indexExpression_period != 0)
+        _result["indexExpression_period"] = indexExpression_period;
       if (indexExpression_rightBracket != 0)
         _result["indexExpression_rightBracket"] = indexExpression_rightBracket;
       if (expression_type != null)
@@ -16226,26 +17346,6 @@
       if (mapLiteralEntry_value != null)
         _result["mapLiteralEntry_value"] = mapLiteralEntry_value.toJson();
     }
-    if (kind == idl.LinkedNodeKind.methodInvocation) {
-      if (methodInvocation_methodName != null)
-        _result["methodInvocation_methodName"] =
-            methodInvocation_methodName.toJson();
-      if (methodInvocation_operator != 0)
-        _result["methodInvocation_operator"] = methodInvocation_operator;
-      if (methodInvocation_target != null)
-        _result["methodInvocation_target"] = methodInvocation_target.toJson();
-      if (invocationExpression_invokeType != null)
-        _result["invocationExpression_invokeType"] =
-            invocationExpression_invokeType.toJson();
-      if (invocationExpression_typeArguments != null)
-        _result["invocationExpression_typeArguments"] =
-            invocationExpression_typeArguments.toJson();
-      if (expression_type != null)
-        _result["expression_type"] = expression_type.toJson();
-      if (invocationExpression_arguments != null)
-        _result["invocationExpression_arguments"] =
-            invocationExpression_arguments.toJson();
-    }
     if (kind == idl.LinkedNodeKind.namedExpression) {
       if (namedExpression_expression != null)
         _result["namedExpression_expression"] =
@@ -16255,6 +17355,22 @@
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
+    if (kind == idl.LinkedNodeKind.nativeClause) {
+      if (nativeClause_name != null)
+        _result["nativeClause_name"] = nativeClause_name.toJson();
+      if (nativeClause_nativeKeyword != 0)
+        _result["nativeClause_nativeKeyword"] = nativeClause_nativeKeyword;
+    }
+    if (kind == idl.LinkedNodeKind.nativeFunctionBody) {
+      if (nativeFunctionBody_stringLiteral != null)
+        _result["nativeFunctionBody_stringLiteral"] =
+            nativeFunctionBody_stringLiteral.toJson();
+      if (nativeFunctionBody_nativeKeyword != 0)
+        _result["nativeFunctionBody_nativeKeyword"] =
+            nativeFunctionBody_nativeKeyword;
+      if (nativeFunctionBody_semicolon != 0)
+        _result["nativeFunctionBody_semicolon"] = nativeFunctionBody_semicolon;
+    }
     if (kind == idl.LinkedNodeKind.parenthesizedExpression) {
       if (parenthesizedExpression_expression != null)
         _result["parenthesizedExpression_expression"] =
@@ -16274,6 +17390,9 @@
             postfixExpression_operand.toJson();
       if (postfixExpression_element != 0)
         _result["postfixExpression_element"] = postfixExpression_element;
+      if (postfixExpression_elementType != null)
+        _result["postfixExpression_elementType"] =
+            postfixExpression_elementType.toJson();
       if (postfixExpression_operator != 0)
         _result["postfixExpression_operator"] = postfixExpression_operator;
       if (expression_type != null)
@@ -16296,6 +17415,9 @@
         _result["prefixExpression_operand"] = prefixExpression_operand.toJson();
       if (prefixExpression_element != 0)
         _result["prefixExpression_element"] = prefixExpression_element;
+      if (prefixExpression_elementType != null)
+        _result["prefixExpression_elementType"] =
+            prefixExpression_elementType.toJson();
       if (prefixExpression_operator != 0)
         _result["prefixExpression_operator"] = prefixExpression_operator;
       if (expression_type != null)
@@ -16322,12 +17444,15 @@
       if (redirectingConstructorInvocation_constructorName != null)
         _result["redirectingConstructorInvocation_constructorName"] =
             redirectingConstructorInvocation_constructorName.toJson();
-      if (redirectingConstructorInvocation_period != 0)
-        _result["redirectingConstructorInvocation_period"] =
-            redirectingConstructorInvocation_period;
       if (redirectingConstructorInvocation_thisKeyword != 0)
         _result["redirectingConstructorInvocation_thisKeyword"] =
             redirectingConstructorInvocation_thisKeyword;
+      if (redirectingConstructorInvocation_elementType != null)
+        _result["redirectingConstructorInvocation_elementType"] =
+            redirectingConstructorInvocation_elementType.toJson();
+      if (redirectingConstructorInvocation_period != 0)
+        _result["redirectingConstructorInvocation_period"] =
+            redirectingConstructorInvocation_period;
     }
     if (kind == idl.LinkedNodeKind.returnStatement) {
       if (returnStatement_expression != null)
@@ -16355,12 +17480,15 @@
       if (superConstructorInvocation_constructorName != null)
         _result["superConstructorInvocation_constructorName"] =
             superConstructorInvocation_constructorName.toJson();
-      if (superConstructorInvocation_period != 0)
-        _result["superConstructorInvocation_period"] =
-            superConstructorInvocation_period;
       if (superConstructorInvocation_superKeyword != 0)
         _result["superConstructorInvocation_superKeyword"] =
             superConstructorInvocation_superKeyword;
+      if (superConstructorInvocation_elementType != null)
+        _result["superConstructorInvocation_elementType"] =
+            superConstructorInvocation_elementType.toJson();
+      if (superConstructorInvocation_period != 0)
+        _result["superConstructorInvocation_period"] =
+            superConstructorInvocation_period;
     }
     if (kind == idl.LinkedNodeKind.throwExpression) {
       if (throwExpression_expression != null)
@@ -16397,11 +17525,11 @@
             whileStatement_leftParenthesis;
       if (whileStatement_condition != null)
         _result["whileStatement_condition"] = whileStatement_condition.toJson();
+      if (whileStatement_whileKeyword != 0)
+        _result["whileStatement_whileKeyword"] = whileStatement_whileKeyword;
       if (whileStatement_rightParenthesis != 0)
         _result["whileStatement_rightParenthesis"] =
             whileStatement_rightParenthesis;
-      if (whileStatement_whileKeyword != 0)
-        _result["whileStatement_whileKeyword"] = whileStatement_whileKeyword;
     }
     if (kind == idl.LinkedNodeKind.yieldStatement) {
       if (yieldStatement_expression != null)
@@ -16409,10 +17537,10 @@
             yieldStatement_expression.toJson();
       if (yieldStatement_yieldKeyword != 0)
         _result["yieldStatement_yieldKeyword"] = yieldStatement_yieldKeyword;
-      if (yieldStatement_star != 0)
-        _result["yieldStatement_star"] = yieldStatement_star;
       if (yieldStatement_semicolon != 0)
         _result["yieldStatement_semicolon"] = yieldStatement_semicolon;
+      if (yieldStatement_star != 0)
+        _result["yieldStatement_star"] = yieldStatement_star;
     }
     if (kind == idl.LinkedNodeKind.booleanLiteral) {
       if (booleanLiteral_literal != 0)
@@ -16474,8 +17602,14 @@
     if (kind == idl.LinkedNodeKind.simpleIdentifier) {
       if (simpleIdentifier_element != 0)
         _result["simpleIdentifier_element"] = simpleIdentifier_element;
+      if (simpleIdentifier_elementType != null)
+        _result["simpleIdentifier_elementType"] =
+            simpleIdentifier_elementType.toJson();
       if (simpleIdentifier_token != 0)
         _result["simpleIdentifier_token"] = simpleIdentifier_token;
+      if (simpleIdentifier_isDeclaration != false)
+        _result["simpleIdentifier_isDeclaration"] =
+            simpleIdentifier_isDeclaration;
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
@@ -16507,16 +17641,225 @@
       if (expression_type != null)
         _result["expression_type"] = expression_type.toJson();
     }
-    if (kind == idl.LinkedNodeKind.comment) {
-      if (comment_tokens.isNotEmpty) _result["comment_tokens"] = comment_tokens;
-      if (comment_type != idl.LinkedNodeCommentType.block)
-        _result["comment_type"] = comment_type.toString().split('.')[1];
-    }
     return _result;
   }
 
   @override
   Map<String, Object> toMap() {
+    if (kind == idl.LinkedNodeKind.functionDeclaration) {
+      return {
+        "actualReturnType": actualReturnType,
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "functionDeclaration_functionExpression":
+            functionDeclaration_functionExpression,
+        "functionDeclaration_externalKeyword":
+            functionDeclaration_externalKeyword,
+        "functionDeclaration_returnType": functionDeclaration_returnType,
+        "functionDeclaration_propertyKeyword":
+            functionDeclaration_propertyKeyword,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
+        "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.functionExpression) {
+      return {
+        "actualReturnType": actualReturnType,
+        "functionExpression_body": functionExpression_body,
+        "functionExpression_formalParameters":
+            functionExpression_formalParameters,
+        "functionExpression_typeParameters": functionExpression_typeParameters,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.functionTypeAlias) {
+      return {
+        "actualReturnType": actualReturnType,
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "functionTypeAlias_formalParameters":
+            functionTypeAlias_formalParameters,
+        "functionTypeAlias_returnType": functionTypeAlias_returnType,
+        "functionTypeAlias_typeParameters": functionTypeAlias_typeParameters,
+        "typeAlias_typedefKeyword": typeAlias_typedefKeyword,
+        "typeAlias_semicolon": typeAlias_semicolon,
+        "typeAlias_hasSelfReference": typeAlias_hasSelfReference,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
+        "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+        "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.genericFunctionType) {
+      return {
+        "actualReturnType": actualReturnType,
+        "genericFunctionType_typeParameters":
+            genericFunctionType_typeParameters,
+        "genericFunctionType_functionKeyword":
+            genericFunctionType_functionKeyword,
+        "genericFunctionType_returnType": genericFunctionType_returnType,
+        "genericFunctionType_id": genericFunctionType_id,
+        "genericFunctionType_formalParameters":
+            genericFunctionType_formalParameters,
+        "genericFunctionType_question": genericFunctionType_question,
+        "genericFunctionType_type": genericFunctionType_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.methodDeclaration) {
+      return {
+        "actualReturnType": actualReturnType,
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "methodDeclaration_body": methodDeclaration_body,
+        "methodDeclaration_externalKeyword": methodDeclaration_externalKeyword,
+        "methodDeclaration_formalParameters":
+            methodDeclaration_formalParameters,
+        "methodDeclaration_operatorKeyword": methodDeclaration_operatorKeyword,
+        "methodDeclaration_returnType": methodDeclaration_returnType,
+        "methodDeclaration_modifierKeyword": methodDeclaration_modifierKeyword,
+        "methodDeclaration_propertyKeyword": methodDeclaration_propertyKeyword,
+        "methodDeclaration_actualProperty": methodDeclaration_actualProperty,
+        "methodDeclaration_typeParameters": methodDeclaration_typeParameters,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
+        "methodDeclaration_name": methodDeclaration_name,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.fieldFormalParameter) {
+      return {
+        "actualType": actualType,
+        "normalFormalParameter_metadata": normalFormalParameter_metadata,
+        "fieldFormalParameter_type": fieldFormalParameter_type,
+        "fieldFormalParameter_keyword": fieldFormalParameter_keyword,
+        "fieldFormalParameter_typeParameters":
+            fieldFormalParameter_typeParameters,
+        "fieldFormalParameter_thisKeyword": fieldFormalParameter_thisKeyword,
+        "fieldFormalParameter_formalParameters":
+            fieldFormalParameter_formalParameters,
+        "fieldFormalParameter_period": fieldFormalParameter_period,
+        "normalFormalParameter_requiredKeyword":
+            normalFormalParameter_requiredKeyword,
+        "normalFormalParameter_covariantKeyword":
+            normalFormalParameter_covariantKeyword,
+        "inheritsCovariant": inheritsCovariant,
+        "normalFormalParameter_identifier": normalFormalParameter_identifier,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
+        "normalFormalParameter_comment": normalFormalParameter_comment,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
+      return {
+        "actualType": actualType,
+        "normalFormalParameter_metadata": normalFormalParameter_metadata,
+        "functionTypedFormalParameter_formalParameters":
+            functionTypedFormalParameter_formalParameters,
+        "functionTypedFormalParameter_returnType":
+            functionTypedFormalParameter_returnType,
+        "functionTypedFormalParameter_typeParameters":
+            functionTypedFormalParameter_typeParameters,
+        "normalFormalParameter_requiredKeyword":
+            normalFormalParameter_requiredKeyword,
+        "normalFormalParameter_covariantKeyword":
+            normalFormalParameter_covariantKeyword,
+        "inheritsCovariant": inheritsCovariant,
+        "normalFormalParameter_identifier": normalFormalParameter_identifier,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
+        "normalFormalParameter_comment": normalFormalParameter_comment,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
+      return {
+        "actualType": actualType,
+        "normalFormalParameter_metadata": normalFormalParameter_metadata,
+        "simpleFormalParameter_type": simpleFormalParameter_type,
+        "simpleFormalParameter_keyword": simpleFormalParameter_keyword,
+        "normalFormalParameter_requiredKeyword":
+            normalFormalParameter_requiredKeyword,
+        "normalFormalParameter_covariantKeyword":
+            normalFormalParameter_covariantKeyword,
+        "inheritsCovariant": inheritsCovariant,
+        "normalFormalParameter_identifier": normalFormalParameter_identifier,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
+        "normalFormalParameter_comment": normalFormalParameter_comment,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+        "topLevelTypeInferenceError": topLevelTypeInferenceError,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.variableDeclaration) {
+      return {
+        "actualType": actualType,
+        "annotatedNode_comment": annotatedNode_comment,
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "variableDeclaration_initializer": variableDeclaration_initializer,
+        "variableDeclaration_equals": variableDeclaration_equals,
+        "variableDeclaration_name": variableDeclaration_name,
+        "inheritsCovariant": inheritsCovariant,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+        "topLevelTypeInferenceError": topLevelTypeInferenceError,
+        "variableDeclaration_declaration": variableDeclaration_declaration,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.binaryExpression) {
+      return {
+        "binaryExpression_invokeType": binaryExpression_invokeType,
+        "binaryExpression_leftOperand": binaryExpression_leftOperand,
+        "binaryExpression_element": binaryExpression_element,
+        "binaryExpression_rightOperand": binaryExpression_rightOperand,
+        "binaryExpression_elementType": binaryExpression_elementType,
+        "binaryExpression_operator": binaryExpression_operator,
+        "expression_type": expression_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.functionExpressionInvocation) {
+      return {
+        "invocationExpression_invokeType": invocationExpression_invokeType,
+        "functionExpressionInvocation_function":
+            functionExpressionInvocation_function,
+        "invocationExpression_typeArguments":
+            invocationExpression_typeArguments,
+        "expression_type": expression_type,
+        "invocationExpression_arguments": invocationExpression_arguments,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.methodInvocation) {
+      return {
+        "invocationExpression_invokeType": invocationExpression_invokeType,
+        "methodInvocation_methodName": methodInvocation_methodName,
+        "methodInvocation_operator": methodInvocation_operator,
+        "methodInvocation_target": methodInvocation_target,
+        "invocationExpression_typeArguments":
+            invocationExpression_typeArguments,
+        "expression_type": expression_type,
+        "invocationExpression_arguments": invocationExpression_arguments,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
     if (kind == idl.LinkedNodeKind.adjacentStrings) {
       return {
         "adjacentStrings_strings": adjacentStrings_strings,
@@ -16552,12 +17895,23 @@
         "kind": kind,
       };
     }
+    if (kind == idl.LinkedNodeKind.comment) {
+      return {
+        "comment_references": comment_references,
+        "comment_tokens": comment_tokens,
+        "comment_type": comment_type,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
     if (kind == idl.LinkedNodeKind.compilationUnit) {
       return {
         "compilationUnit_declarations": compilationUnit_declarations,
         "compilationUnit_scriptTag": compilationUnit_scriptTag,
         "compilationUnit_beginToken": compilationUnit_beginToken,
         "compilationUnit_endToken": compilationUnit_endToken,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
         "compilationUnit_directives": compilationUnit_directives,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -16573,15 +17927,17 @@
         "constructorDeclaration_constKeyword":
             constructorDeclaration_constKeyword,
         "constructorDeclaration_name": constructorDeclaration_name,
+        "constructorDeclaration_factoryKeyword":
+            constructorDeclaration_factoryKeyword,
         "constructorDeclaration_parameters": constructorDeclaration_parameters,
         "constructorDeclaration_externalKeyword":
             constructorDeclaration_externalKeyword,
-        "constructorDeclaration_factoryKeyword":
-            constructorDeclaration_factoryKeyword,
         "constructorDeclaration_period": constructorDeclaration_period,
         "constructorDeclaration_separator": constructorDeclaration_separator,
         "constructorDeclaration_redirectedConstructor":
             constructorDeclaration_redirectedConstructor,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
         "constructorDeclaration_returnType": constructorDeclaration_returnType,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -16600,8 +17956,10 @@
         "annotatedNode_comment": annotatedNode_comment,
         "annotatedNode_metadata": annotatedNode_metadata,
         "enumDeclaration_enumKeyword": enumDeclaration_enumKeyword,
-        "enumDeclaration_leftBracket": enumDeclaration_leftBracket,
         "enumDeclaration_rightBracket": enumDeclaration_rightBracket,
+        "enumDeclaration_leftBracket": enumDeclaration_leftBracket,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
         "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -16611,10 +17969,10 @@
       return {
         "formalParameterList_parameters": formalParameterList_parameters,
         "formalParameterList_leftDelimiter": formalParameterList_leftDelimiter,
-        "formalParameterList_leftParenthesis":
-            formalParameterList_leftParenthesis,
         "formalParameterList_rightDelimiter":
             formalParameterList_rightDelimiter,
+        "formalParameterList_leftParenthesis":
+            formalParameterList_leftParenthesis,
         "formalParameterList_rightParenthesis":
             formalParameterList_rightParenthesis,
         "isSynthetic": isSynthetic,
@@ -16671,14 +18029,13 @@
         "annotatedNode_comment": annotatedNode_comment,
         "annotatedNode_metadata": annotatedNode_metadata,
         "directive_keyword": directive_keyword,
-        "namespaceDirective_semicolon": namespaceDirective_semicolon,
         "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
+        "directive_semicolon": directive_semicolon,
         "namespaceDirective_configurations": namespaceDirective_configurations,
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "isSynthetic": isSynthetic,
         "kind": kind,
-        "namespaceDirective_selectedUriContent":
-            namespaceDirective_selectedUriContent,
+        "namespaceDirective_selectedUri": namespaceDirective_selectedUri,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
       };
     }
@@ -16691,14 +18048,13 @@
         "importDirective_asKeyword": importDirective_asKeyword,
         "importDirective_deferredKeyword": importDirective_deferredKeyword,
         "directive_keyword": directive_keyword,
-        "namespaceDirective_semicolon": namespaceDirective_semicolon,
         "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
+        "directive_semicolon": directive_semicolon,
         "namespaceDirective_configurations": namespaceDirective_configurations,
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "isSynthetic": isSynthetic,
         "kind": kind,
-        "namespaceDirective_selectedUriContent":
-            namespaceDirective_selectedUriContent,
+        "namespaceDirective_selectedUri": namespaceDirective_selectedUri,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
       };
     }
@@ -16745,8 +18101,8 @@
         "switchStatement_members": switchStatement_members,
         "switchStatement_leftParenthesis": switchStatement_leftParenthesis,
         "switchStatement_expression": switchStatement_expression,
-        "switchStatement_rightParenthesis": switchStatement_rightParenthesis,
         "switchStatement_switchKeyword": switchStatement_switchKeyword,
+        "switchStatement_rightParenthesis": switchStatement_rightParenthesis,
         "switchStatement_leftBracket": switchStatement_leftBracket,
         "switchStatement_rightBracket": switchStatement_rightBracket,
         "isSynthetic": isSynthetic,
@@ -16789,6 +18145,8 @@
         "annotatedNode_metadata": annotatedNode_metadata,
         "variableDeclarationList_type": variableDeclarationList_type,
         "variableDeclarationList_keyword": variableDeclarationList_keyword,
+        "variableDeclarationList_lateKeyword":
+            variableDeclarationList_lateKeyword,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -16808,6 +18166,7 @@
         "classDeclaration_extendsClause": classDeclaration_extendsClause,
         "classDeclaration_abstractKeyword": classDeclaration_abstractKeyword,
         "classDeclaration_withClause": classDeclaration_withClause,
+        "classDeclaration_nativeClause": classDeclaration_nativeClause,
         "classDeclaration_classKeyword": classDeclaration_classKeyword,
         "classOrMixinDeclaration_rightBracket":
             classOrMixinDeclaration_rightBracket,
@@ -16819,9 +18178,12 @@
         "classOrMixinDeclaration_members": classOrMixinDeclaration_members,
         "classOrMixinDeclaration_typeParameters":
             classOrMixinDeclaration_typeParameters,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
         "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
         "isSynthetic": isSynthetic,
         "kind": kind,
+        "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
       };
     }
     if (kind == idl.LinkedNodeKind.classTypeAlias) {
@@ -16836,9 +18198,12 @@
         "typeAlias_typedefKeyword": typeAlias_typedefKeyword,
         "typeAlias_semicolon": typeAlias_semicolon,
         "classTypeAlias_implementsClause": classTypeAlias_implementsClause,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
         "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
         "isSynthetic": isSynthetic,
         "kind": kind,
+        "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
       };
     }
     if (kind == idl.LinkedNodeKind.declaredIdentifier) {
@@ -16867,41 +18232,8 @@
         "annotatedNode_metadata": annotatedNode_metadata,
         "fieldDeclaration_fields": fieldDeclaration_fields,
         "fieldDeclaration_covariantKeyword": fieldDeclaration_covariantKeyword,
-        "fieldDeclaration_semicolon": fieldDeclaration_semicolon,
         "fieldDeclaration_staticKeyword": fieldDeclaration_staticKeyword,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
-    if (kind == idl.LinkedNodeKind.functionDeclaration) {
-      return {
-        "annotatedNode_comment": annotatedNode_comment,
-        "annotatedNode_metadata": annotatedNode_metadata,
-        "functionDeclaration_functionExpression":
-            functionDeclaration_functionExpression,
-        "functionDeclaration_externalKeyword":
-            functionDeclaration_externalKeyword,
-        "functionDeclaration_returnType": functionDeclaration_returnType,
-        "functionDeclaration_propertyKeyword":
-            functionDeclaration_propertyKeyword,
-        "functionDeclaration_returnType2": functionDeclaration_returnType2,
-        "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
-    if (kind == idl.LinkedNodeKind.functionTypeAlias) {
-      return {
-        "annotatedNode_comment": annotatedNode_comment,
-        "annotatedNode_metadata": annotatedNode_metadata,
-        "functionTypeAlias_formalParameters":
-            functionTypeAlias_formalParameters,
-        "functionTypeAlias_returnType": functionTypeAlias_returnType,
-        "functionTypeAlias_typeParameters": functionTypeAlias_typeParameters,
-        "typeAlias_typedefKeyword": typeAlias_typedefKeyword,
-        "typeAlias_semicolon": typeAlias_semicolon,
-        "functionTypeAlias_returnType2": functionTypeAlias_returnType2,
-        "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
+        "fieldDeclaration_semicolon": fieldDeclaration_semicolon,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -16915,9 +18247,13 @@
         "genericTypeAlias_equals": genericTypeAlias_equals,
         "typeAlias_typedefKeyword": typeAlias_typedefKeyword,
         "typeAlias_semicolon": typeAlias_semicolon,
+        "typeAlias_hasSelfReference": typeAlias_hasSelfReference,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
         "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
         "isSynthetic": isSynthetic,
         "kind": kind,
+        "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
       };
     }
     if (kind == idl.LinkedNodeKind.libraryDirective) {
@@ -16926,27 +18262,7 @@
         "annotatedNode_metadata": annotatedNode_metadata,
         "libraryDirective_name": libraryDirective_name,
         "directive_keyword": directive_keyword,
-        "namespaceDirective_semicolon": namespaceDirective_semicolon,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
-    if (kind == idl.LinkedNodeKind.methodDeclaration) {
-      return {
-        "annotatedNode_comment": annotatedNode_comment,
-        "annotatedNode_metadata": annotatedNode_metadata,
-        "methodDeclaration_body": methodDeclaration_body,
-        "methodDeclaration_externalKeyword": methodDeclaration_externalKeyword,
-        "methodDeclaration_formalParameters":
-            methodDeclaration_formalParameters,
-        "methodDeclaration_returnType": methodDeclaration_returnType,
-        "methodDeclaration_modifierKeyword": methodDeclaration_modifierKeyword,
-        "methodDeclaration_operatorKeyword": methodDeclaration_operatorKeyword,
-        "methodDeclaration_propertyKeyword": methodDeclaration_propertyKeyword,
-        "methodDeclaration_actualProperty": methodDeclaration_actualProperty,
-        "methodDeclaration_returnType2": methodDeclaration_returnType2,
-        "methodDeclaration_typeParameters": methodDeclaration_typeParameters,
-        "methodDeclaration_name": methodDeclaration_name,
+        "directive_semicolon": directive_semicolon,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -16966,9 +18282,14 @@
         "classOrMixinDeclaration_members": classOrMixinDeclaration_members,
         "classOrMixinDeclaration_typeParameters":
             classOrMixinDeclaration_typeParameters,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
         "namedCompilationUnitMember_name": namedCompilationUnitMember_name,
         "isSynthetic": isSynthetic,
         "kind": kind,
+        "mixinDeclaration_superInvokedNames":
+            mixinDeclaration_superInvokedNames,
+        "simplyBoundable_isSimplyBounded": simplyBoundable_isSimplyBounded,
       };
     }
     if (kind == idl.LinkedNodeKind.partDirective) {
@@ -16976,13 +18297,11 @@
         "annotatedNode_comment": annotatedNode_comment,
         "annotatedNode_metadata": annotatedNode_metadata,
         "directive_keyword": directive_keyword,
-        "namespaceDirective_semicolon": namespaceDirective_semicolon,
         "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
+        "directive_semicolon": directive_semicolon,
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "isSynthetic": isSynthetic,
         "kind": kind,
-        "namespaceDirective_selectedUriContent":
-            namespaceDirective_selectedUriContent,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
       };
     }
@@ -16991,14 +18310,12 @@
         "annotatedNode_comment": annotatedNode_comment,
         "annotatedNode_metadata": annotatedNode_metadata,
         "partOfDirective_libraryName": partOfDirective_libraryName,
-        "partOfDirective_semicolon": partOfDirective_semicolon,
         "partOfDirective_uri": partOfDirective_uri,
         "partOfDirective_ofKeyword": partOfDirective_ofKeyword,
         "directive_keyword": directive_keyword,
+        "directive_semicolon": directive_semicolon,
         "isSynthetic": isSynthetic,
         "kind": kind,
-        "namespaceDirective_selectedUriContent":
-            namespaceDirective_selectedUriContent,
       };
     }
     if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
@@ -17020,76 +18337,9 @@
         "typeParameter_bound": typeParameter_bound,
         "typeParameter_extendsKeyword": typeParameter_extendsKeyword,
         "typeParameter_name": typeParameter_name,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
-    if (kind == idl.LinkedNodeKind.variableDeclaration) {
-      return {
-        "annotatedNode_comment": annotatedNode_comment,
-        "annotatedNode_metadata": annotatedNode_metadata,
-        "variableDeclaration_initializer": variableDeclaration_initializer,
-        "variableDeclaration_equals": variableDeclaration_equals,
-        "variableDeclaration_name": variableDeclaration_name,
-        "variableDeclaration_type2": variableDeclaration_type2,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-        "variableDeclaration_declaration": variableDeclaration_declaration,
-      };
-    }
-    if (kind == idl.LinkedNodeKind.fieldFormalParameter) {
-      return {
-        "normalFormalParameter_metadata": normalFormalParameter_metadata,
-        "fieldFormalParameter_type": fieldFormalParameter_type,
-        "fieldFormalParameter_keyword": fieldFormalParameter_keyword,
-        "fieldFormalParameter_typeParameters":
-            fieldFormalParameter_typeParameters,
-        "fieldFormalParameter_formalParameters":
-            fieldFormalParameter_formalParameters,
-        "fieldFormalParameter_period": fieldFormalParameter_period,
-        "fieldFormalParameter_thisKeyword": fieldFormalParameter_thisKeyword,
-        "normalFormalParameter_covariantKeyword":
-            normalFormalParameter_covariantKeyword,
-        "fieldFormalParameter_type2": fieldFormalParameter_type2,
-        "normalFormalParameter_isCovariant": normalFormalParameter_isCovariant,
-        "normalFormalParameter_identifier": normalFormalParameter_identifier,
-        "formalParameter_kind": formalParameter_kind,
-        "normalFormalParameter_comment": normalFormalParameter_comment,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
-    if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
-      return {
-        "normalFormalParameter_metadata": normalFormalParameter_metadata,
-        "functionTypedFormalParameter_formalParameters":
-            functionTypedFormalParameter_formalParameters,
-        "functionTypedFormalParameter_returnType":
-            functionTypedFormalParameter_returnType,
-        "functionTypedFormalParameter_typeParameters":
-            functionTypedFormalParameter_typeParameters,
-        "normalFormalParameter_covariantKeyword":
-            normalFormalParameter_covariantKeyword,
-        "normalFormalParameter_isCovariant": normalFormalParameter_isCovariant,
-        "normalFormalParameter_identifier": normalFormalParameter_identifier,
-        "formalParameter_kind": formalParameter_kind,
-        "normalFormalParameter_comment": normalFormalParameter_comment,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
-    if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
-      return {
-        "normalFormalParameter_metadata": normalFormalParameter_metadata,
-        "simpleFormalParameter_type": simpleFormalParameter_type,
-        "simpleFormalParameter_keyword": simpleFormalParameter_keyword,
-        "normalFormalParameter_covariantKeyword":
-            normalFormalParameter_covariantKeyword,
-        "simpleFormalParameter_type2": simpleFormalParameter_type2,
-        "normalFormalParameter_isCovariant": normalFormalParameter_isCovariant,
-        "normalFormalParameter_identifier": normalFormalParameter_identifier,
-        "formalParameter_kind": formalParameter_kind,
-        "normalFormalParameter_comment": normalFormalParameter_comment,
+        "typeParameter_defaultType": typeParameter_defaultType,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -17120,6 +18370,8 @@
         "annotation_arguments": annotation_arguments,
         "annotation_atSign": annotation_atSign,
         "annotation_constructorName": annotation_constructorName,
+        "annotation_element": annotation_element,
+        "annotation_elementType": annotation_elementType,
         "annotation_name": annotation_name,
         "annotation_period": annotation_period,
         "isSynthetic": isSynthetic,
@@ -17141,8 +18393,8 @@
         "assertInitializer_condition": assertInitializer_condition,
         "assertInitializer_assertKeyword": assertInitializer_assertKeyword,
         "assertInitializer_message": assertInitializer_message,
-        "assertInitializer_comma": assertInitializer_comma,
         "assertInitializer_leftParenthesis": assertInitializer_leftParenthesis,
+        "assertInitializer_comma": assertInitializer_comma,
         "assertInitializer_rightParenthesis":
             assertInitializer_rightParenthesis,
         "isSynthetic": isSynthetic,
@@ -17154,8 +18406,8 @@
         "assertStatement_condition": assertStatement_condition,
         "assertStatement_assertKeyword": assertStatement_assertKeyword,
         "assertStatement_message": assertStatement_message,
-        "assertStatement_comma": assertStatement_comma,
         "assertStatement_leftParenthesis": assertStatement_leftParenthesis,
+        "assertStatement_comma": assertStatement_comma,
         "assertStatement_rightParenthesis": assertStatement_rightParenthesis,
         "assertStatement_semicolon": assertStatement_semicolon,
         "isSynthetic": isSynthetic,
@@ -17168,6 +18420,7 @@
         "assignmentExpression_element": assignmentExpression_element,
         "assignmentExpression_rightHandSide":
             assignmentExpression_rightHandSide,
+        "assignmentExpression_elementType": assignmentExpression_elementType,
         "assignmentExpression_operator": assignmentExpression_operator,
         "expression_type": expression_type,
         "isSynthetic": isSynthetic,
@@ -17183,18 +18436,6 @@
         "kind": kind,
       };
     }
-    if (kind == idl.LinkedNodeKind.binaryExpression) {
-      return {
-        "binaryExpression_leftOperand": binaryExpression_leftOperand,
-        "binaryExpression_element": binaryExpression_element,
-        "binaryExpression_rightOperand": binaryExpression_rightOperand,
-        "binaryExpression_operator": binaryExpression_operator,
-        "binaryExpression_invokeType": binaryExpression_invokeType,
-        "expression_type": expression_type,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
     if (kind == idl.LinkedNodeKind.blockFunctionBody) {
       return {
         "blockFunctionBody_block": blockFunctionBody_block,
@@ -17218,9 +18459,9 @@
         "catchClause_body": catchClause_body,
         "catchClause_catchKeyword": catchClause_catchKeyword,
         "catchClause_exceptionParameter": catchClause_exceptionParameter,
+        "catchClause_leftParenthesis": catchClause_leftParenthesis,
         "catchClause_exceptionType": catchClause_exceptionType,
         "catchClause_comma": catchClause_comma,
-        "catchClause_leftParenthesis": catchClause_leftParenthesis,
         "catchClause_onKeyword": catchClause_onKeyword,
         "catchClause_rightParenthesis": catchClause_rightParenthesis,
         "catchClause_stackTraceParameter": catchClause_stackTraceParameter,
@@ -17228,6 +18469,14 @@
         "kind": kind,
       };
     }
+    if (kind == idl.LinkedNodeKind.commentReference) {
+      return {
+        "commentReference_identifier": commentReference_identifier,
+        "commentReference_newKeyword": commentReference_newKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
     if (kind == idl.LinkedNodeKind.conditionalExpression) {
       return {
         "conditionalExpression_condition": conditionalExpression_condition,
@@ -17247,9 +18496,9 @@
         "configuration_name": configuration_name,
         "configuration_ifKeyword": configuration_ifKeyword,
         "configuration_value": configuration_value,
+        "configuration_rightParenthesis": configuration_rightParenthesis,
         "configuration_uri": configuration_uri,
         "configuration_leftParenthesis": configuration_leftParenthesis,
-        "configuration_rightParenthesis": configuration_rightParenthesis,
         "configuration_equalToken": configuration_equalToken,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -17263,10 +18512,10 @@
             constructorFieldInitializer_equals,
         "constructorFieldInitializer_fieldName":
             constructorFieldInitializer_fieldName,
-        "constructorFieldInitializer_period":
-            constructorFieldInitializer_period,
         "constructorFieldInitializer_thisKeyword":
             constructorFieldInitializer_thisKeyword,
+        "constructorFieldInitializer_period":
+            constructorFieldInitializer_period,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -17276,6 +18525,7 @@
         "constructorName_name": constructorName_name,
         "constructorName_element": constructorName_element,
         "constructorName_type": constructorName_type,
+        "constructorName_elementType": constructorName_elementType,
         "constructorName_period": constructorName_period,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -17296,7 +18546,9 @@
             defaultFormalParameter_defaultValue,
         "defaultFormalParameter_separator": defaultFormalParameter_separator,
         "defaultFormalParameter_parameter": defaultFormalParameter_parameter,
-        "defaultFormalParameter_isNamed": defaultFormalParameter_isNamed,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
+        "defaultFormalParameter_kind": defaultFormalParameter_kind,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -17306,8 +18558,8 @@
         "doStatement_body": doStatement_body,
         "doStatement_leftParenthesis": doStatement_leftParenthesis,
         "doStatement_condition": doStatement_condition,
-        "doStatement_rightParenthesis": doStatement_rightParenthesis,
         "doStatement_doKeyword": doStatement_doKeyword,
+        "doStatement_rightParenthesis": doStatement_rightParenthesis,
         "doStatement_semicolon": doStatement_semicolon,
         "doStatement_whileKeyword": doStatement_whileKeyword,
         "isSynthetic": isSynthetic,
@@ -17318,8 +18570,8 @@
       return {
         "expressionFunctionBody_expression": expressionFunctionBody_expression,
         "expressionFunctionBody_arrow": expressionFunctionBody_arrow,
-        "expressionFunctionBody_keyword": expressionFunctionBody_keyword,
         "expressionFunctionBody_semicolon": expressionFunctionBody_semicolon,
+        "expressionFunctionBody_keyword": expressionFunctionBody_keyword,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -17365,8 +18617,8 @@
         "forMixin_forLoopParts": forMixin_forLoopParts,
         "forMixin_awaitKeyword": forMixin_awaitKeyword,
         "forElement_body": forElement_body,
-        "forMixin_forKeyword": forMixin_forKeyword,
         "forMixin_leftParenthesis": forMixin_leftParenthesis,
+        "forMixin_forKeyword": forMixin_forKeyword,
         "forMixin_rightParenthesis": forMixin_rightParenthesis,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -17377,8 +18629,8 @@
         "forMixin_forLoopParts": forMixin_forLoopParts,
         "forMixin_awaitKeyword": forMixin_awaitKeyword,
         "forStatement_body": forStatement_body,
-        "forMixin_forKeyword": forMixin_forKeyword,
         "forMixin_leftParenthesis": forMixin_leftParenthesis,
+        "forMixin_forKeyword": forMixin_forKeyword,
         "forMixin_rightParenthesis": forMixin_rightParenthesis,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -17416,51 +18668,13 @@
         "kind": kind,
       };
     }
-    if (kind == idl.LinkedNodeKind.functionExpression) {
-      return {
-        "functionExpression_body": functionExpression_body,
-        "functionExpression_formalParameters":
-            functionExpression_formalParameters,
-        "functionExpression_typeParameters": functionExpression_typeParameters,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
-    if (kind == idl.LinkedNodeKind.functionExpressionInvocation) {
-      return {
-        "functionExpressionInvocation_function":
-            functionExpressionInvocation_function,
-        "invocationExpression_invokeType": invocationExpression_invokeType,
-        "invocationExpression_typeArguments":
-            invocationExpression_typeArguments,
-        "expression_type": expression_type,
-        "invocationExpression_arguments": invocationExpression_arguments,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
-    if (kind == idl.LinkedNodeKind.genericFunctionType) {
-      return {
-        "genericFunctionType_typeParameters":
-            genericFunctionType_typeParameters,
-        "genericFunctionType_functionKeyword":
-            genericFunctionType_functionKeyword,
-        "genericFunctionType_returnType": genericFunctionType_returnType,
-        "genericFunctionType_formalParameters":
-            genericFunctionType_formalParameters,
-        "genericFunctionType_question": genericFunctionType_question,
-        "genericFunctionType_returnType2": genericFunctionType_returnType2,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
     if (kind == idl.LinkedNodeKind.ifElement) {
       return {
         "ifMixin_condition": ifMixin_condition,
         "ifMixin_elseKeyword": ifMixin_elseKeyword,
+        "ifMixin_leftParenthesis": ifMixin_leftParenthesis,
         "ifElement_thenElement": ifElement_thenElement,
         "ifMixin_ifKeyword": ifMixin_ifKeyword,
-        "ifMixin_leftParenthesis": ifMixin_leftParenthesis,
         "ifMixin_rightParenthesis": ifMixin_rightParenthesis,
         "ifElement_elseElement": ifElement_elseElement,
         "isSynthetic": isSynthetic,
@@ -17472,9 +18686,9 @@
         "ifMixin_condition": ifMixin_condition,
         "ifMixin_elseKeyword": ifMixin_elseKeyword,
         "ifStatement_elseStatement": ifStatement_elseStatement,
+        "ifMixin_leftParenthesis": ifMixin_leftParenthesis,
         "ifStatement_thenStatement": ifStatement_thenStatement,
         "ifMixin_ifKeyword": ifMixin_ifKeyword,
-        "ifMixin_leftParenthesis": ifMixin_leftParenthesis,
         "ifMixin_rightParenthesis": ifMixin_rightParenthesis,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -17486,6 +18700,8 @@
         "indexExpression_element": indexExpression_element,
         "indexExpression_target": indexExpression_target,
         "indexExpression_leftBracket": indexExpression_leftBracket,
+        "indexExpression_elementType": indexExpression_elementType,
+        "indexExpression_period": indexExpression_period,
         "indexExpression_rightBracket": indexExpression_rightBracket,
         "expression_type": expression_type,
         "isSynthetic": isSynthetic,
@@ -17547,20 +18763,6 @@
         "kind": kind,
       };
     }
-    if (kind == idl.LinkedNodeKind.methodInvocation) {
-      return {
-        "methodInvocation_methodName": methodInvocation_methodName,
-        "methodInvocation_operator": methodInvocation_operator,
-        "methodInvocation_target": methodInvocation_target,
-        "invocationExpression_invokeType": invocationExpression_invokeType,
-        "invocationExpression_typeArguments":
-            invocationExpression_typeArguments,
-        "expression_type": expression_type,
-        "invocationExpression_arguments": invocationExpression_arguments,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
     if (kind == idl.LinkedNodeKind.namedExpression) {
       return {
         "namedExpression_expression": namedExpression_expression,
@@ -17570,6 +18772,23 @@
         "kind": kind,
       };
     }
+    if (kind == idl.LinkedNodeKind.nativeClause) {
+      return {
+        "nativeClause_name": nativeClause_name,
+        "nativeClause_nativeKeyword": nativeClause_nativeKeyword,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
+    if (kind == idl.LinkedNodeKind.nativeFunctionBody) {
+      return {
+        "nativeFunctionBody_stringLiteral": nativeFunctionBody_stringLiteral,
+        "nativeFunctionBody_nativeKeyword": nativeFunctionBody_nativeKeyword,
+        "nativeFunctionBody_semicolon": nativeFunctionBody_semicolon,
+        "isSynthetic": isSynthetic,
+        "kind": kind,
+      };
+    }
     if (kind == idl.LinkedNodeKind.parenthesizedExpression) {
       return {
         "parenthesizedExpression_expression":
@@ -17587,6 +18806,7 @@
       return {
         "postfixExpression_operand": postfixExpression_operand,
         "postfixExpression_element": postfixExpression_element,
+        "postfixExpression_elementType": postfixExpression_elementType,
         "postfixExpression_operator": postfixExpression_operator,
         "expression_type": expression_type,
         "isSynthetic": isSynthetic,
@@ -17607,6 +18827,7 @@
       return {
         "prefixExpression_operand": prefixExpression_operand,
         "prefixExpression_element": prefixExpression_element,
+        "prefixExpression_elementType": prefixExpression_elementType,
         "prefixExpression_operator": prefixExpression_operator,
         "expression_type": expression_type,
         "isSynthetic": isSynthetic,
@@ -17631,10 +18852,12 @@
             redirectingConstructorInvocation_element,
         "redirectingConstructorInvocation_constructorName":
             redirectingConstructorInvocation_constructorName,
-        "redirectingConstructorInvocation_period":
-            redirectingConstructorInvocation_period,
         "redirectingConstructorInvocation_thisKeyword":
             redirectingConstructorInvocation_thisKeyword,
+        "redirectingConstructorInvocation_elementType":
+            redirectingConstructorInvocation_elementType,
+        "redirectingConstructorInvocation_period":
+            redirectingConstructorInvocation_period,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -17664,9 +18887,11 @@
             superConstructorInvocation_element,
         "superConstructorInvocation_constructorName":
             superConstructorInvocation_constructorName,
-        "superConstructorInvocation_period": superConstructorInvocation_period,
         "superConstructorInvocation_superKeyword":
             superConstructorInvocation_superKeyword,
+        "superConstructorInvocation_elementType":
+            superConstructorInvocation_elementType,
+        "superConstructorInvocation_period": superConstructorInvocation_period,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -17705,8 +18930,8 @@
         "whileStatement_body": whileStatement_body,
         "whileStatement_leftParenthesis": whileStatement_leftParenthesis,
         "whileStatement_condition": whileStatement_condition,
-        "whileStatement_rightParenthesis": whileStatement_rightParenthesis,
         "whileStatement_whileKeyword": whileStatement_whileKeyword,
+        "whileStatement_rightParenthesis": whileStatement_rightParenthesis,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -17715,8 +18940,8 @@
       return {
         "yieldStatement_expression": yieldStatement_expression,
         "yieldStatement_yieldKeyword": yieldStatement_yieldKeyword,
-        "yieldStatement_star": yieldStatement_star,
         "yieldStatement_semicolon": yieldStatement_semicolon,
+        "yieldStatement_star": yieldStatement_star,
         "isSynthetic": isSynthetic,
         "kind": kind,
       };
@@ -17796,7 +19021,9 @@
     if (kind == idl.LinkedNodeKind.simpleIdentifier) {
       return {
         "simpleIdentifier_element": simpleIdentifier_element,
+        "simpleIdentifier_elementType": simpleIdentifier_elementType,
         "simpleIdentifier_token": simpleIdentifier_token,
+        "simpleIdentifier_isDeclaration": simpleIdentifier_isDeclaration,
         "expression_type": expression_type,
         "isSynthetic": isSynthetic,
         "kind": kind,
@@ -17836,14 +19063,6 @@
         "kind": kind,
       };
     }
-    if (kind == idl.LinkedNodeKind.comment) {
-      return {
-        "comment_tokens": comment_tokens,
-        "comment_type": comment_type,
-        "isSynthetic": isSynthetic,
-        "kind": kind,
-      };
-    }
     throw StateError("Unexpected $kind");
   }
 
@@ -17861,7 +19080,7 @@
   List<LinkedNodeLibraryBuilder> get libraries =>
       _libraries ??= <LinkedNodeLibraryBuilder>[];
 
-  void set libraries(List<LinkedNodeLibraryBuilder> value) {
+  set libraries(List<LinkedNodeLibraryBuilder> value) {
     this._libraries = value;
   }
 
@@ -17869,7 +19088,7 @@
   LinkedNodeReferencesBuilder get references => _references;
 
   /// The shared list of references used in the [libraries].
-  void set references(LinkedNodeReferencesBuilder value) {
+  set references(LinkedNodeReferencesBuilder value) {
     this._references = value;
   }
 
@@ -17879,17 +19098,13 @@
       : _libraries = libraries,
         _references = references;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _libraries?.forEach((b) => b.flushInformative());
     _references?.flushInformative();
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addBool(this._references != null);
     this._references?.collectApiSignature(signature);
@@ -18003,7 +19218,7 @@
   @override
   List<int> get exports => _exports ??= <int>[];
 
-  void set exports(List<int> value) {
+  set exports(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._exports = value;
   }
@@ -18011,14 +19226,14 @@
   @override
   String get name => _name ??= '';
 
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
   @override
   int get nameLength => _nameLength ??= 0;
 
-  void set nameLength(int value) {
+  set nameLength(int value) {
     assert(value == null || value >= 0);
     this._nameLength = value;
   }
@@ -18026,7 +19241,7 @@
   @override
   int get nameOffset => _nameOffset ??= 0;
 
-  void set nameOffset(int value) {
+  set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
   }
@@ -18034,14 +19249,14 @@
   @override
   List<LinkedNodeUnitBuilder> get units => _units ??= <LinkedNodeUnitBuilder>[];
 
-  void set units(List<LinkedNodeUnitBuilder> value) {
+  set units(List<LinkedNodeUnitBuilder> value) {
     this._units = value;
   }
 
   @override
   String get uriStr => _uriStr ??= '';
 
-  void set uriStr(String value) {
+  set uriStr(String value) {
     this._uriStr = value;
   }
 
@@ -18059,16 +19274,12 @@
         _units = units,
         _uriStr = uriStr;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _units?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._uriStr ?? '');
     if (this._units == null) {
@@ -18233,14 +19444,14 @@
   @override
   List<String> get name => _name ??= <String>[];
 
-  void set name(List<String> value) {
+  set name(List<String> value) {
     this._name = value;
   }
 
   @override
   List<int> get parent => _parent ??= <int>[];
 
-  void set parent(List<int> value) {
+  set parent(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._parent = value;
   }
@@ -18249,14 +19460,10 @@
       : _name = name,
         _parent = parent;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._parent == null) {
       signature.addInt(0);
@@ -18354,45 +19561,63 @@
 class LinkedNodeTypeBuilder extends Object
     with _LinkedNodeTypeMixin
     implements idl.LinkedNodeType {
-  List<int> _functionFormalParameters;
+  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;
+  idl.EntityRefNullabilitySuffix _nullabilitySuffix;
+  int _typeParameterElement;
+  int _typeParameterId;
 
   @override
-  List<int> get functionFormalParameters =>
-      _functionFormalParameters ??= <int>[];
+  List<LinkedNodeTypeFormalParameterBuilder> get functionFormalParameters =>
+      _functionFormalParameters ??= <LinkedNodeTypeFormalParameterBuilder>[];
 
-  /// References to [LinkedNodeReferences].
-  void set functionFormalParameters(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+  set functionFormalParameters(
+      List<LinkedNodeTypeFormalParameterBuilder> value) {
     this._functionFormalParameters = value;
   }
 
   @override
   LinkedNodeTypeBuilder get functionReturnType => _functionReturnType;
 
-  void set functionReturnType(LinkedNodeTypeBuilder value) {
+  set functionReturnType(LinkedNodeTypeBuilder value) {
     this._functionReturnType = value;
   }
 
   @override
-  List<int> get functionTypeParameters => _functionTypeParameters ??= <int>[];
+  List<LinkedNodeTypeTypeParameterBuilder> get functionTypeParameters =>
+      _functionTypeParameters ??= <LinkedNodeTypeTypeParameterBuilder>[];
 
-  /// References to [LinkedNodeReferences].
-  void set functionTypeParameters(List<int> value) {
-    assert(value == null || value.every((e) => e >= 0));
+  set functionTypeParameters(List<LinkedNodeTypeTypeParameterBuilder> value) {
     this._functionTypeParameters = value;
   }
 
   @override
+  int get genericTypeAliasReference => _genericTypeAliasReference ??= 0;
+
+  set genericTypeAliasReference(int value) {
+    assert(value == null || value >= 0);
+    this._genericTypeAliasReference = value;
+  }
+
+  @override
+  List<LinkedNodeTypeBuilder> get genericTypeAliasTypeArguments =>
+      _genericTypeAliasTypeArguments ??= <LinkedNodeTypeBuilder>[];
+
+  set genericTypeAliasTypeArguments(List<LinkedNodeTypeBuilder> value) {
+    this._genericTypeAliasTypeArguments = value;
+  }
+
+  @override
   int get interfaceClass => _interfaceClass ??= 0;
 
   /// Reference to a [LinkedNodeReferences].
-  void set interfaceClass(int value) {
+  set interfaceClass(int value) {
     assert(value == null || value >= 0);
     this._interfaceClass = value;
   }
@@ -18401,60 +19626,82 @@
   List<LinkedNodeTypeBuilder> get interfaceTypeArguments =>
       _interfaceTypeArguments ??= <LinkedNodeTypeBuilder>[];
 
-  void set interfaceTypeArguments(List<LinkedNodeTypeBuilder> value) {
+  set interfaceTypeArguments(List<LinkedNodeTypeBuilder> value) {
     this._interfaceTypeArguments = value;
   }
 
   @override
   idl.LinkedNodeTypeKind get kind => _kind ??= idl.LinkedNodeTypeKind.bottom;
 
-  void set kind(idl.LinkedNodeTypeKind value) {
+  set kind(idl.LinkedNodeTypeKind value) {
     this._kind = value;
   }
 
   @override
-  int get typeParameterParameter => _typeParameterParameter ??= 0;
+  idl.EntityRefNullabilitySuffix get nullabilitySuffix =>
+      _nullabilitySuffix ??= idl.EntityRefNullabilitySuffix.starOrIrrelevant;
 
-  /// Reference to a [LinkedNodeReferences].
-  void set typeParameterParameter(int value) {
+  set nullabilitySuffix(idl.EntityRefNullabilitySuffix value) {
+    this._nullabilitySuffix = value;
+  }
+
+  @override
+  int get typeParameterElement => _typeParameterElement ??= 0;
+
+  set typeParameterElement(int value) {
     assert(value == null || value >= 0);
-    this._typeParameterParameter = value;
+    this._typeParameterElement = value;
+  }
+
+  @override
+  int get typeParameterId => _typeParameterId ??= 0;
+
+  set typeParameterId(int value) {
+    assert(value == null || value >= 0);
+    this._typeParameterId = value;
   }
 
   LinkedNodeTypeBuilder(
-      {List<int> functionFormalParameters,
+      {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})
+      idl.EntityRefNullabilitySuffix nullabilitySuffix,
+      int typeParameterElement,
+      int typeParameterId})
       : _functionFormalParameters = functionFormalParameters,
         _functionReturnType = functionReturnType,
         _functionTypeParameters = functionTypeParameters,
+        _genericTypeAliasReference = genericTypeAliasReference,
+        _genericTypeAliasTypeArguments = genericTypeAliasTypeArguments,
         _interfaceClass = interfaceClass,
         _interfaceTypeArguments = interfaceTypeArguments,
         _kind = kind,
-        _typeParameterParameter = typeParameterParameter;
+        _nullabilitySuffix = nullabilitySuffix,
+        _typeParameterElement = typeParameterElement,
+        _typeParameterId = typeParameterId;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// 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());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._functionFormalParameters == null) {
       signature.addInt(0);
     } else {
       signature.addInt(this._functionFormalParameters.length);
       for (var x in this._functionFormalParameters) {
-        signature.addInt(x);
+        x?.collectApiSignature(signature);
       }
     }
     signature.addBool(this._functionReturnType != null);
@@ -18464,7 +19711,7 @@
     } else {
       signature.addInt(this._functionTypeParameters.length);
       for (var x in this._functionTypeParameters) {
-        signature.addInt(x);
+        x?.collectApiSignature(signature);
       }
     }
     signature.addInt(this._interfaceClass ?? 0);
@@ -18477,25 +19724,45 @@
       }
     }
     signature.addInt(this._kind == null ? 0 : this._kind.index);
-    signature.addInt(this._typeParameterParameter ?? 0);
+    signature.addInt(this._typeParameterElement ?? 0);
+    signature.addInt(this._typeParameterId ?? 0);
+    signature.addInt(this._genericTypeAliasReference ?? 0);
+    if (this._genericTypeAliasTypeArguments == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._genericTypeAliasTypeArguments.length);
+      for (var x in this._genericTypeAliasTypeArguments) {
+        x?.collectApiSignature(signature);
+      }
+    }
+    signature.addInt(
+        this._nullabilitySuffix == null ? 0 : this._nullabilitySuffix.index);
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset offset_functionFormalParameters;
     fb.Offset offset_functionReturnType;
     fb.Offset offset_functionTypeParameters;
+    fb.Offset offset_genericTypeAliasTypeArguments;
     fb.Offset offset_interfaceTypeArguments;
     if (!(_functionFormalParameters == null ||
         _functionFormalParameters.isEmpty)) {
-      offset_functionFormalParameters =
-          fbBuilder.writeListUint32(_functionFormalParameters);
+      offset_functionFormalParameters = fbBuilder.writeList(
+          _functionFormalParameters.map((b) => b.finish(fbBuilder)).toList());
     }
     if (_functionReturnType != null) {
       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)) {
+      offset_genericTypeAliasTypeArguments = fbBuilder.writeList(
+          _genericTypeAliasTypeArguments
+              .map((b) => b.finish(fbBuilder))
+              .toList());
     }
     if (!(_interfaceTypeArguments == null || _interfaceTypeArguments.isEmpty)) {
       offset_interfaceTypeArguments = fbBuilder.writeList(
@@ -18511,6 +19778,12 @@
     if (offset_functionTypeParameters != null) {
       fbBuilder.addOffset(2, offset_functionTypeParameters);
     }
+    if (_genericTypeAliasReference != null && _genericTypeAliasReference != 0) {
+      fbBuilder.addUint32(8, _genericTypeAliasReference);
+    }
+    if (offset_genericTypeAliasTypeArguments != null) {
+      fbBuilder.addOffset(9, offset_genericTypeAliasTypeArguments);
+    }
     if (_interfaceClass != null && _interfaceClass != 0) {
       fbBuilder.addUint32(3, _interfaceClass);
     }
@@ -18520,8 +19793,15 @@
     if (_kind != null && _kind != idl.LinkedNodeTypeKind.bottom) {
       fbBuilder.addUint8(5, _kind.index);
     }
-    if (_typeParameterParameter != null && _typeParameterParameter != 0) {
-      fbBuilder.addUint32(6, _typeParameterParameter);
+    if (_nullabilitySuffix != null &&
+        _nullabilitySuffix != idl.EntityRefNullabilitySuffix.starOrIrrelevant) {
+      fbBuilder.addUint8(10, _nullabilitySuffix.index);
+    }
+    if (_typeParameterElement != null && _typeParameterElement != 0) {
+      fbBuilder.addUint32(6, _typeParameterElement);
+    }
+    if (_typeParameterId != null && _typeParameterId != 0) {
+      fbBuilder.addUint32(7, _typeParameterId);
     }
     return fbBuilder.endTable();
   }
@@ -18543,18 +19823,25 @@
 
   _LinkedNodeTypeImpl(this._bc, this._bcOffset);
 
-  List<int> _functionFormalParameters;
+  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;
+  idl.EntityRefNullabilitySuffix _nullabilitySuffix;
+  int _typeParameterElement;
+  int _typeParameterId;
 
   @override
-  List<int> get functionFormalParameters {
+  List<idl.LinkedNodeTypeFormalParameter> get functionFormalParameters {
     _functionFormalParameters ??=
-        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
+        const fb.ListReader<idl.LinkedNodeTypeFormalParameter>(
+                const _LinkedNodeTypeFormalParameterReader())
+            .vTableGet(
+                _bc, _bcOffset, 0, const <idl.LinkedNodeTypeFormalParameter>[]);
     return _functionFormalParameters;
   }
 
@@ -18566,13 +19853,31 @@
   }
 
   @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;
   }
 
   @override
+  int get genericTypeAliasReference {
+    _genericTypeAliasReference ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 8, 0);
+    return _genericTypeAliasReference;
+  }
+
+  @override
+  List<idl.LinkedNodeType> get genericTypeAliasTypeArguments {
+    _genericTypeAliasTypeArguments ??=
+        const fb.ListReader<idl.LinkedNodeType>(const _LinkedNodeTypeReader())
+            .vTableGet(_bc, _bcOffset, 9, const <idl.LinkedNodeType>[]);
+    return _genericTypeAliasTypeArguments;
+  }
+
+  @override
   int get interfaceClass {
     _interfaceClass ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 3, 0);
     return _interfaceClass;
@@ -18594,10 +19899,24 @@
   }
 
   @override
-  int get typeParameterParameter {
-    _typeParameterParameter ??=
+  idl.EntityRefNullabilitySuffix get nullabilitySuffix {
+    _nullabilitySuffix ??= const _EntityRefNullabilitySuffixReader().vTableGet(
+        _bc, _bcOffset, 10, idl.EntityRefNullabilitySuffix.starOrIrrelevant);
+    return _nullabilitySuffix;
+  }
+
+  @override
+  int get typeParameterElement {
+    _typeParameterElement ??=
         const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 6, 0);
-    return _typeParameterParameter;
+    return _typeParameterElement;
+  }
+
+  @override
+  int get typeParameterId {
+    _typeParameterId ??=
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 7, 0);
+    return _typeParameterId;
   }
 }
 
@@ -18606,19 +19925,30 @@
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
     if (functionFormalParameters.isNotEmpty)
-      _result["functionFormalParameters"] = functionFormalParameters;
+      _result["functionFormalParameters"] =
+          functionFormalParameters.map((_value) => _value.toJson()).toList();
     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)
+      _result["genericTypeAliasTypeArguments"] = genericTypeAliasTypeArguments
+          .map((_value) => _value.toJson())
+          .toList();
     if (interfaceClass != 0) _result["interfaceClass"] = interfaceClass;
     if (interfaceTypeArguments.isNotEmpty)
       _result["interfaceTypeArguments"] =
           interfaceTypeArguments.map((_value) => _value.toJson()).toList();
     if (kind != idl.LinkedNodeTypeKind.bottom)
       _result["kind"] = kind.toString().split('.')[1];
-    if (typeParameterParameter != 0)
-      _result["typeParameterParameter"] = typeParameterParameter;
+    if (nullabilitySuffix != idl.EntityRefNullabilitySuffix.starOrIrrelevant)
+      _result["nullabilitySuffix"] = nullabilitySuffix.toString().split('.')[1];
+    if (typeParameterElement != 0)
+      _result["typeParameterElement"] = typeParameterElement;
+    if (typeParameterId != 0) _result["typeParameterId"] = typeParameterId;
     return _result;
   }
 
@@ -18627,10 +19957,263 @@
         "functionFormalParameters": functionFormalParameters,
         "functionReturnType": functionReturnType,
         "functionTypeParameters": functionTypeParameters,
+        "genericTypeAliasReference": genericTypeAliasReference,
+        "genericTypeAliasTypeArguments": genericTypeAliasTypeArguments,
         "interfaceClass": interfaceClass,
         "interfaceTypeArguments": interfaceTypeArguments,
         "kind": kind,
-        "typeParameterParameter": typeParameterParameter,
+        "nullabilitySuffix": nullabilitySuffix,
+        "typeParameterElement": typeParameterElement,
+        "typeParameterId": typeParameterId,
+      };
+
+  @override
+  String toString() => convert.json.encode(toJson());
+}
+
+class LinkedNodeTypeFormalParameterBuilder extends Object
+    with _LinkedNodeTypeFormalParameterMixin
+    implements idl.LinkedNodeTypeFormalParameter {
+  idl.LinkedNodeFormalParameterKind _kind;
+  String _name;
+  LinkedNodeTypeBuilder _type;
+
+  @override
+  idl.LinkedNodeFormalParameterKind get kind =>
+      _kind ??= idl.LinkedNodeFormalParameterKind.requiredPositional;
+
+  set kind(idl.LinkedNodeFormalParameterKind value) {
+    this._kind = value;
+  }
+
+  @override
+  String get name => _name ??= '';
+
+  set name(String value) {
+    this._name = value;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get type => _type;
+
+  set type(LinkedNodeTypeBuilder value) {
+    this._type = value;
+  }
+
+  LinkedNodeTypeFormalParameterBuilder(
+      {idl.LinkedNodeFormalParameterKind kind,
+      String name,
+      LinkedNodeTypeBuilder type})
+      : _kind = kind,
+        _name = name,
+        _type = type;
+
+  /// Flush [informative] data recursively.
+  void flushInformative() {
+    _type?.flushInformative();
+  }
+
+  /// Accumulate non-[informative] data into [signature].
+  void collectApiSignature(api_sig.ApiSignature signature) {
+    signature.addInt(this._kind == null ? 0 : this._kind.index);
+    signature.addString(this._name ?? '');
+    signature.addBool(this._type != null);
+    this._type?.collectApiSignature(signature);
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_name;
+    fb.Offset offset_type;
+    if (_name != null) {
+      offset_name = fbBuilder.writeString(_name);
+    }
+    if (_type != null) {
+      offset_type = _type.finish(fbBuilder);
+    }
+    fbBuilder.startTable();
+    if (_kind != null &&
+        _kind != idl.LinkedNodeFormalParameterKind.requiredPositional) {
+      fbBuilder.addUint8(0, _kind.index);
+    }
+    if (offset_name != null) {
+      fbBuilder.addOffset(1, offset_name);
+    }
+    if (offset_type != null) {
+      fbBuilder.addOffset(2, offset_type);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+class _LinkedNodeTypeFormalParameterReader
+    extends fb.TableReader<_LinkedNodeTypeFormalParameterImpl> {
+  const _LinkedNodeTypeFormalParameterReader();
+
+  @override
+  _LinkedNodeTypeFormalParameterImpl createObject(
+          fb.BufferContext bc, int offset) =>
+      new _LinkedNodeTypeFormalParameterImpl(bc, offset);
+}
+
+class _LinkedNodeTypeFormalParameterImpl extends Object
+    with _LinkedNodeTypeFormalParameterMixin
+    implements idl.LinkedNodeTypeFormalParameter {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _LinkedNodeTypeFormalParameterImpl(this._bc, this._bcOffset);
+
+  idl.LinkedNodeFormalParameterKind _kind;
+  String _name;
+  idl.LinkedNodeType _type;
+
+  @override
+  idl.LinkedNodeFormalParameterKind get kind {
+    _kind ??= const _LinkedNodeFormalParameterKindReader().vTableGet(_bc,
+        _bcOffset, 0, idl.LinkedNodeFormalParameterKind.requiredPositional);
+    return _kind;
+  }
+
+  @override
+  String get name {
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
+    return _name;
+  }
+
+  @override
+  idl.LinkedNodeType get type {
+    _type ??= const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 2, null);
+    return _type;
+  }
+}
+
+abstract class _LinkedNodeTypeFormalParameterMixin
+    implements idl.LinkedNodeTypeFormalParameter {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (kind != idl.LinkedNodeFormalParameterKind.requiredPositional)
+      _result["kind"] = kind.toString().split('.')[1];
+    if (name != '') _result["name"] = name;
+    if (type != null) _result["type"] = type.toJson();
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+        "kind": kind,
+        "name": name,
+        "type": type,
+      };
+
+  @override
+  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
@@ -18640,60 +20223,86 @@
 class LinkedNodeUnitBuilder extends Object
     with _LinkedNodeUnitMixin
     implements idl.LinkedNodeUnit {
+  bool _isSynthetic;
+  List<int> _lineStarts;
   LinkedNodeBuilder _node;
   UnlinkedTokensBuilder _tokens;
   String _uriStr;
 
   @override
+  bool get isSynthetic => _isSynthetic ??= false;
+
+  set isSynthetic(bool value) {
+    this._isSynthetic = value;
+  }
+
+  @override
+  List<int> get lineStarts => _lineStarts ??= <int>[];
+
+  /// Offsets of the first character of each line in the source code.
+  set lineStarts(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._lineStarts = value;
+  }
+
+  @override
   LinkedNodeBuilder get node => _node;
 
-  void set node(LinkedNodeBuilder value) {
+  set node(LinkedNodeBuilder value) {
     this._node = value;
   }
 
   @override
   UnlinkedTokensBuilder get tokens => _tokens;
 
-  void set tokens(UnlinkedTokensBuilder value) {
+  set tokens(UnlinkedTokensBuilder value) {
     this._tokens = value;
   }
 
   @override
   String get uriStr => _uriStr ??= '';
 
-  void set uriStr(String value) {
+  set uriStr(String value) {
     this._uriStr = value;
   }
 
   LinkedNodeUnitBuilder(
-      {LinkedNodeBuilder node, UnlinkedTokensBuilder tokens, String uriStr})
-      : _node = node,
+      {bool isSynthetic,
+      List<int> lineStarts,
+      LinkedNodeBuilder node,
+      UnlinkedTokensBuilder tokens,
+      String uriStr})
+      : _isSynthetic = isSynthetic,
+        _lineStarts = lineStarts,
+        _node = node,
         _tokens = tokens,
         _uriStr = uriStr;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
+    _lineStarts = null;
     _node?.flushInformative();
     _tokens?.flushInformative();
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._uriStr ?? '');
     signature.addBool(this._tokens != null);
     this._tokens?.collectApiSignature(signature);
     signature.addBool(this._node != null);
     this._node?.collectApiSignature(signature);
+    signature.addBool(this._isSynthetic == true);
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_lineStarts;
     fb.Offset offset_node;
     fb.Offset offset_tokens;
     fb.Offset offset_uriStr;
+    if (!(_lineStarts == null || _lineStarts.isEmpty)) {
+      offset_lineStarts = fbBuilder.writeListUint32(_lineStarts);
+    }
     if (_node != null) {
       offset_node = _node.finish(fbBuilder);
     }
@@ -18704,6 +20313,12 @@
       offset_uriStr = fbBuilder.writeString(_uriStr);
     }
     fbBuilder.startTable();
+    if (_isSynthetic == true) {
+      fbBuilder.addBool(3, true);
+    }
+    if (offset_lineStarts != null) {
+      fbBuilder.addOffset(4, offset_lineStarts);
+    }
     if (offset_node != null) {
       fbBuilder.addOffset(2, offset_node);
     }
@@ -18733,11 +20348,26 @@
 
   _LinkedNodeUnitImpl(this._bc, this._bcOffset);
 
+  bool _isSynthetic;
+  List<int> _lineStarts;
   idl.LinkedNode _node;
   idl.UnlinkedTokens _tokens;
   String _uriStr;
 
   @override
+  bool get isSynthetic {
+    _isSynthetic ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 3, false);
+    return _isSynthetic;
+  }
+
+  @override
+  List<int> get lineStarts {
+    _lineStarts ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 4, const <int>[]);
+    return _lineStarts;
+  }
+
+  @override
   idl.LinkedNode get node {
     _node ??= const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 2, null);
     return _node;
@@ -18761,6 +20391,8 @@
   @override
   Map<String, Object> toJson() {
     Map<String, Object> _result = <String, Object>{};
+    if (isSynthetic != false) _result["isSynthetic"] = isSynthetic;
+    if (lineStarts.isNotEmpty) _result["lineStarts"] = lineStarts;
     if (node != null) _result["node"] = node.toJson();
     if (tokens != null) _result["tokens"] = tokens.toJson();
     if (uriStr != '') _result["uriStr"] = uriStr;
@@ -18769,6 +20401,8 @@
 
   @override
   Map<String, Object> toMap() => {
+        "isSynthetic": isSynthetic,
+        "lineStarts": lineStarts,
         "node": node,
         "tokens": tokens,
         "uriStr": uriStr,
@@ -18783,60 +20417,70 @@
     implements idl.LinkedNodeVariablesDeclaration {
   LinkedNodeBuilder _comment;
   bool _isConst;
+  bool _isCovariant;
   bool _isFinal;
   bool _isStatic;
 
   @override
   LinkedNodeBuilder get comment => _comment;
 
-  void set comment(LinkedNodeBuilder value) {
+  set comment(LinkedNodeBuilder value) {
     this._comment = value;
   }
 
   @override
   bool get isConst => _isConst ??= false;
 
-  void set isConst(bool value) {
+  set isConst(bool value) {
     this._isConst = value;
   }
 
   @override
+  bool get isCovariant => _isCovariant ??= false;
+
+  set isCovariant(bool value) {
+    this._isCovariant = value;
+  }
+
+  @override
   bool get isFinal => _isFinal ??= false;
 
-  void set isFinal(bool value) {
+  set isFinal(bool value) {
     this._isFinal = value;
   }
 
   @override
   bool get isStatic => _isStatic ??= false;
 
-  void set isStatic(bool value) {
+  set isStatic(bool value) {
     this._isStatic = value;
   }
 
   LinkedNodeVariablesDeclarationBuilder(
-      {LinkedNodeBuilder comment, bool isConst, bool isFinal, bool isStatic})
+      {LinkedNodeBuilder comment,
+      bool isConst,
+      bool isCovariant,
+      bool isFinal,
+      bool isStatic})
       : _comment = comment,
         _isConst = isConst,
+        _isCovariant = isCovariant,
         _isFinal = isFinal,
         _isStatic = isStatic;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _comment?.flushInformative();
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
-    signature.addBool(this._isConst == true);
-    signature.addBool(this._isFinal == true);
-    signature.addBool(this._isStatic == true);
     signature.addBool(this._comment != null);
     this._comment?.collectApiSignature(signature);
+    signature.addBool(this._isConst == true);
+    signature.addBool(this._isCovariant == true);
+    signature.addBool(this._isFinal == true);
+    signature.addBool(this._isStatic == true);
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
@@ -18846,17 +20490,20 @@
     }
     fbBuilder.startTable();
     if (offset_comment != null) {
-      fbBuilder.addOffset(3, offset_comment);
+      fbBuilder.addOffset(0, offset_comment);
     }
     if (_isConst == true) {
-      fbBuilder.addBool(0, true);
-    }
-    if (_isFinal == true) {
       fbBuilder.addBool(1, true);
     }
-    if (_isStatic == true) {
+    if (_isCovariant == true) {
       fbBuilder.addBool(2, true);
     }
+    if (_isFinal == true) {
+      fbBuilder.addBool(3, true);
+    }
+    if (_isStatic == true) {
+      fbBuilder.addBool(4, true);
+    }
     return fbBuilder.endTable();
   }
 }
@@ -18881,30 +20528,37 @@
 
   idl.LinkedNode _comment;
   bool _isConst;
+  bool _isCovariant;
   bool _isFinal;
   bool _isStatic;
 
   @override
   idl.LinkedNode get comment {
-    _comment ??= const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 3, null);
+    _comment ??= const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 0, null);
     return _comment;
   }
 
   @override
   bool get isConst {
-    _isConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 0, false);
+    _isConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 1, false);
     return _isConst;
   }
 
   @override
+  bool get isCovariant {
+    _isCovariant ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 2, false);
+    return _isCovariant;
+  }
+
+  @override
   bool get isFinal {
-    _isFinal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 1, false);
+    _isFinal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 3, false);
     return _isFinal;
   }
 
   @override
   bool get isStatic {
-    _isStatic ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 2, false);
+    _isStatic ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 4, false);
     return _isStatic;
   }
 }
@@ -18916,6 +20570,7 @@
     Map<String, Object> _result = <String, Object>{};
     if (comment != null) _result["comment"] = comment.toJson();
     if (isConst != false) _result["isConst"] = isConst;
+    if (isCovariant != false) _result["isCovariant"] = isCovariant;
     if (isFinal != false) _result["isFinal"] = isFinal;
     if (isStatic != false) _result["isStatic"] = isStatic;
     return _result;
@@ -18925,6 +20580,7 @@
   Map<String, Object> toMap() => {
         "comment": comment,
         "isConst": isConst,
+        "isCovariant": isCovariant,
         "isFinal": isFinal,
         "isStatic": isStatic,
       };
@@ -18955,7 +20611,7 @@
   /// Containing references must always point backward; that is, for all i, if
   /// LinkedUnit.references[i].containingReference != 0, then
   /// LinkedUnit.references[i].containingReference < i.
-  void set containingReference(int value) {
+  set containingReference(int value) {
     assert(value == null || value >= 0);
     this._containingReference = value;
   }
@@ -18968,7 +20624,7 @@
   ///
   /// Zero if this entity is contained within another entity (e.g. a class
   /// member), or if [kind] is [ReferenceKind.prefix].
-  void set dependency(int value) {
+  set dependency(int value) {
     assert(value == null || value >= 0);
     this._dependency = value;
   }
@@ -18978,7 +20634,7 @@
 
   /// The kind of the entity being referred to.  For the pseudo-types `dynamic`
   /// and `void`, the kind is [ReferenceKind.classOrEnum].
-  void set kind(idl.ReferenceKind value) {
+  set kind(idl.ReferenceKind value) {
     this._kind = value;
   }
 
@@ -18992,7 +20648,7 @@
   /// If this [LinkedReference] doesn't have an associated [UnlinkedReference],
   /// name of the entity being referred to.  For the pseudo-type `dynamic`, the
   /// string is "dynamic".  For the pseudo-type `void`, the string is "void".
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -19002,7 +20658,7 @@
   /// If the entity being referred to is generic, the number of type parameters
   /// it declares (does not include type parameters of enclosing entities).
   /// Otherwise zero.
-  void set numTypeParameters(int value) {
+  set numTypeParameters(int value) {
     assert(value == null || value >= 0);
     this._numTypeParameters = value;
   }
@@ -19017,7 +20673,7 @@
   ///
   /// Zero if this entity is contained within another entity (e.g. a class
   /// member).
-  void set unit(int value) {
+  set unit(int value) {
     assert(value == null || value >= 0);
     this._unit = value;
   }
@@ -19036,14 +20692,10 @@
         _numTypeParameters = numTypeParameters,
         _unit = unit;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addInt(this._unit ?? 0);
     signature.addInt(this._dependency ?? 0);
@@ -19193,7 +20845,7 @@
 
   /// List of slot ids (referring to [UnlinkedExecutable.constCycleSlot])
   /// corresponding to const constructors that are part of cycles.
-  void set constCycles(List<int> value) {
+  set constCycles(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._constCycles = value;
   }
@@ -19204,7 +20856,7 @@
   /// List of slot ids (referring to [UnlinkedClass.notSimplyBoundedSlot] or
   /// [UnlinkedTypedef.notSimplyBoundedSlot]) corresponding to classes and
   /// typedefs that are not simply bounded.
-  void set notSimplyBounded(List<int> value) {
+  set notSimplyBounded(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._notSimplyBounded = value;
   }
@@ -19216,7 +20868,7 @@
   /// List of slot ids (referring to [UnlinkedParam.inheritsCovariantSlot] or
   /// [UnlinkedVariable.inheritsCovariantSlot]) corresponding to parameters
   /// that inherit `@covariant` behavior from a base class.
-  void set parametersInheritingCovariant(List<int> value) {
+  set parametersInheritingCovariant(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._parametersInheritingCovariant = value;
   }
@@ -19231,7 +20883,7 @@
   /// elements beyond the number of elements in [UnlinkedUnit.references], those
   /// additional elements are references that are only referred to implicitly
   /// (e.g. elements involved in inferred or propagated types).
-  void set references(List<LinkedReferenceBuilder> value) {
+  set references(List<LinkedReferenceBuilder> value) {
     this._references = value;
   }
 
@@ -19240,7 +20892,7 @@
       _topLevelInferenceErrors ??= <TopLevelInferenceErrorBuilder>[];
 
   /// The list of type inference errors.
-  void set topLevelInferenceErrors(List<TopLevelInferenceErrorBuilder> value) {
+  set topLevelInferenceErrors(List<TopLevelInferenceErrorBuilder> value) {
     this._topLevelInferenceErrors = value;
   }
 
@@ -19249,7 +20901,7 @@
 
   /// List associating slot ids found inside the unlinked summary for the
   /// compilation unit with propagated and inferred types.
-  void set types(List<EntityRefBuilder> value) {
+  set types(List<EntityRefBuilder> value) {
     this._types = value;
   }
 
@@ -19267,18 +20919,14 @@
         _topLevelInferenceErrors = topLevelInferenceErrors,
         _types = types;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _references?.forEach((b) => b.flushInformative());
     _topLevelInferenceErrors?.forEach((b) => b.flushInformative());
     _types?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._references == null) {
       signature.addInt(0);
@@ -19510,7 +21158,7 @@
       _linkedLibraries ??= <LinkedLibraryBuilder>[];
 
   /// Linked libraries.
-  void set linkedLibraries(List<LinkedLibraryBuilder> value) {
+  set linkedLibraries(List<LinkedLibraryBuilder> value) {
     this._linkedLibraries = value;
   }
 
@@ -19519,7 +21167,7 @@
 
   /// The list of URIs of items in [linkedLibraries], e.g. `dart:core` or
   /// `package:foo/bar.dart`.
-  void set linkedLibraryUris(List<String> value) {
+  set linkedLibraryUris(List<String> value) {
     this._linkedLibraryUris = value;
   }
 
@@ -19528,7 +21176,7 @@
 
   /// Major version of the summary format.  See
   /// [PackageBundleAssembler.currentMajorVersion].
-  void set majorVersion(int value) {
+  set majorVersion(int value) {
     assert(value == null || value >= 0);
     this._majorVersion = value;
   }
@@ -19538,7 +21186,7 @@
 
   /// Minor version of the summary format.  See
   /// [PackageBundleAssembler.currentMinorVersion].
-  void set minorVersion(int value) {
+  set minorVersion(int value) {
     assert(value == null || value >= 0);
     this._minorVersion = value;
   }
@@ -19552,7 +21200,7 @@
       _unlinkedUnits ??= <UnlinkedUnitBuilder>[];
 
   /// Unlinked information for the compilation units constituting the package.
-  void set unlinkedUnits(List<UnlinkedUnitBuilder> value) {
+  set unlinkedUnits(List<UnlinkedUnitBuilder> value) {
     this._unlinkedUnits = value;
   }
 
@@ -19560,7 +21208,7 @@
   List<String> get unlinkedUnitUris => _unlinkedUnitUris ??= <String>[];
 
   /// The list of URIs of items in [unlinkedUnits], e.g. `dart:core/bool.dart`.
-  void set unlinkedUnitUris(List<String> value) {
+  set unlinkedUnitUris(List<String> value) {
     this._unlinkedUnitUris = value;
   }
 
@@ -19578,17 +21226,13 @@
         _unlinkedUnits = unlinkedUnits,
         _unlinkedUnitUris = unlinkedUnitUris;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _linkedLibraries?.forEach((b) => b.flushInformative());
     _unlinkedUnits?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._linkedLibraries == null) {
       signature.addInt(0);
@@ -19810,7 +21454,7 @@
 
   /// Each item of this list corresponds to a unique referenced element.  It is
   /// the kind of the synthetic element.
-  void set elementKinds(List<idl.IndexSyntheticElementKind> value) {
+  set elementKinds(List<idl.IndexSyntheticElementKind> value) {
     this._elementKinds = value;
   }
 
@@ -19823,7 +21467,7 @@
   /// is a top-level element.  The list is sorted in ascending order, so that
   /// the client can quickly check whether an element is referenced in this
   /// [PackageIndex].
-  void set elementNameClassMemberIds(List<int> value) {
+  set elementNameClassMemberIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameClassMemberIds = value;
   }
@@ -19836,7 +21480,7 @@
   /// not a named parameter.  The list is sorted in ascending order, so that the
   /// client can quickly check whether an element is referenced in this
   /// [PackageIndex].
-  void set elementNameParameterIds(List<int> value) {
+  set elementNameParameterIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameParameterIds = value;
   }
@@ -19849,7 +21493,7 @@
   /// the identifier of the top-level element name, or `null` if the element is
   /// the unit.  The list is sorted in ascending order, so that the client can
   /// quickly check whether an element is referenced in this [PackageIndex].
-  void set elementNameUnitMemberIds(List<int> value) {
+  set elementNameUnitMemberIds(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementNameUnitMemberIds = value;
   }
@@ -19860,7 +21504,7 @@
   /// Each item of this list corresponds to a unique referenced element.  It is
   /// the index into [unitLibraryUris] and [unitUnitUris] for the library
   /// specific unit where the element is declared.
-  void set elementUnits(List<int> value) {
+  set elementUnits(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._elementUnits = value;
   }
@@ -19871,7 +21515,7 @@
   /// List of unique element strings used in this [PackageIndex].  The list is
   /// sorted in ascending order, so that the client can quickly check the
   /// presence of a string in this [PackageIndex].
-  void set strings(List<String> value) {
+  set strings(List<String> value) {
     this._strings = value;
   }
 
@@ -19881,7 +21525,7 @@
   /// Each item of this list corresponds to the library URI of a unique library
   /// specific unit referenced in the [PackageIndex].  It is an index into
   /// [strings] list.
-  void set unitLibraryUris(List<int> value) {
+  set unitLibraryUris(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._unitLibraryUris = value;
   }
@@ -19890,7 +21534,7 @@
   List<UnitIndexBuilder> get units => _units ??= <UnitIndexBuilder>[];
 
   /// List of indexes of each unit in this [PackageIndex].
-  void set units(List<UnitIndexBuilder> value) {
+  set units(List<UnitIndexBuilder> value) {
     this._units = value;
   }
 
@@ -19900,7 +21544,7 @@
   /// Each item of this list corresponds to the unit URI of a unique library
   /// specific unit referenced in the [PackageIndex].  It is an index into
   /// [strings] list.
-  void set unitUnitUris(List<int> value) {
+  set unitUnitUris(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._unitUnitUris = value;
   }
@@ -19925,16 +21569,12 @@
         _units = units,
         _unitUnitUris = unitUnitUris;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _units?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._elementUnits == null) {
       signature.addInt(0);
@@ -20241,7 +21881,7 @@
   List<String> get arguments => _arguments ??= <String>[];
 
   /// The [kind] specific arguments.
-  void set arguments(List<String> value) {
+  set arguments(List<String> value) {
     this._arguments = value;
   }
 
@@ -20250,7 +21890,7 @@
       _kind ??= idl.TopLevelInferenceErrorKind.assignment;
 
   /// The kind of the error.
-  void set kind(idl.TopLevelInferenceErrorKind value) {
+  set kind(idl.TopLevelInferenceErrorKind value) {
     this._kind = value;
   }
 
@@ -20260,7 +21900,7 @@
   /// The slot id (which is unique within the compilation unit) identifying the
   /// target of type inference with which this [TopLevelInferenceError] is
   /// associated.
-  void set slot(int value) {
+  set slot(int value) {
     assert(value == null || value >= 0);
     this._slot = value;
   }
@@ -20271,14 +21911,10 @@
         _kind = kind,
         _slot = slot;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addInt(this._slot ?? 0);
     signature.addInt(this._kind == null ? 0 : this._kind.index);
@@ -20399,7 +22035,7 @@
       _definedNameKinds ??= <idl.IndexNameKind>[];
 
   /// Each item of this list is the kind of an element defined in this unit.
-  void set definedNameKinds(List<idl.IndexNameKind> value) {
+  set definedNameKinds(List<idl.IndexNameKind> value) {
     this._definedNameKinds = value;
   }
 
@@ -20408,7 +22044,7 @@
 
   /// Each item of this list is the name offset of an element defined in this
   /// unit relative to the beginning of the file.
-  void set definedNameOffsets(List<int> value) {
+  set definedNameOffsets(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._definedNameOffsets = value;
   }
@@ -20420,7 +22056,7 @@
   /// is an index into [PackageIndex.strings] list.  The list is sorted in
   /// ascending order, so that the client can quickly find name definitions in
   /// this [UnitIndex].
-  void set definedNames(List<int> value) {
+  set definedNames(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._definedNames = value;
   }
@@ -20430,7 +22066,7 @@
 
   /// Index into [PackageIndex.unitLibraryUris] and [PackageIndex.unitUnitUris]
   /// for the library specific unit that corresponds to this [UnitIndex].
-  void set unit(int value) {
+  set unit(int value) {
     assert(value == null || value >= 0);
     this._unit = value;
   }
@@ -20441,7 +22077,7 @@
 
   /// Each item of this list is the `true` if the corresponding element usage
   /// is qualified with some prefix.
-  void set usedElementIsQualifiedFlags(List<bool> value) {
+  set usedElementIsQualifiedFlags(List<bool> value) {
     this._usedElementIsQualifiedFlags = value;
   }
 
@@ -20450,7 +22086,7 @@
       _usedElementKinds ??= <idl.IndexRelationKind>[];
 
   /// Each item of this list is the kind of the element usage.
-  void set usedElementKinds(List<idl.IndexRelationKind> value) {
+  set usedElementKinds(List<idl.IndexRelationKind> value) {
     this._usedElementKinds = value;
   }
 
@@ -20458,7 +22094,7 @@
   List<int> get usedElementLengths => _usedElementLengths ??= <int>[];
 
   /// Each item of this list is the length of the element usage.
-  void set usedElementLengths(List<int> value) {
+  set usedElementLengths(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElementLengths = value;
   }
@@ -20468,7 +22104,7 @@
 
   /// Each item of this list is the offset of the element usage relative to the
   /// beginning of the file.
-  void set usedElementOffsets(List<int> value) {
+  set usedElementOffsets(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElementOffsets = value;
   }
@@ -20479,7 +22115,7 @@
   /// Each item of this list is the index into [PackageIndex.elementUnits] and
   /// [PackageIndex.elementOffsets].  The list is sorted in ascending order, so
   /// that the client can quickly find element references in this [UnitIndex].
-  void set usedElements(List<int> value) {
+  set usedElements(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedElements = value;
   }
@@ -20490,7 +22126,7 @@
 
   /// Each item of this list is the `true` if the corresponding name usage
   /// is qualified with some prefix.
-  void set usedNameIsQualifiedFlags(List<bool> value) {
+  set usedNameIsQualifiedFlags(List<bool> value) {
     this._usedNameIsQualifiedFlags = value;
   }
 
@@ -20499,7 +22135,7 @@
       _usedNameKinds ??= <idl.IndexRelationKind>[];
 
   /// Each item of this list is the kind of the name usage.
-  void set usedNameKinds(List<idl.IndexRelationKind> value) {
+  set usedNameKinds(List<idl.IndexRelationKind> value) {
     this._usedNameKinds = value;
   }
 
@@ -20508,7 +22144,7 @@
 
   /// Each item of this list is the offset of the name usage relative to the
   /// beginning of the file.
-  void set usedNameOffsets(List<int> value) {
+  set usedNameOffsets(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedNameOffsets = value;
   }
@@ -20519,7 +22155,7 @@
   /// Each item of this list is the index into [PackageIndex.strings] for a
   /// used name.  The list is sorted in ascending order, so that the client can
   /// quickly find name uses in this [UnitIndex].
-  void set usedNames(List<int> value) {
+  set usedNames(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._usedNames = value;
   }
@@ -20552,14 +22188,10 @@
         _usedNameOffsets = usedNameOffsets,
         _usedNames = usedNames;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addInt(this._unit ?? 0);
     if (this._usedElementLengths == null) {
@@ -20969,7 +22601,7 @@
       _annotations ??= <UnlinkedExprBuilder>[];
 
   /// Annotations for this class.
-  void set annotations(List<UnlinkedExprBuilder> value) {
+  set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
 
@@ -20977,7 +22609,7 @@
   CodeRangeBuilder get codeRange => _codeRange;
 
   /// Code range of the class.
-  void set codeRange(CodeRangeBuilder value) {
+  set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
 
@@ -20987,7 +22619,7 @@
 
   /// Documentation comment for the class, or `null` if there is no
   /// documentation comment.
-  void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
+  set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
 
@@ -20996,7 +22628,7 @@
       _executables ??= <UnlinkedExecutableBuilder>[];
 
   /// Executable objects (methods, getters, and setters) contained in the class.
-  void set executables(List<UnlinkedExecutableBuilder> value) {
+  set executables(List<UnlinkedExecutableBuilder> value) {
     this._executables = value;
   }
 
@@ -21005,7 +22637,7 @@
       _fields ??= <UnlinkedVariableBuilder>[];
 
   /// Field declarations contained in the class.
-  void set fields(List<UnlinkedVariableBuilder> value) {
+  set fields(List<UnlinkedVariableBuilder> value) {
     this._fields = value;
   }
 
@@ -21014,7 +22646,7 @@
 
   /// Indicates whether this class is the core "Object" class (and hence has no
   /// supertype)
-  void set hasNoSupertype(bool value) {
+  set hasNoSupertype(bool value) {
     this._hasNoSupertype = value;
   }
 
@@ -21022,7 +22654,7 @@
   List<EntityRefBuilder> get interfaces => _interfaces ??= <EntityRefBuilder>[];
 
   /// Interfaces appearing in an `implements` clause, if any.
-  void set interfaces(List<EntityRefBuilder> value) {
+  set interfaces(List<EntityRefBuilder> value) {
     this._interfaces = value;
   }
 
@@ -21030,7 +22662,7 @@
   bool get isAbstract => _isAbstract ??= false;
 
   /// Indicates whether the class is declared with the `abstract` keyword.
-  void set isAbstract(bool value) {
+  set isAbstract(bool value) {
     this._isAbstract = value;
   }
 
@@ -21038,7 +22670,7 @@
   bool get isMixinApplication => _isMixinApplication ??= false;
 
   /// Indicates whether the class is declared using mixin application syntax.
-  void set isMixinApplication(bool value) {
+  set isMixinApplication(bool value) {
     this._isMixinApplication = value;
   }
 
@@ -21046,7 +22678,7 @@
   List<EntityRefBuilder> get mixins => _mixins ??= <EntityRefBuilder>[];
 
   /// Mixins appearing in a `with` clause, if any.
-  void set mixins(List<EntityRefBuilder> value) {
+  set mixins(List<EntityRefBuilder> value) {
     this._mixins = value;
   }
 
@@ -21054,7 +22686,7 @@
   String get name => _name ??= '';
 
   /// Name of the class.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -21062,7 +22694,7 @@
   int get nameOffset => _nameOffset ??= 0;
 
   /// Offset of the class name relative to the beginning of the file.
-  void set nameOffset(int value) {
+  set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
   }
@@ -21077,7 +22709,7 @@
   /// type when specifying the bound of a type parameter.
   ///
   /// Otherwise, zero.
-  void set notSimplyBoundedSlot(int value) {
+  set notSimplyBoundedSlot(int value) {
     assert(value == null || value >= 0);
     this._notSimplyBoundedSlot = value;
   }
@@ -21089,7 +22721,7 @@
   /// Superclass constraints for this mixin declaration. The list will be empty
   /// if this class is not a mixin declaration, or if the declaration does not
   /// have an `on` clause (in which case the type `Object` is implied).
-  void set superclassConstraints(List<EntityRefBuilder> value) {
+  set superclassConstraints(List<EntityRefBuilder> value) {
     this._superclassConstraints = value;
   }
 
@@ -21099,7 +22731,7 @@
   /// Names of methods, getters, setters, and operators that this mixin
   /// declaration super-invokes.  For setters this includes the trailing "=".
   /// The list will be empty if this class is not a mixin declaration.
-  void set superInvokedNames(List<String> value) {
+  set superInvokedNames(List<String> value) {
     this._superInvokedNames = value;
   }
 
@@ -21109,7 +22741,7 @@
   /// Supertype of the class, or `null` if either (a) the class doesn't
   /// explicitly declare a supertype (and hence has supertype `Object`), or (b)
   /// the class *is* `Object` (and hence has no supertype).
-  void set supertype(EntityRefBuilder value) {
+  set supertype(EntityRefBuilder value) {
     this._supertype = value;
   }
 
@@ -21118,7 +22750,7 @@
       _typeParameters ??= <UnlinkedTypeParamBuilder>[];
 
   /// Type parameters of the class, if any.
-  void set typeParameters(List<UnlinkedTypeParamBuilder> value) {
+  set typeParameters(List<UnlinkedTypeParamBuilder> value) {
     this._typeParameters = value;
   }
 
@@ -21158,9 +22790,7 @@
         _supertype = supertype,
         _typeParameters = typeParameters;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _codeRange = null;
@@ -21175,9 +22805,7 @@
     _typeParameters?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     if (this._executables == null) {
@@ -21597,7 +23225,7 @@
 
   /// If this is a `show` combinator, offset of the end of the list of shown
   /// names.  Otherwise zero.
-  void set end(int value) {
+  set end(int value) {
     assert(value == null || value >= 0);
     this._end = value;
   }
@@ -21606,7 +23234,7 @@
   List<String> get hides => _hides ??= <String>[];
 
   /// List of names which are hidden.  Empty if this is a `show` combinator.
-  void set hides(List<String> value) {
+  set hides(List<String> value) {
     this._hides = value;
   }
 
@@ -21615,7 +23243,7 @@
 
   /// If this is a `show` combinator, offset of the `show` keyword.  Otherwise
   /// zero.
-  void set offset(int value) {
+  set offset(int value) {
     assert(value == null || value >= 0);
     this._offset = value;
   }
@@ -21624,7 +23252,7 @@
   List<String> get shows => _shows ??= <String>[];
 
   /// List of names which are shown.  Empty if this is a `hide` combinator.
-  void set shows(List<String> value) {
+  set shows(List<String> value) {
     this._shows = value;
   }
 
@@ -21635,17 +23263,13 @@
         _offset = offset,
         _shows = shows;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _end = null;
     _offset = null;
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._shows == null) {
       signature.addInt(0);
@@ -21777,7 +23401,7 @@
 
   /// The name of the declared variable whose value is being used in the
   /// condition.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -21785,7 +23409,7 @@
   String get uri => _uri ??= '';
 
   /// The URI of the implementation library to be used if the condition is true.
-  void set uri(String value) {
+  set uri(String value) {
     this._uri = value;
   }
 
@@ -21794,7 +23418,7 @@
 
   /// The value to which the value of the declared variable will be compared,
   /// or `true` if the condition does not include an equality test.
-  void set value(String value) {
+  set value(String value) {
     this._value = value;
   }
 
@@ -21803,14 +23427,10 @@
         _uri = uri,
         _value = value;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     signature.addString(this._value ?? '');
@@ -21921,7 +23541,7 @@
   /// If there are `m` [arguments] and `n` [argumentNames], then each argument
   /// from [arguments] with index `i` such that `n + i - m >= 0`, should be used
   /// with the name at `n + i - m`.
-  void set argumentNames(List<String> value) {
+  set argumentNames(List<String> value) {
     this._argumentNames = value;
   }
 
@@ -21931,7 +23551,7 @@
 
   /// If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
   /// invocation.  Otherwise empty.
-  void set arguments(List<UnlinkedExprBuilder> value) {
+  set arguments(List<UnlinkedExprBuilder> value) {
     this._arguments = value;
   }
 
@@ -21940,7 +23560,7 @@
 
   /// If [kind] is `field`, the expression of the field initializer.
   /// Otherwise `null`.
-  void set expression(UnlinkedExprBuilder value) {
+  set expression(UnlinkedExprBuilder value) {
     this._expression = value;
   }
 
@@ -21949,7 +23569,7 @@
       _kind ??= idl.UnlinkedConstructorInitializerKind.field;
 
   /// The kind of the constructor initializer (field, redirect, super).
-  void set kind(idl.UnlinkedConstructorInitializerKind value) {
+  set kind(idl.UnlinkedConstructorInitializerKind value) {
     this._kind = value;
   }
 
@@ -21960,7 +23580,7 @@
   /// [kind] is `thisInvocation`, the name of the constructor, declared in this
   /// class, to redirect to.  If [kind] is `superInvocation`, the name of the
   /// constructor, declared in the superclass, to invoke.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -21976,17 +23596,13 @@
         _kind = kind,
         _name = name;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _arguments?.forEach((b) => b.flushInformative());
     _expression?.flushInformative();
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     signature.addBool(this._expression != null);
@@ -22159,20 +23775,16 @@
   ///
   /// References appearing within the doc comment in square brackets are not
   /// specially encoded.
-  void set text(String value) {
+  set text(String value) {
     this._text = value;
   }
 
   UnlinkedDocumentationCommentBuilder({String text}) : _text = text;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._text ?? '');
   }
@@ -22258,7 +23870,7 @@
       _annotations ??= <UnlinkedExprBuilder>[];
 
   /// Annotations for this enum.
-  void set annotations(List<UnlinkedExprBuilder> value) {
+  set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
 
@@ -22266,7 +23878,7 @@
   CodeRangeBuilder get codeRange => _codeRange;
 
   /// Code range of the enum.
-  void set codeRange(CodeRangeBuilder value) {
+  set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
 
@@ -22276,7 +23888,7 @@
 
   /// Documentation comment for the enum, or `null` if there is no documentation
   /// comment.
-  void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
+  set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
 
@@ -22284,7 +23896,7 @@
   String get name => _name ??= '';
 
   /// Name of the enum type.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -22292,7 +23904,7 @@
   int get nameOffset => _nameOffset ??= 0;
 
   /// Offset of the enum name relative to the beginning of the file.
-  void set nameOffset(int value) {
+  set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
   }
@@ -22302,7 +23914,7 @@
       _values ??= <UnlinkedEnumValueBuilder>[];
 
   /// Values listed in the enum declaration, in declaration order.
-  void set values(List<UnlinkedEnumValueBuilder> value) {
+  set values(List<UnlinkedEnumValueBuilder> value) {
     this._values = value;
   }
 
@@ -22320,9 +23932,7 @@
         _nameOffset = nameOffset,
         _values = values;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _codeRange = null;
@@ -22331,9 +23941,7 @@
     _values?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     if (this._values == null) {
@@ -22509,7 +24117,7 @@
       _annotations ??= <UnlinkedExprBuilder>[];
 
   /// Annotations for this value.
-  void set annotations(List<UnlinkedExprBuilder> value) {
+  set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
 
@@ -22519,7 +24127,7 @@
 
   /// Documentation comment for the enum value, or `null` if there is no
   /// documentation comment.
-  void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
+  set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
 
@@ -22527,7 +24135,7 @@
   String get name => _name ??= '';
 
   /// Name of the enumerated value.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -22535,7 +24143,7 @@
   int get nameOffset => _nameOffset ??= 0;
 
   /// Offset of the enum value name relative to the beginning of the file.
-  void set nameOffset(int value) {
+  set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
   }
@@ -22550,18 +24158,14 @@
         _name = name,
         _nameOffset = nameOffset;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _documentationComment = null;
     _nameOffset = null;
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     if (this._annotations == null) {
@@ -22717,7 +24321,7 @@
       _annotations ??= <UnlinkedExprBuilder>[];
 
   /// Annotations for this executable.
-  void set annotations(List<UnlinkedExprBuilder> value) {
+  set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
 
@@ -22727,7 +24331,7 @@
   /// If this executable's function body is declared using `=>`, the expression
   /// to the right of the `=>`.  May be omitted if neither type inference nor
   /// constant evaluation depends on the function body.
-  void set bodyExpr(UnlinkedExprBuilder value) {
+  set bodyExpr(UnlinkedExprBuilder value) {
     this._bodyExpr = value;
   }
 
@@ -22735,7 +24339,7 @@
   CodeRangeBuilder get codeRange => _codeRange;
 
   /// Code range of the executable.
-  void set codeRange(CodeRangeBuilder value) {
+  set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
 
@@ -22745,8 +24349,7 @@
 
   /// If a constant [UnlinkedExecutableKind.constructor], the constructor
   /// initializers.  Otherwise empty.
-  void set constantInitializers(
-      List<UnlinkedConstructorInitializerBuilder> value) {
+  set constantInitializers(List<UnlinkedConstructorInitializerBuilder> value) {
     this._constantInitializers = value;
   }
 
@@ -22759,7 +24362,7 @@
   /// a cycle.
   ///
   /// Otherwise, zero.
-  void set constCycleSlot(int value) {
+  set constCycleSlot(int value) {
     assert(value == null || value >= 0);
     this._constCycleSlot = value;
   }
@@ -22770,7 +24373,7 @@
 
   /// Documentation comment for the executable, or `null` if there is no
   /// documentation comment.
-  void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
+  set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
 
@@ -22782,7 +24385,7 @@
   /// return type.  If there is no matching entry in [LinkedUnit.types], then
   /// no return type was inferred for this variable, so its static type is
   /// `dynamic`.
-  void set inferredReturnTypeSlot(int value) {
+  set inferredReturnTypeSlot(int value) {
     assert(value == null || value >= 0);
     this._inferredReturnTypeSlot = value;
   }
@@ -22791,7 +24394,7 @@
   bool get isAbstract => _isAbstract ??= false;
 
   /// Indicates whether the executable is declared using the `abstract` keyword.
-  void set isAbstract(bool value) {
+  set isAbstract(bool value) {
     this._isAbstract = value;
   }
 
@@ -22799,7 +24402,7 @@
   bool get isAsynchronous => _isAsynchronous ??= false;
 
   /// Indicates whether the executable has body marked as being asynchronous.
-  void set isAsynchronous(bool value) {
+  set isAsynchronous(bool value) {
     this._isAsynchronous = value;
   }
 
@@ -22807,7 +24410,7 @@
   bool get isConst => _isConst ??= false;
 
   /// Indicates whether the executable is declared using the `const` keyword.
-  void set isConst(bool value) {
+  set isConst(bool value) {
     this._isConst = value;
   }
 
@@ -22815,7 +24418,7 @@
   bool get isExternal => _isExternal ??= false;
 
   /// Indicates whether the executable is declared using the `external` keyword.
-  void set isExternal(bool value) {
+  set isExternal(bool value) {
     this._isExternal = value;
   }
 
@@ -22823,7 +24426,7 @@
   bool get isFactory => _isFactory ??= false;
 
   /// Indicates whether the executable is declared using the `factory` keyword.
-  void set isFactory(bool value) {
+  set isFactory(bool value) {
     this._isFactory = value;
   }
 
@@ -22831,7 +24434,7 @@
   bool get isGenerator => _isGenerator ??= false;
 
   /// Indicates whether the executable has body marked as being a generator.
-  void set isGenerator(bool value) {
+  set isGenerator(bool value) {
     this._isGenerator = value;
   }
 
@@ -22839,7 +24442,7 @@
   bool get isRedirectedConstructor => _isRedirectedConstructor ??= false;
 
   /// Indicates whether the executable is a redirected constructor.
-  void set isRedirectedConstructor(bool value) {
+  set isRedirectedConstructor(bool value) {
     this._isRedirectedConstructor = value;
   }
 
@@ -22851,7 +24454,7 @@
   /// Note that for top level executables, this flag is false, since they are
   /// not declared using the `static` keyword (even though they are considered
   /// static for semantic purposes).
-  void set isStatic(bool value) {
+  set isStatic(bool value) {
     this._isStatic = value;
   }
 
@@ -22861,7 +24464,7 @@
 
   /// The kind of the executable (function/method, getter, setter, or
   /// constructor).
-  void set kind(idl.UnlinkedExecutableKind value) {
+  set kind(idl.UnlinkedExecutableKind value) {
     this._kind = value;
   }
 
@@ -22870,7 +24473,7 @@
       _localFunctions ??= <UnlinkedExecutableBuilder>[];
 
   /// The list of local functions.
-  void set localFunctions(List<UnlinkedExecutableBuilder> value) {
+  set localFunctions(List<UnlinkedExecutableBuilder> value) {
     this._localFunctions = value;
   }
 
@@ -22888,7 +24491,7 @@
   /// Name of the executable.  For setters, this includes the trailing "=".  For
   /// named constructors, this excludes the class name and excludes the ".".
   /// For unnamed constructors, this is the empty string.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -22897,7 +24500,7 @@
 
   /// If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
   /// the offset of the end of the constructor name.  Otherwise zero.
-  void set nameEnd(int value) {
+  set nameEnd(int value) {
     assert(value == null || value >= 0);
     this._nameEnd = value;
   }
@@ -22909,7 +24512,7 @@
   /// named constructors, this excludes the class name and excludes the ".".
   /// For unnamed constructors, this is the offset of the class name (i.e. the
   /// offset of the second "C" in "class C { C(); }").
-  void set nameOffset(int value) {
+  set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
   }
@@ -22921,7 +24524,7 @@
   /// Parameters of the executable, if any.  Note that getters have no
   /// parameters (hence this will be the empty list), and setters have a single
   /// parameter.
-  void set parameters(List<UnlinkedParamBuilder> value) {
+  set parameters(List<UnlinkedParamBuilder> value) {
     this._parameters = value;
   }
 
@@ -22930,7 +24533,7 @@
 
   /// If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
   /// the offset of the period before the constructor name.  Otherwise zero.
-  void set periodOffset(int value) {
+  set periodOffset(int value) {
     assert(value == null || value >= 0);
     this._periodOffset = value;
   }
@@ -22940,7 +24543,7 @@
 
   /// If [isRedirectedConstructor] and [isFactory] are both `true`, the
   /// constructor to which this constructor redirects; otherwise empty.
-  void set redirectedConstructor(EntityRefBuilder value) {
+  set redirectedConstructor(EntityRefBuilder value) {
     this._redirectedConstructor = value;
   }
 
@@ -22950,7 +24553,7 @@
   /// If [isRedirectedConstructor] is `true` and [isFactory] is `false`, the
   /// name of the constructor that this constructor redirects to; otherwise
   /// empty.
-  void set redirectedConstructorName(String value) {
+  set redirectedConstructorName(String value) {
     this._redirectedConstructorName = value;
   }
 
@@ -22962,7 +24565,7 @@
   /// associated with variable initializers and closures, since these
   /// executables may have return types that are not accessible via direct
   /// imports.
-  void set returnType(EntityRefBuilder value) {
+  set returnType(EntityRefBuilder value) {
     this._returnType = value;
   }
 
@@ -22972,7 +24575,7 @@
 
   /// Type parameters of the executable, if any.  Empty if support for generic
   /// method syntax is disabled.
-  void set typeParameters(List<UnlinkedTypeParamBuilder> value) {
+  set typeParameters(List<UnlinkedTypeParamBuilder> value) {
     this._typeParameters = value;
   }
 
@@ -22980,7 +24583,7 @@
   int get visibleLength => _visibleLength ??= 0;
 
   /// If a local function, the length of the visible range; zero otherwise.
-  void set visibleLength(int value) {
+  set visibleLength(int value) {
     assert(value == null || value >= 0);
     this._visibleLength = value;
   }
@@ -22989,7 +24592,7 @@
   int get visibleOffset => _visibleOffset ??= 0;
 
   /// If a local function, the beginning of the visible range; zero otherwise.
-  void set visibleOffset(int value) {
+  set visibleOffset(int value) {
     assert(value == null || value >= 0);
     this._visibleOffset = value;
   }
@@ -23052,9 +24655,7 @@
         _visibleLength = visibleLength,
         _visibleOffset = visibleOffset;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _bodyExpr?.flushInformative();
@@ -23075,9 +24676,7 @@
     _visibleOffset = null;
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     if (this._parameters == null) {
@@ -23626,7 +25225,7 @@
       _annotations ??= <UnlinkedExprBuilder>[];
 
   /// Annotations for this export directive.
-  void set annotations(List<UnlinkedExprBuilder> value) {
+  set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
 
@@ -23634,7 +25233,7 @@
   int get offset => _offset ??= 0;
 
   /// Offset of the "export" keyword.
-  void set offset(int value) {
+  set offset(int value) {
     assert(value == null || value >= 0);
     this._offset = value;
   }
@@ -23644,7 +25243,7 @@
 
   /// End of the URI string (including quotes) relative to the beginning of the
   /// file.
-  void set uriEnd(int value) {
+  set uriEnd(int value) {
     assert(value == null || value >= 0);
     this._uriEnd = value;
   }
@@ -23654,7 +25253,7 @@
 
   /// Offset of the URI string (including quotes) relative to the beginning of
   /// the file.
-  void set uriOffset(int value) {
+  set uriOffset(int value) {
     assert(value == null || value >= 0);
     this._uriOffset = value;
   }
@@ -23669,9 +25268,7 @@
         _uriEnd = uriEnd,
         _uriOffset = uriOffset;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _offset = null;
@@ -23679,9 +25276,7 @@
     _uriOffset = null;
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._annotations == null) {
       signature.addInt(0);
@@ -23803,7 +25398,7 @@
       _combinators ??= <UnlinkedCombinatorBuilder>[];
 
   /// Combinators contained in this export declaration.
-  void set combinators(List<UnlinkedCombinatorBuilder> value) {
+  set combinators(List<UnlinkedCombinatorBuilder> value) {
     this._combinators = value;
   }
 
@@ -23813,7 +25408,7 @@
 
   /// Configurations used to control which library will actually be loaded at
   /// run-time.
-  void set configurations(List<UnlinkedConfigurationBuilder> value) {
+  set configurations(List<UnlinkedConfigurationBuilder> value) {
     this._configurations = value;
   }
 
@@ -23821,7 +25416,7 @@
   String get uri => _uri ??= '';
 
   /// URI used in the source code to reference the exported library.
-  void set uri(String value) {
+  set uri(String value) {
     this._uri = value;
   }
 
@@ -23833,17 +25428,13 @@
         _configurations = configurations,
         _uri = uri;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _combinators?.forEach((b) => b.flushInformative());
     _configurations?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._uri ?? '');
     if (this._combinators == null) {
@@ -23979,7 +25570,7 @@
       _assignmentOperators ??= <idl.UnlinkedExprAssignOperator>[];
 
   /// Sequence of operators used by assignment operations.
-  void set assignmentOperators(List<idl.UnlinkedExprAssignOperator> value) {
+  set assignmentOperators(List<idl.UnlinkedExprAssignOperator> value) {
     this._assignmentOperators = value;
   }
 
@@ -23987,7 +25578,7 @@
   List<double> get doubles => _doubles ??= <double>[];
 
   /// Sequence of 64-bit doubles consumed by the operation `pushDouble`.
-  void set doubles(List<double> value) {
+  set doubles(List<double> value) {
     this._doubles = value;
   }
 
@@ -23997,7 +25588,7 @@
   /// Sequence of unsigned 32-bit integers consumed by the operations
   /// `pushArgument`, `pushInt`, `shiftOr`, `concatenate`, `invokeConstructor`,
   /// `makeList`, and `makeMap`.
-  void set ints(List<int> value) {
+  set ints(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._ints = value;
   }
@@ -24007,7 +25598,7 @@
 
   /// Indicates whether the expression is a valid potentially constant
   /// expression.
-  void set isValidConst(bool value) {
+  set isValidConst(bool value) {
     this._isValidConst = value;
   }
 
@@ -24017,7 +25608,7 @@
 
   /// Sequence of operations to execute (starting with an empty stack) to form
   /// the constant value.
-  void set operations(List<idl.UnlinkedExprOperation> value) {
+  set operations(List<idl.UnlinkedExprOperation> value) {
     this._operations = value;
   }
 
@@ -24028,7 +25619,7 @@
   /// `pushReference`, `invokeConstructor`, `makeList`, and `makeMap`.  Note
   /// that in the case of `pushReference` (and sometimes `invokeConstructor` the
   /// actual entity being referred to may be something other than a type.
-  void set references(List<EntityRefBuilder> value) {
+  set references(List<EntityRefBuilder> value) {
     this._references = value;
   }
 
@@ -24037,7 +25628,7 @@
 
   /// String representation of the expression in a form suitable to be tokenized
   /// and parsed.
-  void set sourceRepresentation(String value) {
+  set sourceRepresentation(String value) {
     this._sourceRepresentation = value;
   }
 
@@ -24046,7 +25637,7 @@
 
   /// Sequence of strings consumed by the operations `pushString` and
   /// `invokeConstructor`.
-  void set strings(List<String> value) {
+  set strings(List<String> value) {
     this._strings = value;
   }
 
@@ -24068,16 +25659,12 @@
         _sourceRepresentation = sourceRepresentation,
         _strings = strings;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _references?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._operations == null) {
       signature.addInt(0);
@@ -24341,7 +25928,7 @@
       _annotations ??= <UnlinkedExprBuilder>[];
 
   /// Annotations for this import declaration.
-  void set annotations(List<UnlinkedExprBuilder> value) {
+  set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
 
@@ -24350,7 +25937,7 @@
       _combinators ??= <UnlinkedCombinatorBuilder>[];
 
   /// Combinators contained in this import declaration.
-  void set combinators(List<UnlinkedCombinatorBuilder> value) {
+  set combinators(List<UnlinkedCombinatorBuilder> value) {
     this._combinators = value;
   }
 
@@ -24360,7 +25947,7 @@
 
   /// Configurations used to control which library will actually be loaded at
   /// run-time.
-  void set configurations(List<UnlinkedConfigurationBuilder> value) {
+  set configurations(List<UnlinkedConfigurationBuilder> value) {
     this._configurations = value;
   }
 
@@ -24368,7 +25955,7 @@
   bool get isDeferred => _isDeferred ??= false;
 
   /// Indicates whether the import declaration uses the `deferred` keyword.
-  void set isDeferred(bool value) {
+  set isDeferred(bool value) {
     this._isDeferred = value;
   }
 
@@ -24376,7 +25963,7 @@
   bool get isImplicit => _isImplicit ??= false;
 
   /// Indicates whether the import declaration is implicit.
-  void set isImplicit(bool value) {
+  set isImplicit(bool value) {
     this._isImplicit = value;
   }
 
@@ -24385,7 +25972,7 @@
 
   /// If [isImplicit] is false, offset of the "import" keyword.  If [isImplicit]
   /// is true, zero.
-  void set offset(int value) {
+  set offset(int value) {
     assert(value == null || value >= 0);
     this._offset = value;
   }
@@ -24395,7 +25982,7 @@
 
   /// Offset of the prefix name relative to the beginning of the file, or zero
   /// if there is no prefix.
-  void set prefixOffset(int value) {
+  set prefixOffset(int value) {
     assert(value == null || value >= 0);
     this._prefixOffset = value;
   }
@@ -24407,7 +25994,7 @@
   /// import declaration, or zero if this import declaration declares no prefix.
   ///
   /// Note that multiple imports can declare the same prefix.
-  void set prefixReference(int value) {
+  set prefixReference(int value) {
     assert(value == null || value >= 0);
     this._prefixReference = value;
   }
@@ -24416,7 +26003,7 @@
   String get uri => _uri ??= '';
 
   /// URI used in the source code to reference the imported library.
-  void set uri(String value) {
+  set uri(String value) {
     this._uri = value;
   }
 
@@ -24425,7 +26012,7 @@
 
   /// End of the URI string (including quotes) relative to the beginning of the
   /// file.  If [isImplicit] is true, zero.
-  void set uriEnd(int value) {
+  set uriEnd(int value) {
     assert(value == null || value >= 0);
     this._uriEnd = value;
   }
@@ -24435,7 +26022,7 @@
 
   /// Offset of the URI string (including quotes) relative to the beginning of
   /// the file.  If [isImplicit] is true, zero.
-  void set uriOffset(int value) {
+  set uriOffset(int value) {
     assert(value == null || value >= 0);
     this._uriOffset = value;
   }
@@ -24464,9 +26051,7 @@
         _uriEnd = uriEnd,
         _uriOffset = uriOffset;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _combinators?.forEach((b) => b.flushInformative());
@@ -24477,9 +26062,7 @@
     _uriOffset = null;
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._uri ?? '');
     if (this._combinators == null) {
@@ -24740,7 +26323,7 @@
       _annotations ??= <UnlinkedExprBuilder>[];
 
   /// Annotations for this parameter.
-  void set annotations(List<UnlinkedExprBuilder> value) {
+  set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
 
@@ -24748,7 +26331,7 @@
   CodeRangeBuilder get codeRange => _codeRange;
 
   /// Code range of the parameter.
-  void set codeRange(CodeRangeBuilder value) {
+  set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
 
@@ -24757,7 +26340,7 @@
 
   /// If the parameter has a default value, the source text of the constant
   /// expression in the default value.  Otherwise the empty string.
-  void set defaultValueCode(String value) {
+  set defaultValueCode(String value) {
     this._defaultValueCode = value;
   }
 
@@ -24773,7 +26356,7 @@
   /// inferable, they are not marked as such in the summary; if their type is
   /// not specified, they always inherit the static type of the corresponding
   /// field.
-  void set inferredTypeSlot(int value) {
+  set inferredTypeSlot(int value) {
     assert(value == null || value >= 0);
     this._inferredTypeSlot = value;
   }
@@ -24787,7 +26370,7 @@
   /// `@covariant` behavior from a base class.
   ///
   /// Otherwise, zero.
-  void set inheritsCovariantSlot(int value) {
+  set inheritsCovariantSlot(int value) {
     assert(value == null || value >= 0);
     this._inheritsCovariantSlot = value;
   }
@@ -24797,7 +26380,7 @@
 
   /// The synthetic initializer function of the parameter.  Absent if the
   /// variable does not have an initializer.
-  void set initializer(UnlinkedExecutableBuilder value) {
+  set initializer(UnlinkedExecutableBuilder value) {
     this._initializer = value;
   }
 
@@ -24805,7 +26388,7 @@
   bool get isExplicitlyCovariant => _isExplicitlyCovariant ??= false;
 
   /// Indicates whether this parameter is explicitly marked as being covariant.
-  void set isExplicitlyCovariant(bool value) {
+  set isExplicitlyCovariant(bool value) {
     this._isExplicitlyCovariant = value;
   }
 
@@ -24813,7 +26396,7 @@
   bool get isFinal => _isFinal ??= false;
 
   /// Indicates whether the parameter is declared using the `final` keyword.
-  void set isFinal(bool value) {
+  set isFinal(bool value) {
     this._isFinal = value;
   }
 
@@ -24828,7 +26411,7 @@
   /// ```
   /// but is not function-typed if it does not, even if the type of the
   /// parameter is a function type.
-  void set isFunctionTyped(bool value) {
+  set isFunctionTyped(bool value) {
     this._isFunctionTyped = value;
   }
 
@@ -24837,15 +26420,16 @@
 
   /// Indicates whether this is an initializing formal parameter (i.e. it is
   /// declared using `this.` syntax).
-  void set isInitializingFormal(bool value) {
+  set isInitializingFormal(bool value) {
     this._isInitializingFormal = value;
   }
 
   @override
-  idl.UnlinkedParamKind get kind => _kind ??= idl.UnlinkedParamKind.required;
+  idl.UnlinkedParamKind get kind =>
+      _kind ??= idl.UnlinkedParamKind.requiredPositional;
 
   /// Kind of the parameter.
-  void set kind(idl.UnlinkedParamKind value) {
+  set kind(idl.UnlinkedParamKind value) {
     this._kind = value;
   }
 
@@ -24853,7 +26437,7 @@
   String get name => _name ??= '';
 
   /// Name of the parameter.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -24861,7 +26445,7 @@
   int get nameOffset => _nameOffset ??= 0;
 
   /// Offset of the parameter name relative to the beginning of the file.
-  void set nameOffset(int value) {
+  set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
   }
@@ -24871,7 +26455,7 @@
       _parameters ??= <UnlinkedParamBuilder>[];
 
   /// If [isFunctionTyped] is `true`, the parameters of the function type.
-  void set parameters(List<UnlinkedParamBuilder> value) {
+  set parameters(List<UnlinkedParamBuilder> value) {
     this._parameters = value;
   }
 
@@ -24881,7 +26465,7 @@
   /// If [isFunctionTyped] is `true`, the declared return type.  If
   /// [isFunctionTyped] is `false`, the declared type.  Absent if the type is
   /// implicit.
-  void set type(EntityRefBuilder value) {
+  set type(EntityRefBuilder value) {
     this._type = value;
   }
 
@@ -24889,7 +26473,7 @@
   int get visibleLength => _visibleLength ??= 0;
 
   /// The length of the visible range.
-  void set visibleLength(int value) {
+  set visibleLength(int value) {
     assert(value == null || value >= 0);
     this._visibleLength = value;
   }
@@ -24898,7 +26482,7 @@
   int get visibleOffset => _visibleOffset ??= 0;
 
   /// The beginning of the visible range.
-  void set visibleOffset(int value) {
+  set visibleOffset(int value) {
     assert(value == null || value >= 0);
     this._visibleOffset = value;
   }
@@ -24939,9 +26523,7 @@
         _visibleLength = visibleLength,
         _visibleOffset = visibleOffset;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _codeRange = null;
@@ -24954,9 +26536,7 @@
     _visibleOffset = null;
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     signature.addInt(this._inferredTypeSlot ?? 0);
@@ -25050,7 +26630,7 @@
     if (_isInitializingFormal == true) {
       fbBuilder.addBool(6, true);
     }
-    if (_kind != null && _kind != idl.UnlinkedParamKind.required) {
+    if (_kind != null && _kind != idl.UnlinkedParamKind.requiredPositional) {
       fbBuilder.addUint8(4, _kind.index);
     }
     if (offset_name != null) {
@@ -25181,7 +26761,7 @@
   @override
   idl.UnlinkedParamKind get kind {
     _kind ??= const _UnlinkedParamKindReader()
-        .vTableGet(_bc, _bcOffset, 4, idl.UnlinkedParamKind.required);
+        .vTableGet(_bc, _bcOffset, 4, idl.UnlinkedParamKind.requiredPositional);
     return _kind;
   }
 
@@ -25243,7 +26823,7 @@
     if (isFunctionTyped != false) _result["isFunctionTyped"] = isFunctionTyped;
     if (isInitializingFormal != false)
       _result["isInitializingFormal"] = isInitializingFormal;
-    if (kind != idl.UnlinkedParamKind.required)
+    if (kind != idl.UnlinkedParamKind.requiredPositional)
       _result["kind"] = kind.toString().split('.')[1];
     if (name != '') _result["name"] = name;
     if (nameOffset != 0) _result["nameOffset"] = nameOffset;
@@ -25293,7 +26873,7 @@
       _annotations ??= <UnlinkedExprBuilder>[];
 
   /// Annotations for this part declaration.
-  void set annotations(List<UnlinkedExprBuilder> value) {
+  set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
 
@@ -25302,7 +26882,7 @@
 
   /// End of the URI string (including quotes) relative to the beginning of the
   /// file.
-  void set uriEnd(int value) {
+  set uriEnd(int value) {
     assert(value == null || value >= 0);
     this._uriEnd = value;
   }
@@ -25312,7 +26892,7 @@
 
   /// Offset of the URI string (including quotes) relative to the beginning of
   /// the file.
-  void set uriOffset(int value) {
+  set uriOffset(int value) {
     assert(value == null || value >= 0);
     this._uriOffset = value;
   }
@@ -25323,18 +26903,14 @@
         _uriEnd = uriEnd,
         _uriOffset = uriOffset;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _uriEnd = null;
     _uriOffset = null;
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._annotations == null) {
       signature.addInt(0);
@@ -25442,7 +27018,7 @@
   idl.ReferenceKind get kind => _kind ??= idl.ReferenceKind.classOrEnum;
 
   /// The kind of object referred to by the name.
-  void set kind(idl.ReferenceKind value) {
+  set kind(idl.ReferenceKind value) {
     this._kind = value;
   }
 
@@ -25456,7 +27032,7 @@
   ///
   /// Unnamed constructors are not included since they do not constitute a
   /// separate name added to any namespace.
-  void set members(List<UnlinkedPublicNameBuilder> value) {
+  set members(List<UnlinkedPublicNameBuilder> value) {
     this._members = value;
   }
 
@@ -25464,7 +27040,7 @@
   String get name => _name ??= '';
 
   /// The name itself.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -25473,7 +27049,7 @@
 
   /// If the entity being referred to is generic, the number of type parameters
   /// it accepts.  Otherwise zero.
-  void set numTypeParameters(int value) {
+  set numTypeParameters(int value) {
     assert(value == null || value >= 0);
     this._numTypeParameters = value;
   }
@@ -25488,16 +27064,12 @@
         _name = name,
         _numTypeParameters = numTypeParameters;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _members?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     signature.addInt(this._kind == null ? 0 : this._kind.index);
@@ -25628,7 +27200,7 @@
       _exports ??= <UnlinkedExportPublicBuilder>[];
 
   /// Export declarations in the compilation unit.
-  void set exports(List<UnlinkedExportPublicBuilder> value) {
+  set exports(List<UnlinkedExportPublicBuilder> value) {
     this._exports = value;
   }
 
@@ -25640,7 +27212,7 @@
   ///
   /// TODO(paulberry): consider sorting these names to reduce unnecessary
   /// relinking.
-  void set names(List<UnlinkedPublicNameBuilder> value) {
+  set names(List<UnlinkedPublicNameBuilder> value) {
     this._names = value;
   }
 
@@ -25648,7 +27220,7 @@
   List<String> get parts => _parts ??= <String>[];
 
   /// URIs referenced by part declarations in the compilation unit.
-  void set parts(List<String> value) {
+  set parts(List<String> value) {
     this._parts = value;
   }
 
@@ -25660,17 +27232,13 @@
         _names = names,
         _parts = parts;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _exports?.forEach((b) => b.flushInformative());
     _names?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._names == null) {
       signature.addInt(0);
@@ -25819,7 +27387,7 @@
   /// Name of the entity being referred to.  For the pseudo-type `dynamic`, the
   /// string is "dynamic".  For the pseudo-type `void`, the string is "void".
   /// For the pseudo-type `bottom`, the string is "*bottom*".
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -25832,7 +27400,7 @@
   /// Prefix references must always point backward; that is, for all i, if
   /// UnlinkedUnit.references[i].prefixReference != 0, then
   /// UnlinkedUnit.references[i].prefixReference < i.
-  void set prefixReference(int value) {
+  set prefixReference(int value) {
     assert(value == null || value >= 0);
     this._prefixReference = value;
   }
@@ -25841,14 +27409,10 @@
       : _name = name,
         _prefixReference = prefixReference;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     signature.addInt(this._prefixReference ?? 0);
@@ -25940,7 +27504,7 @@
 
   /// The token that corresponds to this token, or `0` if this token is not
   /// the first of a pair of matching tokens (such as parentheses).
-  void set endGroup(List<int> value) {
+  set endGroup(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._endGroup = value;
   }
@@ -25951,21 +27515,21 @@
   /// Return `true` if this token is a synthetic token. A synthetic token is a
   /// token that was introduced by the parser in order to recover from an error
   /// in the code.
-  void set isSynthetic(List<bool> value) {
+  set isSynthetic(List<bool> value) {
     this._isSynthetic = value;
   }
 
   @override
   List<idl.UnlinkedTokenKind> get kind => _kind ??= <idl.UnlinkedTokenKind>[];
 
-  void set kind(List<idl.UnlinkedTokenKind> value) {
+  set kind(List<idl.UnlinkedTokenKind> value) {
     this._kind = value;
   }
 
   @override
   List<int> get length => _length ??= <int>[];
 
-  void set length(List<int> value) {
+  set length(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._length = value;
   }
@@ -25973,7 +27537,7 @@
   @override
   List<String> get lexeme => _lexeme ??= <String>[];
 
-  void set lexeme(List<String> value) {
+  set lexeme(List<String> value) {
     this._lexeme = value;
   }
 
@@ -25982,7 +27546,7 @@
 
   /// The next token in the token stream, `0` for [UnlinkedTokenType.EOF] or
   /// the last comment token.
-  void set next(List<int> value) {
+  set next(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._next = value;
   }
@@ -25990,7 +27554,7 @@
   @override
   List<int> get offset => _offset ??= <int>[];
 
-  void set offset(List<int> value) {
+  set offset(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._offset = value;
   }
@@ -26002,7 +27566,7 @@
   /// or `0` if there are no comments preceding this token. Additional comments
   /// can be reached by following the token stream using [next] until `0` is
   /// reached.
-  void set precedingComment(List<int> value) {
+  set precedingComment(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._precedingComment = value;
   }
@@ -26010,7 +27574,7 @@
   @override
   List<idl.UnlinkedTokenType> get type => _type ??= <idl.UnlinkedTokenType>[];
 
-  void set type(List<idl.UnlinkedTokenType> value) {
+  set type(List<idl.UnlinkedTokenType> value) {
     this._type = value;
   }
 
@@ -26034,14 +27598,10 @@
         _precedingComment = precedingComment,
         _type = type;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {}
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     if (this._endGroup == null) {
       signature.addInt(0);
@@ -26338,7 +27898,7 @@
       _annotations ??= <UnlinkedExprBuilder>[];
 
   /// Annotations for this typedef.
-  void set annotations(List<UnlinkedExprBuilder> value) {
+  set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
 
@@ -26346,7 +27906,7 @@
   CodeRangeBuilder get codeRange => _codeRange;
 
   /// Code range of the typedef.
-  void set codeRange(CodeRangeBuilder value) {
+  set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
 
@@ -26356,7 +27916,7 @@
 
   /// Documentation comment for the typedef, or `null` if there is no
   /// documentation comment.
-  void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
+  set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
 
@@ -26364,7 +27924,7 @@
   String get name => _name ??= '';
 
   /// Name of the typedef.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -26372,7 +27932,7 @@
   int get nameOffset => _nameOffset ??= 0;
 
   /// Offset of the typedef name relative to the beginning of the file.
-  void set nameOffset(int value) {
+  set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
   }
@@ -26387,7 +27947,7 @@
   /// raw type when specifying the bound of a type parameter.
   ///
   /// Otherwise, zero.
-  void set notSimplyBoundedSlot(int value) {
+  set notSimplyBoundedSlot(int value) {
     assert(value == null || value >= 0);
     this._notSimplyBoundedSlot = value;
   }
@@ -26397,7 +27957,7 @@
       _parameters ??= <UnlinkedParamBuilder>[];
 
   /// Parameters of the executable, if any.
-  void set parameters(List<UnlinkedParamBuilder> value) {
+  set parameters(List<UnlinkedParamBuilder> value) {
     this._parameters = value;
   }
 
@@ -26407,7 +27967,7 @@
   /// If [style] is [TypedefStyle.functionType], the return type of the typedef.
   /// If [style] is [TypedefStyle.genericFunctionType], the function type being
   /// defined.
-  void set returnType(EntityRefBuilder value) {
+  set returnType(EntityRefBuilder value) {
     this._returnType = value;
   }
 
@@ -26415,7 +27975,7 @@
   idl.TypedefStyle get style => _style ??= idl.TypedefStyle.functionType;
 
   /// The style of the typedef.
-  void set style(idl.TypedefStyle value) {
+  set style(idl.TypedefStyle value) {
     this._style = value;
   }
 
@@ -26424,7 +27984,7 @@
       _typeParameters ??= <UnlinkedTypeParamBuilder>[];
 
   /// Type parameters of the typedef, if any.
-  void set typeParameters(List<UnlinkedTypeParamBuilder> value) {
+  set typeParameters(List<UnlinkedTypeParamBuilder> value) {
     this._typeParameters = value;
   }
 
@@ -26450,9 +28010,7 @@
         _style = style,
         _typeParameters = typeParameters;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _codeRange = null;
@@ -26463,9 +28021,7 @@
     _typeParameters?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     signature.addBool(this._returnType != null);
@@ -26720,7 +28276,7 @@
       _annotations ??= <UnlinkedExprBuilder>[];
 
   /// Annotations for this type parameter.
-  void set annotations(List<UnlinkedExprBuilder> value) {
+  set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
 
@@ -26729,7 +28285,7 @@
 
   /// Bound of the type parameter, if a bound is explicitly declared.  Otherwise
   /// null.
-  void set bound(EntityRefBuilder value) {
+  set bound(EntityRefBuilder value) {
     this._bound = value;
   }
 
@@ -26737,7 +28293,7 @@
   CodeRangeBuilder get codeRange => _codeRange;
 
   /// Code range of the type parameter.
-  void set codeRange(CodeRangeBuilder value) {
+  set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
 
@@ -26745,7 +28301,7 @@
   String get name => _name ??= '';
 
   /// Name of the type parameter.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -26753,7 +28309,7 @@
   int get nameOffset => _nameOffset ??= 0;
 
   /// Offset of the type parameter name relative to the beginning of the file.
-  void set nameOffset(int value) {
+  set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
   }
@@ -26770,9 +28326,7 @@
         _name = name,
         _nameOffset = nameOffset;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _bound?.flushInformative();
@@ -26780,9 +28334,7 @@
     _nameOffset = null;
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     signature.addBool(this._bound != null);
@@ -26947,7 +28499,7 @@
   /// MD5 hash of the non-informative fields of the [UnlinkedUnit] (not
   /// including this one) as 16 unsigned 8-bit integer values.  This can be used
   /// to identify when the API of a unit may have changed.
-  void set apiSignature(List<int> value) {
+  set apiSignature(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._apiSignature = value;
   }
@@ -26957,7 +28509,7 @@
       _classes ??= <UnlinkedClassBuilder>[];
 
   /// Classes declared in the compilation unit.
-  void set classes(List<UnlinkedClassBuilder> value) {
+  set classes(List<UnlinkedClassBuilder> value) {
     this._classes = value;
   }
 
@@ -26965,7 +28517,7 @@
   CodeRangeBuilder get codeRange => _codeRange;
 
   /// Code range of the unit.
-  void set codeRange(CodeRangeBuilder value) {
+  set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
 
@@ -26973,7 +28525,7 @@
   List<UnlinkedEnumBuilder> get enums => _enums ??= <UnlinkedEnumBuilder>[];
 
   /// Enums declared in the compilation unit.
-  void set enums(List<UnlinkedEnumBuilder> value) {
+  set enums(List<UnlinkedEnumBuilder> value) {
     this._enums = value;
   }
 
@@ -26983,7 +28535,7 @@
 
   /// Top level executable objects (functions, getters, and setters) declared in
   /// the compilation unit.
-  void set executables(List<UnlinkedExecutableBuilder> value) {
+  set executables(List<UnlinkedExecutableBuilder> value) {
     this._executables = value;
   }
 
@@ -26992,7 +28544,7 @@
       _exports ??= <UnlinkedExportNonPublicBuilder>[];
 
   /// Export declarations in the compilation unit.
-  void set exports(List<UnlinkedExportNonPublicBuilder> value) {
+  set exports(List<UnlinkedExportNonPublicBuilder> value) {
     this._exports = value;
   }
 
@@ -27005,7 +28557,7 @@
       _imports ??= <UnlinkedImportBuilder>[];
 
   /// Import declarations in the compilation unit.
-  void set imports(List<UnlinkedImportBuilder> value) {
+  set imports(List<UnlinkedImportBuilder> value) {
     this._imports = value;
   }
 
@@ -27013,7 +28565,7 @@
   bool get isPartOf => _isPartOf ??= false;
 
   /// Indicates whether the unit contains a "part of" declaration.
-  void set isPartOf(bool value) {
+  set isPartOf(bool value) {
     this._isPartOf = value;
   }
 
@@ -27023,7 +28575,7 @@
 
   /// Annotations for the library declaration, or the empty list if there is no
   /// library declaration.
-  void set libraryAnnotations(List<UnlinkedExprBuilder> value) {
+  set libraryAnnotations(List<UnlinkedExprBuilder> value) {
     this._libraryAnnotations = value;
   }
 
@@ -27033,8 +28585,7 @@
 
   /// Documentation comment for the library, or `null` if there is no
   /// documentation comment.
-  void set libraryDocumentationComment(
-      UnlinkedDocumentationCommentBuilder value) {
+  set libraryDocumentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._libraryDocumentationComment = value;
   }
 
@@ -27042,7 +28593,7 @@
   String get libraryName => _libraryName ??= '';
 
   /// Name of the library (from a "library" declaration, if present).
-  void set libraryName(String value) {
+  set libraryName(String value) {
     this._libraryName = value;
   }
 
@@ -27051,7 +28602,7 @@
 
   /// Length of the library name as it appears in the source code (or 0 if the
   /// library has no name).
-  void set libraryNameLength(int value) {
+  set libraryNameLength(int value) {
     assert(value == null || value >= 0);
     this._libraryNameLength = value;
   }
@@ -27061,7 +28612,7 @@
 
   /// Offset of the library name relative to the beginning of the file (or 0 if
   /// the library has no name).
-  void set libraryNameOffset(int value) {
+  set libraryNameOffset(int value) {
     assert(value == null || value >= 0);
     this._libraryNameOffset = value;
   }
@@ -27070,7 +28621,7 @@
   List<int> get lineStarts => _lineStarts ??= <int>[];
 
   /// Offsets of the first character of each line in the source code.
-  void set lineStarts(List<int> value) {
+  set lineStarts(List<int> value) {
     assert(value == null || value.every((e) => e >= 0));
     this._lineStarts = value;
   }
@@ -27079,7 +28630,7 @@
   List<UnlinkedClassBuilder> get mixins => _mixins ??= <UnlinkedClassBuilder>[];
 
   /// Mixins declared in the compilation unit.
-  void set mixins(List<UnlinkedClassBuilder> value) {
+  set mixins(List<UnlinkedClassBuilder> value) {
     this._mixins = value;
   }
 
@@ -27087,7 +28638,7 @@
   List<UnlinkedPartBuilder> get parts => _parts ??= <UnlinkedPartBuilder>[];
 
   /// Part declarations in the compilation unit.
-  void set parts(List<UnlinkedPartBuilder> value) {
+  set parts(List<UnlinkedPartBuilder> value) {
     this._parts = value;
   }
 
@@ -27095,7 +28646,7 @@
   UnlinkedPublicNamespaceBuilder get publicNamespace => _publicNamespace;
 
   /// Unlinked public namespace of this compilation unit.
-  void set publicNamespace(UnlinkedPublicNamespaceBuilder value) {
+  set publicNamespace(UnlinkedPublicNamespaceBuilder value) {
     this._publicNamespace = value;
   }
 
@@ -27108,7 +28659,7 @@
   /// the absence of a reference in places where a reference is optional (for
   /// example [UnlinkedReference.prefixReference or
   /// UnlinkedImport.prefixReference]).
-  void set references(List<UnlinkedReferenceBuilder> value) {
+  set references(List<UnlinkedReferenceBuilder> value) {
     this._references = value;
   }
 
@@ -27117,7 +28668,7 @@
       _typedefs ??= <UnlinkedTypedefBuilder>[];
 
   /// Typedefs declared in the compilation unit.
-  void set typedefs(List<UnlinkedTypedefBuilder> value) {
+  set typedefs(List<UnlinkedTypedefBuilder> value) {
     this._typedefs = value;
   }
 
@@ -27126,7 +28677,7 @@
       _variables ??= <UnlinkedVariableBuilder>[];
 
   /// Top level variables declared in the compilation unit.
-  void set variables(List<UnlinkedVariableBuilder> value) {
+  set variables(List<UnlinkedVariableBuilder> value) {
     this._variables = value;
   }
 
@@ -27172,9 +28723,7 @@
         _typedefs = typedefs,
         _variables = variables;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _classes?.forEach((b) => b.flushInformative());
     _codeRange = null;
@@ -27195,9 +28744,7 @@
     _variables?.forEach((b) => b.flushInformative());
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addBool(this._publicNamespace != null);
     this._publicNamespace?.collectApiSignature(signature);
@@ -27722,6 +29269,272 @@
   String toString() => convert.json.encode(toJson());
 }
 
+class UnlinkedUnit2Builder extends Object
+    with _UnlinkedUnit2Mixin
+    implements idl.UnlinkedUnit2 {
+  List<int> _apiSignature;
+  List<String> _exports;
+  List<String> _imports;
+  bool _isPartOf;
+  List<int> _lineStarts;
+  List<String> _parts;
+
+  @override
+  List<int> get apiSignature => _apiSignature ??= <int>[];
+
+  /// The MD5 hash signature of the API portion of this unit. It depends on all
+  /// tokens that might affect APIs of declarations in the unit.
+  set apiSignature(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._apiSignature = value;
+  }
+
+  @override
+  List<String> get exports => _exports ??= <String>[];
+
+  /// URIs of `export` directives.
+  set exports(List<String> value) {
+    this._exports = value;
+  }
+
+  @override
+  List<String> get imports => _imports ??= <String>[];
+
+  /// URIs of `import` directives.
+  set imports(List<String> value) {
+    this._imports = value;
+  }
+
+  @override
+  bool get isPartOf => _isPartOf ??= false;
+
+  /// Is `true` if the unit contains a `part of` directive.
+  set isPartOf(bool value) {
+    this._isPartOf = value;
+  }
+
+  @override
+  List<int> get lineStarts => _lineStarts ??= <int>[];
+
+  /// Offsets of the first character of each line in the source code.
+  set lineStarts(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._lineStarts = value;
+  }
+
+  @override
+  List<String> get parts => _parts ??= <String>[];
+
+  /// URIs of `part` directives.
+  set parts(List<String> value) {
+    this._parts = value;
+  }
+
+  UnlinkedUnit2Builder(
+      {List<int> apiSignature,
+      List<String> exports,
+      List<String> imports,
+      bool isPartOf,
+      List<int> lineStarts,
+      List<String> parts})
+      : _apiSignature = apiSignature,
+        _exports = exports,
+        _imports = imports,
+        _isPartOf = isPartOf,
+        _lineStarts = lineStarts,
+        _parts = parts;
+
+  /// Flush [informative] data recursively.
+  void flushInformative() {
+    _lineStarts = null;
+  }
+
+  /// Accumulate non-[informative] data into [signature].
+  void collectApiSignature(api_sig.ApiSignature signature) {
+    if (this._apiSignature == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._apiSignature.length);
+      for (var x in this._apiSignature) {
+        signature.addInt(x);
+      }
+    }
+    if (this._exports == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._exports.length);
+      for (var x in this._exports) {
+        signature.addString(x);
+      }
+    }
+    if (this._imports == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._imports.length);
+      for (var x in this._imports) {
+        signature.addString(x);
+      }
+    }
+    signature.addBool(this._isPartOf == true);
+    if (this._parts == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._parts.length);
+      for (var x in this._parts) {
+        signature.addString(x);
+      }
+    }
+  }
+
+  List<int> toBuffer() {
+    fb.Builder fbBuilder = new fb.Builder();
+    return fbBuilder.finish(finish(fbBuilder), "UUN2");
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_apiSignature;
+    fb.Offset offset_exports;
+    fb.Offset offset_imports;
+    fb.Offset offset_lineStarts;
+    fb.Offset offset_parts;
+    if (!(_apiSignature == null || _apiSignature.isEmpty)) {
+      offset_apiSignature = fbBuilder.writeListUint32(_apiSignature);
+    }
+    if (!(_exports == null || _exports.isEmpty)) {
+      offset_exports = fbBuilder
+          .writeList(_exports.map((b) => fbBuilder.writeString(b)).toList());
+    }
+    if (!(_imports == null || _imports.isEmpty)) {
+      offset_imports = fbBuilder
+          .writeList(_imports.map((b) => fbBuilder.writeString(b)).toList());
+    }
+    if (!(_lineStarts == null || _lineStarts.isEmpty)) {
+      offset_lineStarts = fbBuilder.writeListUint32(_lineStarts);
+    }
+    if (!(_parts == null || _parts.isEmpty)) {
+      offset_parts = fbBuilder
+          .writeList(_parts.map((b) => fbBuilder.writeString(b)).toList());
+    }
+    fbBuilder.startTable();
+    if (offset_apiSignature != null) {
+      fbBuilder.addOffset(0, offset_apiSignature);
+    }
+    if (offset_exports != null) {
+      fbBuilder.addOffset(1, offset_exports);
+    }
+    if (offset_imports != null) {
+      fbBuilder.addOffset(2, offset_imports);
+    }
+    if (_isPartOf == true) {
+      fbBuilder.addBool(3, true);
+    }
+    if (offset_lineStarts != null) {
+      fbBuilder.addOffset(5, offset_lineStarts);
+    }
+    if (offset_parts != null) {
+      fbBuilder.addOffset(4, offset_parts);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+idl.UnlinkedUnit2 readUnlinkedUnit2(List<int> buffer) {
+  fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);
+  return const _UnlinkedUnit2Reader().read(rootRef, 0);
+}
+
+class _UnlinkedUnit2Reader extends fb.TableReader<_UnlinkedUnit2Impl> {
+  const _UnlinkedUnit2Reader();
+
+  @override
+  _UnlinkedUnit2Impl createObject(fb.BufferContext bc, int offset) =>
+      new _UnlinkedUnit2Impl(bc, offset);
+}
+
+class _UnlinkedUnit2Impl extends Object
+    with _UnlinkedUnit2Mixin
+    implements idl.UnlinkedUnit2 {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _UnlinkedUnit2Impl(this._bc, this._bcOffset);
+
+  List<int> _apiSignature;
+  List<String> _exports;
+  List<String> _imports;
+  bool _isPartOf;
+  List<int> _lineStarts;
+  List<String> _parts;
+
+  @override
+  List<int> get apiSignature {
+    _apiSignature ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
+    return _apiSignature;
+  }
+
+  @override
+  List<String> get exports {
+    _exports ??= const fb.ListReader<String>(const fb.StringReader())
+        .vTableGet(_bc, _bcOffset, 1, const <String>[]);
+    return _exports;
+  }
+
+  @override
+  List<String> get imports {
+    _imports ??= const fb.ListReader<String>(const fb.StringReader())
+        .vTableGet(_bc, _bcOffset, 2, const <String>[]);
+    return _imports;
+  }
+
+  @override
+  bool get isPartOf {
+    _isPartOf ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 3, false);
+    return _isPartOf;
+  }
+
+  @override
+  List<int> get lineStarts {
+    _lineStarts ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 5, const <int>[]);
+    return _lineStarts;
+  }
+
+  @override
+  List<String> get parts {
+    _parts ??= const fb.ListReader<String>(const fb.StringReader())
+        .vTableGet(_bc, _bcOffset, 4, const <String>[]);
+    return _parts;
+  }
+}
+
+abstract class _UnlinkedUnit2Mixin implements idl.UnlinkedUnit2 {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (apiSignature.isNotEmpty) _result["apiSignature"] = apiSignature;
+    if (exports.isNotEmpty) _result["exports"] = exports;
+    if (imports.isNotEmpty) _result["imports"] = imports;
+    if (isPartOf != false) _result["isPartOf"] = isPartOf;
+    if (lineStarts.isNotEmpty) _result["lineStarts"] = lineStarts;
+    if (parts.isNotEmpty) _result["parts"] = parts;
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+        "apiSignature": apiSignature,
+        "exports": exports,
+        "imports": imports,
+        "isPartOf": isPartOf,
+        "lineStarts": lineStarts,
+        "parts": parts,
+      };
+
+  @override
+  String toString() => convert.json.encode(toJson());
+}
+
 class UnlinkedVariableBuilder extends Object
     with _UnlinkedVariableMixin
     implements idl.UnlinkedVariable {
@@ -27734,6 +29547,7 @@
   bool _isConst;
   bool _isCovariant;
   bool _isFinal;
+  bool _isLate;
   bool _isStatic;
   String _name;
   int _nameOffset;
@@ -27745,7 +29559,7 @@
       _annotations ??= <UnlinkedExprBuilder>[];
 
   /// Annotations for this variable.
-  void set annotations(List<UnlinkedExprBuilder> value) {
+  set annotations(List<UnlinkedExprBuilder> value) {
     this._annotations = value;
   }
 
@@ -27753,7 +29567,7 @@
   CodeRangeBuilder get codeRange => _codeRange;
 
   /// Code range of the variable.
-  void set codeRange(CodeRangeBuilder value) {
+  set codeRange(CodeRangeBuilder value) {
     this._codeRange = value;
   }
 
@@ -27763,7 +29577,7 @@
 
   /// Documentation comment for the variable, or `null` if there is no
   /// documentation comment.
-  void set documentationComment(UnlinkedDocumentationCommentBuilder value) {
+  set documentationComment(UnlinkedDocumentationCommentBuilder value) {
     this._documentationComment = value;
   }
 
@@ -27774,7 +29588,7 @@
   /// [LinkedLibrary.types] contains the inferred type for this variable.  If
   /// there is no matching entry in [LinkedLibrary.types], then no type was
   /// inferred for this variable, so its static type is `dynamic`.
-  void set inferredTypeSlot(int value) {
+  set inferredTypeSlot(int value) {
     assert(value == null || value >= 0);
     this._inferredTypeSlot = value;
   }
@@ -27788,7 +29602,7 @@
   /// synthetic setter inherits `@covariant` behavior from a base class.
   ///
   /// Otherwise, zero.
-  void set inheritsCovariantSlot(int value) {
+  set inheritsCovariantSlot(int value) {
     assert(value == null || value >= 0);
     this._inheritsCovariantSlot = value;
   }
@@ -27798,7 +29612,7 @@
 
   /// The synthetic initializer function of the variable.  Absent if the
   /// variable does not have an initializer.
-  void set initializer(UnlinkedExecutableBuilder value) {
+  set initializer(UnlinkedExecutableBuilder value) {
     this._initializer = value;
   }
 
@@ -27806,7 +29620,7 @@
   bool get isConst => _isConst ??= false;
 
   /// Indicates whether the variable is declared using the `const` keyword.
-  void set isConst(bool value) {
+  set isConst(bool value) {
     this._isConst = value;
   }
 
@@ -27815,7 +29629,7 @@
 
   /// Indicates whether this variable is declared using the `covariant` keyword.
   /// This should be false for everything except instance fields.
-  void set isCovariant(bool value) {
+  set isCovariant(bool value) {
     this._isCovariant = value;
   }
 
@@ -27823,11 +29637,19 @@
   bool get isFinal => _isFinal ??= false;
 
   /// Indicates whether the variable is declared using the `final` keyword.
-  void set isFinal(bool value) {
+  set isFinal(bool value) {
     this._isFinal = value;
   }
 
   @override
+  bool get isLate => _isLate ??= false;
+
+  /// Indicates whether the variable is declared using the `late` keyword.
+  set isLate(bool value) {
+    this._isLate = value;
+  }
+
+  @override
   bool get isStatic => _isStatic ??= false;
 
   /// Indicates whether the variable is declared using the `static` keyword.
@@ -27835,7 +29657,7 @@
   /// Note that for top level variables, this flag is false, since they are not
   /// declared using the `static` keyword (even though they are considered
   /// static for semantic purposes).
-  void set isStatic(bool value) {
+  set isStatic(bool value) {
     this._isStatic = value;
   }
 
@@ -27843,7 +29665,7 @@
   String get name => _name ??= '';
 
   /// Name of the variable.
-  void set name(String value) {
+  set name(String value) {
     this._name = value;
   }
 
@@ -27851,7 +29673,7 @@
   int get nameOffset => _nameOffset ??= 0;
 
   /// Offset of the variable name relative to the beginning of the file.
-  void set nameOffset(int value) {
+  set nameOffset(int value) {
     assert(value == null || value >= 0);
     this._nameOffset = value;
   }
@@ -27865,7 +29687,7 @@
   /// propagated type is the same as its declared type.
   ///
   /// Non-propagable variables have a [propagatedTypeSlot] of zero.
-  void set propagatedTypeSlot(int value) {
+  set propagatedTypeSlot(int value) {
     assert(value == null || value >= 0);
     this._propagatedTypeSlot = value;
   }
@@ -27874,7 +29696,7 @@
   EntityRefBuilder get type => _type;
 
   /// Declared type of the variable.  Absent if the type is implicit.
-  void set type(EntityRefBuilder value) {
+  set type(EntityRefBuilder value) {
     this._type = value;
   }
 
@@ -27896,6 +29718,7 @@
       bool isConst,
       bool isCovariant,
       bool isFinal,
+      bool isLate,
       bool isStatic,
       String name,
       int nameOffset,
@@ -27910,15 +29733,14 @@
         _isConst = isConst,
         _isCovariant = isCovariant,
         _isFinal = isFinal,
+        _isLate = isLate,
         _isStatic = isStatic,
         _name = name,
         _nameOffset = nameOffset,
         _propagatedTypeSlot = propagatedTypeSlot,
         _type = type;
 
-  /**
-   * Flush [informative] data recursively.
-   */
+  /// Flush [informative] data recursively.
   void flushInformative() {
     _annotations?.forEach((b) => b.flushInformative());
     _codeRange = null;
@@ -27928,9 +29750,7 @@
     _type?.flushInformative();
   }
 
-  /**
-   * Accumulate non-[informative] data into [signature].
-   */
+  /// Accumulate non-[informative] data into [signature].
   void collectApiSignature(api_sig.ApiSignature signature) {
     signature.addString(this._name ?? '');
     signature.addInt(this._propagatedTypeSlot ?? 0);
@@ -27952,6 +29772,7 @@
     this._initializer?.collectApiSignature(signature);
     signature.addBool(this._isCovariant == true);
     signature.addInt(this._inheritsCovariantSlot ?? 0);
+    signature.addBool(this._isLate == true);
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
@@ -28008,6 +29829,9 @@
     if (_isFinal == true) {
       fbBuilder.addBool(7, true);
     }
+    if (_isLate == true) {
+      fbBuilder.addBool(16, true);
+    }
     if (_isStatic == true) {
       fbBuilder.addBool(4, true);
     }
@@ -28052,6 +29876,7 @@
   bool _isConst;
   bool _isCovariant;
   bool _isFinal;
+  bool _isLate;
   bool _isStatic;
   String _name;
   int _nameOffset;
@@ -28119,6 +29944,12 @@
   }
 
   @override
+  bool get isLate {
+    _isLate ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 16, false);
+    return _isLate;
+  }
+
+  @override
   bool get isStatic {
     _isStatic ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 4, false);
     return _isStatic;
@@ -28175,6 +30006,7 @@
     if (isConst != false) _result["isConst"] = isConst;
     if (isCovariant != false) _result["isCovariant"] = isCovariant;
     if (isFinal != false) _result["isFinal"] = isFinal;
+    if (isLate != false) _result["isLate"] = isLate;
     if (isStatic != false) _result["isStatic"] = isStatic;
     if (name != '') _result["name"] = name;
     if (nameOffset != 0) _result["nameOffset"] = nameOffset;
@@ -28195,6 +30027,7 @@
         "isConst": isConst,
         "isCovariant": isCovariant,
         "isFinal": isFinal,
+        "isLate": isLate,
         "isStatic": isStatic,
         "name": name,
         "nameOffset": nameOffset,
diff --git a/analyzer/lib/src/summary/format.fbs b/analyzer/lib/src/summary/format.fbs
index 6cd172f..e724a26 100644
--- a/analyzer/lib/src/summary/format.fbs
+++ b/analyzer/lib/src/summary/format.fbs
@@ -1,9 +1,11 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 //
 // This file has been automatically generated.  Please do not edit it manually.
-// To regenerate the file, use the script "pkg/analyzer/tool/generate_files".
+// To regenerate the file, use the SDK script
+// "pkg/analyzer/tool/summary/generate.dart $IDL_FILE_PATH",
+// or "pkg/analyzer/tool/generate_files" for the analyzer package IDL/sources.
 
 
 /// Enum of declaration kinds in available files.
@@ -12,6 +14,8 @@
 
   CLASS_TYPE_ALIAS,
 
+  CONSTRUCTOR,
+
   ENUM,
 
   ENUM_CONSTANT,
@@ -42,6 +46,30 @@
   syntheticFunction
 }
 
+/// Enum representing nullability suffixes in summaries.
+///
+/// This enum is similar to [NullabilitySuffix], but the order is different so
+/// that [EntityRefNullabilitySuffix.starOrIrrelevant] can be the default.
+enum EntityRefNullabilitySuffix : byte {
+  /// 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.
+  ///
+  /// Also used in circumstances where no nullability suffix information is
+  /// needed.
+  starOrIrrelevant,
+
+  /// 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.
+  question,
+
+  /// An indication that the canonical representation of the type under
+  /// consideration does not end with either `?` or `*`.
+  none
+}
+
 /// Enum used to indicate the kind of a name in index.
 enum IndexNameKind : byte {
   /// A top-level element.
@@ -148,11 +176,13 @@
 
 /// Kinds of formal parameters.
 enum LinkedNodeFormalParameterKind : byte {
-  required,
+  requiredPositional,
 
   optionalPositional,
 
-  optionalNamed
+  optionalNamed,
+
+  requiredNamed
 }
 
 /// Kinds of [LinkedNode].
@@ -193,6 +223,8 @@
 
   comment,
 
+  commentReference,
+
   compilationUnit,
 
   conditionalExpression,
@@ -309,6 +341,10 @@
 
   namedExpression,
 
+  nativeClause,
+
+  nativeFunctionBody,
+
   nullLiteral,
 
   onClause,
@@ -398,8 +434,6 @@
 
   function,
 
-  genericTypeAlias,
-
   interface,
 
   typeParameter,
@@ -991,19 +1025,91 @@
   /// other two are collection elements.  Push an "if" element having the given
   /// condition, with the two collection elements as its "then" and "else"
   /// clauses, respectively.
-  ifElseElement
+  ifElseElement,
+
+  /// Pop the top n+2 values from the stack, where n is obtained from
+  /// [UnlinkedExpr.ints].  The first two are the initialization and condition
+  /// of the for-loop; the remainder are the updaters.
+  forParts,
+
+  /// Pop the top 2 values from the stack.  The first is the for loop parts.
+  /// The second is the body.
+  forElement,
+
+  /// Push the empty expression (used for missing initializers and conditions in
+  /// `for` loops)
+  pushEmptyExpression,
+
+  /// Add a variable to the current scope whose name is obtained from
+  /// [UnlinkedExpr.strings].  This is separate from [variableDeclaration]
+  /// because the scope of the variable includes its own initializer.
+  variableDeclarationStart,
+
+  /// Pop the top value from the stack, and use it as the initializer for a
+  /// variable declaration; the variable being declared is obtained by looking
+  /// at the nth variable most recently added to the scope (where n counts from
+  /// zero and is obtained from [UnlinkedExpr.ints]).
+  variableDeclaration,
+
+  /// Pop the top n values from the stack, which should all be variable
+  /// declarations, and use them to create an untyped for-initializer
+  /// declaration.  The value of n is obtained from [UnlinkedExpr.ints].
+  forInitializerDeclarationsUntyped,
+
+  /// Pop the top n values from the stack, which should all be variable
+  /// declarations, and use them to create a typed for-initializer
+  /// declaration.  The value of n is obtained from [UnlinkedExpr.ints].  The
+  /// type is obtained from [UnlinkedExpr.references].
+  forInitializerDeclarationsTyped,
+
+  /// Pop from the stack `value` and get a string from [UnlinkedExpr.strings].
+  /// Use this string to look up a parameter.  Perform `parameter op= value`,
+  /// where `op` is the next assignment operator from
+  /// [UnlinkedExpr.assignmentOperators].  Push `value` back onto the stack.
+  ///
+  /// If the assignment operator is a prefix/postfix increment/decrement, then
+  /// `value` is not present in the stack, so it should not be popped and the
+  /// corresponding value of the parameter after/before update is pushed onto
+  /// the stack instead.
+  assignToParameter,
+
+  /// Pop from the stack an identifier and an expression, and create for-each
+  /// parts of the form `identifier in expression`.
+  forEachPartsWithIdentifier,
+
+  /// Pop the top 2 values from the stack.  The first is the for loop parts.
+  /// The second is the body.
+  forElementWithAwait,
+
+  /// Pop an expression from the stack, and create for-each parts of the form
+  /// `var name in expression`, where `name` is obtained from
+  /// [UnlinkedExpr.strings].
+  forEachPartsWithUntypedDeclaration,
+
+  /// Pop an expression from the stack, and create for-each parts of the form
+  /// `Type name in expression`, where `name` is obtained from
+  /// [UnlinkedExpr.strings], and `Type` is obtained from
+  /// [UnlinkedExpr.references].
+  forEachPartsWithTypedDeclaration,
+
+  /// Pop the top 2 values from the stack, compute `v1 >>> v2`, and push the
+  /// result back onto the stack.
+  bitShiftRightLogical
 }
 
 /// Enum used to indicate the kind of a parameter.
 enum UnlinkedParamKind : byte {
-  /// Parameter is required.
-  required,
+  /// Parameter is required and positional.
+  requiredPositional,
 
-  /// Parameter is positional optional (enclosed in `[]`)
-  positional,
+  /// Parameter is optional and positional (enclosed in `[]`)
+  optionalPositional,
 
-  /// Parameter is named optional (enclosed in `{}`)
-  named
+  /// Parameter is optional and named (enclosed in `{}`)
+  optionalNamed,
+
+  /// Parameter is required and named (enclosed in `{}`).
+  requiredNamed
 }
 
 /// TODO(scheglov) document
@@ -1049,6 +1155,8 @@
 
   BANG_EQ,
 
+  BANG_EQ_EQ,
+
   BAR,
 
   BAR_BAR,
@@ -1103,6 +1211,8 @@
 
   EQ_EQ,
 
+  EQ_EQ_EQ,
+
   EXPORT,
 
   EXTENDS,
@@ -1133,6 +1243,10 @@
 
   GT_GT_EQ,
 
+  GT_GT_GT,
+
+  GT_GT_GT_EQ,
+
   HASH,
 
   HEXADECIMAL,
@@ -1159,6 +1273,8 @@
 
   IS,
 
+  LATE,
+
   LIBRARY,
 
   LT,
@@ -1227,6 +1343,8 @@
 
   QUESTION_QUESTION_EQ,
 
+  REQUIRED,
+
   RETHROW,
 
   RETURN,
@@ -1466,44 +1584,45 @@
 
   /// Unlinked information for the unit.
   unit:UnlinkedUnit (id: 1);
+
+  /// Unlinked information for the unit.
+  unit2:UnlinkedUnit2 (id: 5);
 }
 
 /// Information about a single declaration.
 table AvailableDeclaration {
-  defaultArgumentListString:string (id: 0);
+  children:[AvailableDeclaration] (id: 0);
 
-  defaultArgumentListTextRanges:[uint] (id: 1);
+  defaultArgumentListString:string (id: 1);
 
-  docComplete:string (id: 2);
+  defaultArgumentListTextRanges:[uint] (id: 2);
 
-  docSummary:string (id: 3);
+  docComplete:string (id: 3);
 
-  fieldMask:uint (id: 4);
+  docSummary:string (id: 4);
 
-  isAbstract:bool (id: 5);
+  fieldMask:uint (id: 5);
 
-  isConst:bool (id: 6);
+  isAbstract:bool (id: 6);
 
-  isDeprecated:bool (id: 7);
+  isConst:bool (id: 7);
 
-  isFinal:bool (id: 8);
+  isDeprecated:bool (id: 8);
+
+  isFinal:bool (id: 9);
 
   /// The kind of the declaration.
-  kind:AvailableDeclarationKind (id: 9);
+  kind:AvailableDeclarationKind (id: 10);
 
-  locationOffset:uint (id: 10);
+  locationOffset:uint (id: 11);
 
-  locationStartColumn:uint (id: 11);
+  locationStartColumn:uint (id: 12);
 
-  locationStartLine:uint (id: 12);
+  locationStartLine:uint (id: 13);
 
   /// The first part of the declaration name, usually the only one, for example
   /// the name of a class like `MyClass`, or a function like `myFunction`.
-  name:string (id: 13);
-
-  /// The second, optional, part of the declaration name.  For example enum
-  /// constants all have the same [name], but their own [name2].
-  name2:string (id: 14);
+  name:string (id: 14);
 
   parameterNames:[string] (id: 15);
 
@@ -1529,6 +1648,9 @@
   /// Declarations of the file.
   declarations:[AvailableDeclaration] (id: 0);
 
+  /// The Dartdoc directives in the file.
+  directiveInfo:DirectiveInfo (id: 5);
+
   /// Exports directives of the file.
   exports:[AvailableFileExport] (id: 1);
 
@@ -1569,6 +1691,15 @@
   offset:uint (id: 0);
 }
 
+/// Information about the Dartdoc directives in an [AvailableFile].
+table DirectiveInfo {
+  /// The names of the defined templates.
+  templateNames:[string] (id: 0);
+
+  /// The values of the defined templates.
+  templateValues:[string] (id: 1);
+}
+
 /// Summary information about a reference to an entity such as a type, top level
 /// executable, or executable within a class.
 table EntityRef {
@@ -1603,6 +1734,9 @@
   /// first to the class and then to the method.
   implicitFunctionTypeIndices:[uint] (id: 4);
 
+  /// If the reference represents a type, the nullability of the type.
+  nullabilitySuffix:EntityRefNullabilitySuffix (id: 10);
+
   /// If this is a reference to a type parameter, one-based index into the list
   /// of [UnlinkedTypeParam]s currently in effect.  Indexing is done using De
   /// Bruijn index conventions; that is, innermost parameters come first, and
@@ -1749,6 +1883,9 @@
 
 /// Information about a linked AST node.
 table LinkedNode {
+  /// The explicit or inferred return type of a function typed node.
+  variantField_24:LinkedNodeType (id: 24);
+
   variantField_2:[LinkedNode] (id: 2);
 
   variantField_11:LinkedNode (id: 11);
@@ -1761,18 +1898,18 @@
 
   variantField_7:LinkedNode (id: 7);
 
+  variantField_17:uint (id: 17);
+
+  variantField_23:LinkedNodeType (id: 23);
+
   variantField_8:LinkedNode (id: 8);
 
   variantField_16:uint (id: 16);
 
-  variantField_17:uint (id: 17);
-
   variantField_18:uint (id: 18);
 
   variantField_19:uint (id: 19);
 
-  variantField_24:LinkedNodeType (id: 24);
-
   variantField_27:bool (id: 27);
 
   variantField_9:LinkedNode (id: 9);
@@ -1783,6 +1920,10 @@
 
   variantField_13:LinkedNode (id: 13);
 
+  variantField_34:uint (id: 34);
+
+  variantField_33:uint (id: 33);
+
   variantField_28:[uint] (id: 28);
 
   variantField_29:LinkedNodeCommentType (id: 29);
@@ -1791,12 +1932,12 @@
 
   variantField_10:LinkedNode (id: 10);
 
+  variantField_26:LinkedNodeFormalParameterKind (id: 26);
+
   variantField_21:double (id: 21);
 
   variantField_25:LinkedNodeType (id: 25);
 
-  variantField_26:LinkedNodeFormalParameterKind (id: 26);
-
   variantField_30:string (id: 30);
 
   variantField_14:LinkedNode (id: 14);
@@ -1805,11 +1946,13 @@
 
   kind:LinkedNodeKind (id: 0);
 
-  variantField_23:string (id: 23);
+  variantField_36:[string] (id: 36);
+
+  variantField_20:string (id: 20);
 
   variantField_31:bool (id: 31);
 
-  variantField_20:string (id: 20);
+  variantField_35:TopLevelInferenceError (id: 35);
 
   variantField_22:string (id: 22);
 
@@ -1849,13 +1992,15 @@
 
 /// Information about a Dart type.
 table LinkedNodeType {
-  /// References to [LinkedNodeReferences].
-  functionFormalParameters:[uint] (id: 0);
+  functionFormalParameters:[LinkedNodeTypeFormalParameter] (id: 0);
 
   functionReturnType:LinkedNodeType (id: 1);
 
-  /// References to [LinkedNodeReferences].
-  functionTypeParameters:[uint] (id: 2);
+  functionTypeParameters:[LinkedNodeTypeTypeParameter] (id: 2);
+
+  genericTypeAliasReference:uint (id: 8);
+
+  genericTypeAliasTypeArguments:[LinkedNodeType] (id: 9);
 
   /// Reference to a [LinkedNodeReferences].
   interfaceClass:uint (id: 3);
@@ -1864,12 +2009,36 @@
 
   kind:LinkedNodeTypeKind (id: 5);
 
-  /// Reference to a [LinkedNodeReferences].
-  typeParameterParameter:uint (id: 6);
+  nullabilitySuffix:EntityRefNullabilitySuffix (id: 10);
+
+  typeParameterElement:uint (id: 6);
+
+  typeParameterId:uint (id: 7);
+}
+
+/// Information about a formal parameter in a function type.
+table LinkedNodeTypeFormalParameter {
+  kind:LinkedNodeFormalParameterKind (id: 0);
+
+  name:string (id: 1);
+
+  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 {
+  isSynthetic:bool (id: 3);
+
+  /// Offsets of the first character of each line in the source code.
+  lineStarts:[uint] (id: 4);
+
   node:LinkedNode (id: 2);
 
   tokens:UnlinkedTokens (id: 1);
@@ -1880,13 +2049,15 @@
 /// Information about a top-level declaration, or a field declaration that
 /// contributes information to [LinkedNodeKind.variableDeclaration].
 table LinkedNodeVariablesDeclaration {
-  comment:LinkedNode (id: 3);
+  comment:LinkedNode (id: 0);
 
-  isConst:bool (id: 0);
+  isConst:bool (id: 1);
 
-  isFinal:bool (id: 1);
+  isCovariant:bool (id: 2);
 
-  isStatic:bool (id: 2);
+  isFinal:bool (id: 3);
+
+  isStatic:bool (id: 4);
 }
 
 /// Information about the resolution of an [UnlinkedReference].
@@ -2908,6 +3079,28 @@
   variables:[UnlinkedVariable] (id: 3);
 }
 
+/// Unlinked summary information about a compilation unit.
+table UnlinkedUnit2 {
+  /// The MD5 hash signature of the API portion of this unit. It depends on all
+  /// tokens that might affect APIs of declarations in the unit.
+  apiSignature:[uint] (id: 0);
+
+  /// URIs of `export` directives.
+  exports:[string] (id: 1);
+
+  /// URIs of `import` directives.
+  imports:[string] (id: 2);
+
+  /// Is `true` if the unit contains a `part of` directive.
+  isPartOf:bool (id: 3);
+
+  /// Offsets of the first character of each line in the source code.
+  lineStarts:[uint] (id: 5);
+
+  /// URIs of `part` directives.
+  parts:[string] (id: 4);
+}
+
 /// Unlinked summary information about a top level variable, local variable, or
 /// a field.
 table UnlinkedVariable {
@@ -2949,6 +3142,9 @@
   /// Indicates whether the variable is declared using the `final` keyword.
   isFinal:bool (id: 7);
 
+  /// Indicates whether the variable is declared using the `late` keyword.
+  isLate:bool (id: 16);
+
   /// Indicates whether the variable is declared using the `static` keyword.
   ///
   /// Note that for top level variables, this flag is false, since they are not
diff --git a/analyzer/lib/src/summary/idl.dart b/analyzer/lib/src/summary/idl.dart
index c9e84f8..e89bba2 100644
--- a/analyzer/lib/src/summary/idl.dart
+++ b/analyzer/lib/src/summary/idl.dart
@@ -283,59 +283,61 @@
   /// Unlinked information for the unit.
   @Id(1)
   UnlinkedUnit get unit;
+
+  /// Unlinked information for the unit.
+  @Id(5)
+  UnlinkedUnit2 get unit2;
 }
 
 /// Information about a single declaration.
 abstract class AvailableDeclaration extends base.SummaryClass {
   @Id(0)
-  String get defaultArgumentListString;
+  List<AvailableDeclaration> get children;
 
   @Id(1)
-  List<int> get defaultArgumentListTextRanges;
+  String get defaultArgumentListString;
 
   @Id(2)
-  String get docComplete;
+  List<int> get defaultArgumentListTextRanges;
 
   @Id(3)
-  String get docSummary;
+  String get docComplete;
 
   @Id(4)
-  int get fieldMask;
+  String get docSummary;
 
   @Id(5)
-  bool get isAbstract;
+  int get fieldMask;
 
   @Id(6)
-  bool get isConst;
+  bool get isAbstract;
 
   @Id(7)
-  bool get isDeprecated;
+  bool get isConst;
 
   @Id(8)
+  bool get isDeprecated;
+
+  @Id(9)
   bool get isFinal;
 
   /// The kind of the declaration.
-  @Id(9)
+  @Id(10)
   AvailableDeclarationKind get kind;
 
-  @Id(10)
+  @Id(11)
   int get locationOffset;
 
-  @Id(11)
+  @Id(12)
   int get locationStartColumn;
 
-  @Id(12)
+  @Id(13)
   int get locationStartLine;
 
   /// The first part of the declaration name, usually the only one, for example
   /// the name of a class like `MyClass`, or a function like `myFunction`.
-  @Id(13)
-  String get name;
-
-  /// The second, optional, part of the declaration name.  For example enum
-  /// constants all have the same [name], but their own [name2].
   @Id(14)
-  String get name2;
+  String get name;
 
   @Id(15)
   List<String> get parameterNames;
@@ -367,6 +369,7 @@
 enum AvailableDeclarationKind {
   CLASS,
   CLASS_TYPE_ALIAS,
+  CONSTRUCTOR,
   ENUM,
   ENUM_CONSTANT,
   FUNCTION,
@@ -387,6 +390,10 @@
   @Id(0)
   List<AvailableDeclaration> get declarations;
 
+  /// The Dartdoc directives in the file.
+  @Id(5)
+  DirectiveInfo get directiveInfo;
+
   /// Exports directives of the file.
   @Id(1)
   List<AvailableFileExport> get exports;
@@ -437,6 +444,17 @@
   int get offset;
 }
 
+/// Information about the Dartdoc directives in an [AvailableFile].
+abstract class DirectiveInfo extends base.SummaryClass {
+  /// The names of the defined templates.
+  @Id(0)
+  List<String> get templateNames;
+
+  /// The values of the defined templates.
+  @Id(1)
+  List<String> get templateValues;
+}
+
 /// Summary information about a reference to an entity such as a type, top level
 /// executable, or executable within a class.
 abstract class EntityRef extends base.SummaryClass {
@@ -473,6 +491,10 @@
   @Id(4)
   List<int> get implicitFunctionTypeIndices;
 
+  /// If the reference represents a type, the nullability of the type.
+  @Id(10)
+  EntityRefNullabilitySuffix get nullabilitySuffix;
+
   /// If this is a reference to a type parameter, one-based index into the list
   /// of [UnlinkedTypeParam]s currently in effect.  Indexing is done using De
   /// Bruijn index conventions; that is, innermost parameters come first, and
@@ -557,6 +579,30 @@
   syntheticFunction
 }
 
+/// Enum representing nullability suffixes in summaries.
+///
+/// This enum is similar to [NullabilitySuffix], but the order is different so
+/// that [EntityRefNullabilitySuffix.starOrIrrelevant] can be the default.
+enum EntityRefNullabilitySuffix {
+  /// 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.
+  ///
+  /// Also used in circumstances where no nullability suffix information is
+  /// needed.
+  starOrIrrelevant,
+
+  /// 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.
+  question,
+
+  /// An indication that the canonical representation of the type under
+  /// consideration does not end with either `?` or `*`.
+  none,
+}
+
 /// Enum used to indicate the kind of a name in index.
 enum IndexNameKind {
   /// A top-level element.
@@ -754,6 +800,25 @@
 /// Information about a linked AST node.
 @Variant('kind')
 abstract class LinkedNode extends base.SummaryClass {
+  /// The explicit or inferred return type of a function typed node.
+  @VariantId(24, variantList: [
+    LinkedNodeKind.functionDeclaration,
+    LinkedNodeKind.functionExpression,
+    LinkedNodeKind.functionTypeAlias,
+    LinkedNodeKind.genericFunctionType,
+    LinkedNodeKind.methodDeclaration,
+  ])
+  LinkedNodeType get actualReturnType;
+
+  /// The explicit or inferred type of a variable.
+  @VariantId(24, variantList: [
+    LinkedNodeKind.fieldFormalParameter,
+    LinkedNodeKind.functionTypedFormalParameter,
+    LinkedNodeKind.simpleFormalParameter,
+    LinkedNodeKind.variableDeclaration,
+  ])
+  LinkedNodeType get actualType;
+
   @VariantId(2, variant: LinkedNodeKind.adjacentStrings)
   List<LinkedNode> get adjacentStrings_strings;
 
@@ -816,6 +881,12 @@
   @VariantId(7, variant: LinkedNodeKind.annotation)
   LinkedNode get annotation_constructorName;
 
+  @VariantId(17, variant: LinkedNodeKind.annotation)
+  int get annotation_element;
+
+  @VariantId(23, variant: LinkedNodeKind.annotation)
+  LinkedNodeType get annotation_elementType;
+
   @VariantId(8, variant: LinkedNodeKind.annotation)
   LinkedNode get annotation_name;
 
@@ -882,6 +953,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;
 
@@ -900,6 +974,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;
 
@@ -990,6 +1067,9 @@
   @VariantId(27, variant: LinkedNodeKind.classDeclaration)
   bool get classDeclaration_isDartObject;
 
+  @VariantId(8, variant: LinkedNodeKind.classDeclaration)
+  LinkedNode get classDeclaration_nativeClause;
+
   @VariantId(7, variant: LinkedNodeKind.classDeclaration)
   LinkedNode get classDeclaration_withClause;
 
@@ -1041,18 +1121,67 @@
   @VariantId(8, variant: LinkedNodeKind.classTypeAlias)
   LinkedNode get classTypeAlias_withClause;
 
+  @VariantId(34, variantList: [
+    LinkedNodeKind.classDeclaration,
+    LinkedNodeKind.classTypeAlias,
+    LinkedNodeKind.compilationUnit,
+    LinkedNodeKind.constructorDeclaration,
+    LinkedNodeKind.defaultFormalParameter,
+    LinkedNodeKind.enumDeclaration,
+    LinkedNodeKind.fieldFormalParameter,
+    LinkedNodeKind.functionDeclaration,
+    LinkedNodeKind.functionTypeAlias,
+    LinkedNodeKind.functionTypedFormalParameter,
+    LinkedNodeKind.genericTypeAlias,
+    LinkedNodeKind.methodDeclaration,
+    LinkedNodeKind.mixinDeclaration,
+    LinkedNodeKind.simpleFormalParameter,
+    LinkedNodeKind.typeParameter,
+    LinkedNodeKind.variableDeclaration,
+  ])
+  int get codeLength;
+
+  @VariantId(33, variantList: [
+    LinkedNodeKind.classDeclaration,
+    LinkedNodeKind.classTypeAlias,
+    LinkedNodeKind.compilationUnit,
+    LinkedNodeKind.constructorDeclaration,
+    LinkedNodeKind.defaultFormalParameter,
+    LinkedNodeKind.enumDeclaration,
+    LinkedNodeKind.fieldFormalParameter,
+    LinkedNodeKind.functionDeclaration,
+    LinkedNodeKind.functionTypeAlias,
+    LinkedNodeKind.functionTypedFormalParameter,
+    LinkedNodeKind.genericTypeAlias,
+    LinkedNodeKind.methodDeclaration,
+    LinkedNodeKind.mixinDeclaration,
+    LinkedNodeKind.simpleFormalParameter,
+    LinkedNodeKind.typeParameter,
+    LinkedNodeKind.variableDeclaration,
+  ])
+  int get codeOffset;
+
   @VariantId(19, variantList: [
     LinkedNodeKind.hideCombinator,
     LinkedNodeKind.showCombinator,
   ])
   int get combinator_keyword;
 
+  @VariantId(2, variant: LinkedNodeKind.comment)
+  List<LinkedNode> get comment_references;
+
   @VariantId(28, variant: LinkedNodeKind.comment)
   List<int> get comment_tokens;
 
   @VariantId(29, variant: LinkedNodeKind.comment)
   LinkedNodeCommentType get comment_type;
 
+  @VariantId(6, variant: LinkedNodeKind.commentReference)
+  LinkedNode get commentReference_identifier;
+
+  @VariantId(15, variant: LinkedNodeKind.commentReference)
+  int get commentReference_newKeyword;
+
   @VariantId(15, variant: LinkedNodeKind.compilationUnit)
   int get compilationUnit_beginToken;
 
@@ -1155,6 +1284,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;
 
@@ -1185,8 +1317,8 @@
   @VariantId(6, variant: LinkedNodeKind.defaultFormalParameter)
   LinkedNode get defaultFormalParameter_defaultValue;
 
-  @VariantId(27, variant: LinkedNodeKind.defaultFormalParameter)
-  bool get defaultFormalParameter_isNamed;
+  @VariantId(26, variant: LinkedNodeKind.defaultFormalParameter)
+  LinkedNodeFormalParameterKind get defaultFormalParameter_kind;
 
   @VariantId(7, variant: LinkedNodeKind.defaultFormalParameter)
   LinkedNode get defaultFormalParameter_parameter;
@@ -1194,7 +1326,7 @@
   @VariantId(15, variant: LinkedNodeKind.defaultFormalParameter)
   int get defaultFormalParameter_separator;
 
-  @VariantId(17, variantList: [
+  @VariantId(18, variantList: [
     LinkedNodeKind.exportDirective,
     LinkedNodeKind.importDirective,
     LinkedNodeKind.libraryDirective,
@@ -1203,6 +1335,15 @@
   ])
   int get directive_keyword;
 
+  @VariantId(33, variantList: [
+    LinkedNodeKind.exportDirective,
+    LinkedNodeKind.importDirective,
+    LinkedNodeKind.libraryDirective,
+    LinkedNodeKind.partDirective,
+    LinkedNodeKind.partOfDirective,
+  ])
+  int get directive_semicolon;
+
   @VariantId(6, variant: LinkedNodeKind.doStatement)
   LinkedNode get doStatement_body;
 
@@ -1341,9 +1482,6 @@
   @VariantId(6, variant: LinkedNodeKind.fieldFormalParameter)
   LinkedNode get fieldFormalParameter_type;
 
-  @VariantId(24, variant: LinkedNodeKind.fieldFormalParameter)
-  LinkedNodeType get fieldFormalParameter_type2;
-
   @VariantId(7, variant: LinkedNodeKind.fieldFormalParameter)
   LinkedNode get fieldFormalParameter_typeParameters;
 
@@ -1368,13 +1506,6 @@
   @VariantId(7, variant: LinkedNodeKind.forElement)
   LinkedNode get forElement_body;
 
-  @VariantId(26, variantList: [
-    LinkedNodeKind.fieldFormalParameter,
-    LinkedNodeKind.functionTypedFormalParameter,
-    LinkedNodeKind.simpleFormalParameter,
-  ])
-  LinkedNodeFormalParameterKind get formalParameter_kind;
-
   @VariantId(15, variant: LinkedNodeKind.formalParameterList)
   int get formalParameterList_leftDelimiter;
 
@@ -1465,9 +1596,6 @@
   @VariantId(7, variant: LinkedNodeKind.functionDeclaration)
   LinkedNode get functionDeclaration_returnType;
 
-  @VariantId(24, variant: LinkedNodeKind.functionDeclaration)
-  LinkedNodeType get functionDeclaration_returnType2;
-
   @VariantId(6, variant: LinkedNodeKind.functionDeclarationStatement)
   LinkedNode get functionDeclarationStatement_functionDeclaration;
 
@@ -1489,9 +1617,6 @@
   @VariantId(7, variant: LinkedNodeKind.functionTypeAlias)
   LinkedNode get functionTypeAlias_returnType;
 
-  @VariantId(24, variant: LinkedNodeKind.functionTypeAlias)
-  LinkedNodeType get functionTypeAlias_returnType2;
-
   @VariantId(8, variant: LinkedNodeKind.functionTypeAlias)
   LinkedNode get functionTypeAlias_typeParameters;
 
@@ -1510,14 +1635,17 @@
   @VariantId(15, variant: LinkedNodeKind.genericFunctionType)
   int get genericFunctionType_functionKeyword;
 
+  @VariantId(17, variant: LinkedNodeKind.genericFunctionType)
+  int get genericFunctionType_id;
+
   @VariantId(16, variant: LinkedNodeKind.genericFunctionType)
   int get genericFunctionType_question;
 
   @VariantId(7, variant: LinkedNodeKind.genericFunctionType)
   LinkedNode get genericFunctionType_returnType;
 
-  @VariantId(24, variant: LinkedNodeKind.genericFunctionType)
-  LinkedNodeType get genericFunctionType_returnType2;
+  @VariantId(25, variant: LinkedNodeKind.genericFunctionType)
+  LinkedNodeType get genericFunctionType_type;
 
   @VariantId(6, variant: LinkedNodeKind.genericFunctionType)
   LinkedNode get genericFunctionType_typeParameters;
@@ -1594,18 +1722,32 @@
   @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;
 
-  @VariantId(16, variant: LinkedNodeKind.indexExpression)
+  @VariantId(17, variant: LinkedNodeKind.indexExpression)
   int get indexExpression_leftBracket;
 
-  @VariantId(17, variant: LinkedNodeKind.indexExpression)
+  @VariantId(16, variant: LinkedNodeKind.indexExpression)
+  int get indexExpression_period;
+
+  @VariantId(18, variant: LinkedNodeKind.indexExpression)
   int get indexExpression_rightBracket;
 
   @VariantId(7, variant: LinkedNodeKind.indexExpression)
   LinkedNode get indexExpression_target;
 
+  @VariantId(27, variantList: [
+    LinkedNodeKind.fieldFormalParameter,
+    LinkedNodeKind.functionTypedFormalParameter,
+    LinkedNodeKind.simpleFormalParameter,
+    LinkedNodeKind.variableDeclaration,
+  ])
+  bool get inheritsCovariant;
+
   @VariantId(6, variant: LinkedNodeKind.instanceCreationExpression)
   LinkedNode get instanceCreationExpression_arguments;
 
@@ -1738,9 +1880,6 @@
   @VariantId(8, variant: LinkedNodeKind.methodDeclaration)
   LinkedNode get methodDeclaration_returnType;
 
-  @VariantId(24, variant: LinkedNodeKind.methodDeclaration)
-  LinkedNodeType get methodDeclaration_returnType2;
-
   @VariantId(9, variant: LinkedNodeKind.methodDeclaration)
   LinkedNode get methodDeclaration_typeParameters;
 
@@ -1759,6 +1898,9 @@
   @VariantId(6, variant: LinkedNodeKind.mixinDeclaration)
   LinkedNode get mixinDeclaration_onClause;
 
+  @VariantId(36, variant: LinkedNodeKind.mixinDeclaration)
+  List<String> get mixinDeclaration_superInvokedNames;
+
   @VariantId(14, variantList: [
     LinkedNodeKind.classDeclaration,
     LinkedNodeKind.classTypeAlias,
@@ -1788,21 +1930,26 @@
   ])
   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(18, variantList: [
-    LinkedNodeKind.exportDirective,
-    LinkedNodeKind.importDirective,
-    LinkedNodeKind.libraryDirective,
-    LinkedNodeKind.partDirective,
-  ])
-  int get namespaceDirective_semicolon;
+  @VariantId(6, variant: LinkedNodeKind.nativeClause)
+  LinkedNode get nativeClause_name;
+
+  @VariantId(15, variant: LinkedNodeKind.nativeClause)
+  int get nativeClause_nativeKeyword;
+
+  @VariantId(15, variant: LinkedNodeKind.nativeFunctionBody)
+  int get nativeFunctionBody_nativeKeyword;
+
+  @VariantId(16, variant: LinkedNodeKind.nativeFunctionBody)
+  int get nativeFunctionBody_semicolon;
+
+  @VariantId(6, variant: LinkedNodeKind.nativeFunctionBody)
+  LinkedNode get nativeFunctionBody_stringLiteral;
 
   @VariantId(14, variantList: [
     LinkedNodeKind.fieldFormalParameter,
@@ -1825,13 +1972,6 @@
   ])
   LinkedNode get normalFormalParameter_identifier;
 
-  @VariantId(27, variantList: [
-    LinkedNodeKind.fieldFormalParameter,
-    LinkedNodeKind.functionTypedFormalParameter,
-    LinkedNodeKind.simpleFormalParameter,
-  ])
-  bool get normalFormalParameter_isCovariant;
-
   @VariantId(4, variantList: [
     LinkedNodeKind.fieldFormalParameter,
     LinkedNodeKind.functionTypedFormalParameter,
@@ -1839,6 +1979,13 @@
   ])
   List<LinkedNode> get normalFormalParameter_metadata;
 
+  @VariantId(18, variantList: [
+    LinkedNodeKind.fieldFormalParameter,
+    LinkedNodeKind.functionTypedFormalParameter,
+    LinkedNodeKind.simpleFormalParameter,
+  ])
+  int get normalFormalParameter_requiredKeyword;
+
   @VariantId(15, variant: LinkedNodeKind.nullLiteral)
   int get nullLiteral_literal;
 
@@ -1863,15 +2010,15 @@
   @VariantId(16, variant: LinkedNodeKind.partOfDirective)
   int get partOfDirective_ofKeyword;
 
-  @VariantId(15, variant: LinkedNodeKind.partOfDirective)
-  int get partOfDirective_semicolon;
-
   @VariantId(7, variant: LinkedNodeKind.partOfDirective)
   LinkedNode get partOfDirective_uri;
 
   @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;
 
@@ -1890,6 +2037,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;
 
@@ -1914,6 +2064,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;
 
@@ -1959,12 +2112,15 @@
   @VariantId(6, variant: LinkedNodeKind.simpleFormalParameter)
   LinkedNode get simpleFormalParameter_type;
 
-  @VariantId(24, variant: LinkedNodeKind.simpleFormalParameter)
-  LinkedNodeType get simpleFormalParameter_type2;
-
   @VariantId(15, variant: LinkedNodeKind.simpleIdentifier)
   int get simpleIdentifier_element;
 
+  @VariantId(23, variant: LinkedNodeKind.simpleIdentifier)
+  LinkedNodeType get simpleIdentifier_elementType;
+
+  @VariantId(27, variant: LinkedNodeKind.simpleIdentifier)
+  bool get simpleIdentifier_isDeclaration;
+
   @VariantId(16, variant: LinkedNodeKind.simpleIdentifier)
   int get simpleIdentifier_token;
 
@@ -1974,6 +2130,15 @@
   @VariantId(20, variant: LinkedNodeKind.simpleStringLiteral)
   String get simpleStringLiteral_value;
 
+  @VariantId(31, variantList: [
+    LinkedNodeKind.classDeclaration,
+    LinkedNodeKind.classTypeAlias,
+    LinkedNodeKind.functionTypeAlias,
+    LinkedNodeKind.genericTypeAlias,
+    LinkedNodeKind.mixinDeclaration,
+  ])
+  bool get simplyBoundable_isSimplyBounded;
+
   @VariantId(6, variant: LinkedNodeKind.spreadElement)
   LinkedNode get spreadElement_expression;
 
@@ -1992,6 +2157,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;
 
@@ -2064,6 +2232,12 @@
   @VariantId(15, variant: LinkedNodeKind.throwExpression)
   int get throwExpression_throwKeyword;
 
+  @VariantId(35, variantList: [
+    LinkedNodeKind.simpleFormalParameter,
+    LinkedNodeKind.variableDeclaration,
+  ])
+  TopLevelInferenceError get topLevelTypeInferenceError;
+
   @VariantId(15, variant: LinkedNodeKind.topLevelVariableDeclaration)
   int get topLevelVariableDeclaration_semicolon;
 
@@ -2085,6 +2259,12 @@
   @VariantId(16, variant: LinkedNodeKind.tryStatement)
   int get tryStatement_tryKeyword;
 
+  @VariantId(27, variantList: [
+    LinkedNodeKind.functionTypeAlias,
+    LinkedNodeKind.genericTypeAlias,
+  ])
+  bool get typeAlias_hasSelfReference;
+
   @VariantId(19, variantList: [
     LinkedNodeKind.classTypeAlias,
     LinkedNodeKind.functionTypeAlias,
@@ -2126,7 +2306,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)
@@ -2135,6 +2315,9 @@
   @VariantId(6, variant: LinkedNodeKind.typeParameter)
   LinkedNode get typeParameter_bound;
 
+  @VariantId(23, variant: LinkedNodeKind.typeParameter)
+  LinkedNodeType get typeParameter_defaultType;
+
   @VariantId(15, variant: LinkedNodeKind.typeParameter)
   int get typeParameter_extendsKeyword;
 
@@ -2183,12 +2366,12 @@
   @VariantId(7, variant: LinkedNodeKind.variableDeclaration)
   LinkedNode get variableDeclaration_name;
 
-  @VariantId(24, variant: LinkedNodeKind.variableDeclaration)
-  LinkedNodeType get variableDeclaration_type2;
-
   @VariantId(15, variant: LinkedNodeKind.variableDeclarationList)
   int get variableDeclarationList_keyword;
 
+  @VariantId(16, variant: LinkedNodeKind.variableDeclarationList)
+  int get variableDeclarationList_lateKeyword;
+
   @VariantId(6, variant: LinkedNodeKind.variableDeclarationList)
   LinkedNode get variableDeclarationList_type;
 
@@ -2255,9 +2438,10 @@
 
 /// Kinds of formal parameters.
 enum LinkedNodeFormalParameterKind {
-  required,
+  requiredPositional,
   optionalPositional,
-  optionalNamed
+  optionalNamed,
+  requiredNamed
 }
 
 /// Kinds of [LinkedNode].
@@ -2280,6 +2464,7 @@
   classDeclaration,
   classTypeAlias,
   comment,
+  commentReference,
   compilationUnit,
   conditionalExpression,
   configuration,
@@ -2338,6 +2523,8 @@
   methodInvocation,
   mixinDeclaration,
   namedExpression,
+  nativeClause,
+  nativeFunctionBody,
   nullLiteral,
   onClause,
   parenthesizedExpression,
@@ -2412,16 +2599,20 @@
 
 /// Information about a Dart type.
 abstract class LinkedNodeType extends base.SummaryClass {
-  /// References to [LinkedNodeReferences].
   @Id(0)
-  List<int> get functionFormalParameters;
+  List<LinkedNodeTypeFormalParameter> get functionFormalParameters;
 
   @Id(1)
   LinkedNodeType get functionReturnType;
 
-  /// References to [LinkedNodeReferences].
   @Id(2)
-  List<int> get functionTypeParameters;
+  List<LinkedNodeTypeTypeParameter> get functionTypeParameters;
+
+  @Id(8)
+  int get genericTypeAliasReference;
+
+  @Id(9)
+  List<LinkedNodeType> get genericTypeAliasTypeArguments;
 
   /// Reference to a [LinkedNodeReferences].
   @Id(3)
@@ -2433,9 +2624,26 @@
   @Id(5)
   LinkedNodeTypeKind get kind;
 
-  /// Reference to a [LinkedNodeReferences].
+  @Id(10)
+  EntityRefNullabilitySuffix get nullabilitySuffix;
+
   @Id(6)
-  int get typeParameterParameter;
+  int get typeParameterElement;
+
+  @Id(7)
+  int get typeParameterId;
+}
+
+/// Information about a formal parameter in a function type.
+abstract class LinkedNodeTypeFormalParameter extends base.SummaryClass {
+  @Id(0)
+  LinkedNodeFormalParameterKind get kind;
+
+  @Id(1)
+  String get name;
+
+  @Id(2)
+  LinkedNodeType get type;
 }
 
 /// Kinds of [LinkedNodeType]s.
@@ -2443,14 +2651,30 @@
   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(3)
+  bool get isSynthetic;
+
+  /// Offsets of the first character of each line in the source code.
+  @informative
+  @Id(4)
+  List<int> get lineStarts;
+
   @Id(2)
   LinkedNode get node;
 
@@ -2464,16 +2688,19 @@
 /// Information about a top-level declaration, or a field declaration that
 /// contributes information to [LinkedNodeKind.variableDeclaration].
 abstract class LinkedNodeVariablesDeclaration extends base.SummaryClass {
-  @Id(3)
+  @Id(0)
   LinkedNode get comment;
 
-  @Id(0)
+  @Id(1)
   bool get isConst;
 
-  @Id(1)
+  @Id(2)
+  bool get isCovariant;
+
+  @Id(3)
   bool get isFinal;
 
-  @Id(2)
+  @Id(4)
   bool get isStatic;
 }
 
@@ -3887,6 +4114,75 @@
   /// condition, with the two collection elements as its "then" and "else"
   /// clauses, respectively.
   ifElseElement,
+
+  /// Pop the top n+2 values from the stack, where n is obtained from
+  /// [UnlinkedExpr.ints].  The first two are the initialization and condition
+  /// of the for-loop; the remainder are the updaters.
+  forParts,
+
+  /// Pop the top 2 values from the stack.  The first is the for loop parts.
+  /// The second is the body.
+  forElement,
+
+  /// Push the empty expression (used for missing initializers and conditions in
+  /// `for` loops)
+  pushEmptyExpression,
+
+  /// Add a variable to the current scope whose name is obtained from
+  /// [UnlinkedExpr.strings].  This is separate from [variableDeclaration]
+  /// because the scope of the variable includes its own initializer.
+  variableDeclarationStart,
+
+  /// Pop the top value from the stack, and use it as the initializer for a
+  /// variable declaration; the variable being declared is obtained by looking
+  /// at the nth variable most recently added to the scope (where n counts from
+  /// zero and is obtained from [UnlinkedExpr.ints]).
+  variableDeclaration,
+
+  /// Pop the top n values from the stack, which should all be variable
+  /// declarations, and use them to create an untyped for-initializer
+  /// declaration.  The value of n is obtained from [UnlinkedExpr.ints].
+  forInitializerDeclarationsUntyped,
+
+  /// Pop the top n values from the stack, which should all be variable
+  /// declarations, and use them to create a typed for-initializer
+  /// declaration.  The value of n is obtained from [UnlinkedExpr.ints].  The
+  /// type is obtained from [UnlinkedExpr.references].
+  forInitializerDeclarationsTyped,
+
+  /// Pop from the stack `value` and get a string from [UnlinkedExpr.strings].
+  /// Use this string to look up a parameter.  Perform `parameter op= value`,
+  /// where `op` is the next assignment operator from
+  /// [UnlinkedExpr.assignmentOperators].  Push `value` back onto the stack.
+  ///
+  /// If the assignment operator is a prefix/postfix increment/decrement, then
+  /// `value` is not present in the stack, so it should not be popped and the
+  /// corresponding value of the parameter after/before update is pushed onto
+  /// the stack instead.
+  assignToParameter,
+
+  /// Pop from the stack an identifier and an expression, and create for-each
+  /// parts of the form `identifier in expression`.
+  forEachPartsWithIdentifier,
+
+  /// Pop the top 2 values from the stack.  The first is the for loop parts.
+  /// The second is the body.
+  forElementWithAwait,
+
+  /// Pop an expression from the stack, and create for-each parts of the form
+  /// `var name in expression`, where `name` is obtained from
+  /// [UnlinkedExpr.strings].
+  forEachPartsWithUntypedDeclaration,
+
+  /// Pop an expression from the stack, and create for-each parts of the form
+  /// `Type name in expression`, where `name` is obtained from
+  /// [UnlinkedExpr.strings], and `Type` is obtained from
+  /// [UnlinkedExpr.references].
+  forEachPartsWithTypedDeclaration,
+
+  /// Pop the top 2 values from the stack, compute `v1 >>> v2`, and push the
+  /// result back onto the stack.
+  bitShiftRightLogical,
 }
 
 /// Unlinked summary information about an import declaration.
@@ -4051,14 +4347,17 @@
 
 /// Enum used to indicate the kind of a parameter.
 enum UnlinkedParamKind {
-  /// Parameter is required.
-  required,
+  /// Parameter is required and positional.
+  requiredPositional,
 
-  /// Parameter is positional optional (enclosed in `[]`)
-  positional,
+  /// Parameter is optional and positional (enclosed in `[]`)
+  optionalPositional,
 
-  /// Parameter is named optional (enclosed in `{}`)
-  named
+  /// Parameter is optional and named (enclosed in `{}`)
+  optionalNamed,
+
+  /// Parameter is required and named (enclosed in `{}`).
+  requiredNamed
 }
 
 /// Unlinked summary information about a part declaration.
@@ -4213,6 +4512,7 @@
   BACKSLASH,
   BANG,
   BANG_EQ,
+  BANG_EQ_EQ,
   BAR,
   BAR_BAR,
   BAR_EQ,
@@ -4240,6 +4540,7 @@
   EOF,
   EQ,
   EQ_EQ,
+  EQ_EQ_EQ,
   EXPORT,
   EXTENDS,
   EXTERNAL,
@@ -4255,6 +4556,8 @@
   GT_EQ,
   GT_GT,
   GT_GT_EQ,
+  GT_GT_GT,
+  GT_GT_GT_EQ,
   HASH,
   HEXADECIMAL,
   HIDE,
@@ -4268,6 +4571,7 @@
   INT,
   INTERFACE,
   IS,
+  LATE,
   LIBRARY,
   LT,
   LT_EQ,
@@ -4302,6 +4606,7 @@
   QUESTION_PERIOD,
   QUESTION_QUESTION,
   QUESTION_QUESTION_EQ,
+  REQUIRED,
   RETHROW,
   RETURN,
   SCRIPT_TAG,
@@ -4529,6 +4834,39 @@
   List<UnlinkedVariable> get variables;
 }
 
+/// Unlinked summary information about a compilation unit.
+@TopLevel('UUN2')
+abstract class UnlinkedUnit2 extends base.SummaryClass {
+  factory UnlinkedUnit2.fromBuffer(List<int> buffer) =>
+      generated.readUnlinkedUnit2(buffer);
+
+  /// The MD5 hash signature of the API portion of this unit. It depends on all
+  /// tokens that might affect APIs of declarations in the unit.
+  @Id(0)
+  List<int> get apiSignature;
+
+  /// URIs of `export` directives.
+  @Id(1)
+  List<String> get exports;
+
+  /// URIs of `import` directives.
+  @Id(2)
+  List<String> get imports;
+
+  /// Is `true` if the unit contains a `part of` directive.
+  @Id(3)
+  bool get isPartOf;
+
+  /// Offsets of the first character of each line in the source code.
+  @informative
+  @Id(5)
+  List<int> get lineStarts;
+
+  /// URIs of `part` directives.
+  @Id(4)
+  List<String> get parts;
+}
+
 /// Unlinked summary information about a top level variable, local variable, or
 /// a field.
 abstract class UnlinkedVariable extends base.SummaryClass {
@@ -4581,6 +4919,10 @@
   @Id(7)
   bool get isFinal;
 
+  /// Indicates whether the variable is declared using the `late` keyword.
+  @Id(16)
+  bool get isLate;
+
   /// Indicates whether the variable is declared using the `static` keyword.
   ///
   /// Note that for top level variables, this flag is false, since they are not
diff --git a/analyzer/lib/src/summary/link.dart b/analyzer/lib/src/summary/link.dart
index d38b602..8b77137 100644
--- a/analyzer/lib/src/summary/link.dart
+++ b/analyzer/lib/src/summary/link.dart
@@ -56,12 +56,14 @@
 /// - Where possible, we favor method dispatch instead of "is" and "as"
 ///   checks.  E.g. see [ReferenceableElementForLink.asConstructor].
 import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/builder.dart';
@@ -316,12 +318,14 @@
     TypeParameterSerializationContext typeParameterContext) {
   UnlinkedParamBuilder b = new UnlinkedParamBuilder();
   b.name = parameter.name;
-  if (parameter.isNotOptional) {
-    b.kind = UnlinkedParamKind.required;
+  if (parameter.isRequiredPositional) {
+    b.kind = UnlinkedParamKind.requiredPositional;
+  } else if (parameter.isRequiredNamed) {
+    b.kind = UnlinkedParamKind.requiredNamed;
   } else if (parameter.isOptionalPositional) {
-    b.kind = UnlinkedParamKind.positional;
-  } else if (parameter.isNamed) {
-    b.kind = UnlinkedParamKind.named;
+    b.kind = UnlinkedParamKind.optionalPositional;
+  } else if (parameter.isOptionalNamed) {
+    b.kind = UnlinkedParamKind.optionalNamed;
   }
   DartType type = parameter.type;
   if (!parameter.hasImplicitType) {
@@ -1906,9 +1910,13 @@
         case UnlinkedExprOperation.makeUntypedMap:
         case UnlinkedExprOperation.makeUntypedSet:
         case UnlinkedExprOperation.makeUntypedSetOrMap:
+        case UnlinkedExprOperation.forParts:
+        case UnlinkedExprOperation.variableDeclaration:
+        case UnlinkedExprOperation.forInitializerDeclarationsUntyped:
           intPtr++;
           break;
         case UnlinkedExprOperation.assignToRef:
+        case UnlinkedExprOperation.forEachPartsWithTypedDeclaration:
           refPtr++;
           break;
         case UnlinkedExprOperation.invokeMethodRef:
@@ -1929,6 +1937,7 @@
           break;
         case UnlinkedExprOperation.makeTypedList:
         case UnlinkedExprOperation.makeTypedSet:
+        case UnlinkedExprOperation.forInitializerDeclarationsTyped:
           refPtr++;
           intPtr++;
           break;
@@ -2449,8 +2458,14 @@
           new TypeParameterScope(nameScope, enclosingClass), enclosingClass);
     }
     var inheritance = new InheritanceManager2(linker.typeSystem);
+    // Note: this is a bit of a hack; we ought to use the feature set for the
+    // compilation unit being analyzed, but that's not feasible because sumaries
+    // don't record the feature set.  This should be resolved when we switch to
+    // the "summary2" mechanism.
+    var featureSet = FeatureSet.fromEnableFlags([]);
     var resolverVisitor = new ResolverVisitor(
         inheritance, library, source, typeProvider, errorListener,
+        featureSet: featureSet,
         nameScope: nameScope,
         propagateTypes: false,
         reportConstEvaluationErrors: false);
@@ -2459,9 +2474,9 @@
         nameScope: nameScope);
     var variableResolverVisitor = new VariableResolverVisitor(
         library, source, typeProvider, errorListener,
-        nameScope: nameScope);
+        nameScope: nameScope, localVariableInfo: LocalVariableInfo());
     var partialResolverVisitor = new PartialResolverVisitor(
-        inheritance, library, source, typeProvider, errorListener,
+        inheritance, library, source, typeProvider, errorListener, featureSet,
         nameScope: nameScope);
     return new ExprTypeComputer._(
         unit._unitResynthesizer,
@@ -2562,6 +2577,9 @@
             initializerForInference);
 
   @override
+  bool get isLate => unlinkedVariable.isLate;
+
+  @override
   bool get isStatic => unlinkedVariable.isStatic;
 
   @override
@@ -4284,10 +4302,14 @@
   bool get isInitializingFormal => unlinkedParam.isInitializingFormal;
 
   @override
-  bool get isNamed => parameterKind == ParameterKind.NAMED;
+  bool get isNamed =>
+      parameterKind == ParameterKind.NAMED ||
+      parameterKind == ParameterKind.NAMED_REQUIRED;
 
   @override
-  bool get isNotOptional => parameterKind == ParameterKind.REQUIRED;
+  bool get isNotOptional =>
+      parameterKind == ParameterKind.REQUIRED ||
+      parameterKind == ParameterKind.NAMED_REQUIRED;
 
   @override
   bool get isOptional =>
@@ -4295,6 +4317,9 @@
       parameterKind == ParameterKind.POSITIONAL;
 
   @override
+  bool get isOptionalNamed => parameterKind == ParameterKind.NAMED;
+
+  @override
   bool get isOptionalPositional => parameterKind == ParameterKind.POSITIONAL;
 
   @override
@@ -4303,16 +4328,27 @@
       parameterKind == ParameterKind.REQUIRED;
 
   @override
+  bool get isRequiredNamed => parameterKind == ParameterKind.NAMED_REQUIRED;
+
+  @override
+  bool get isRequiredPositional => parameterKind == ParameterKind.REQUIRED;
+
+  @override
+  get linkedNode => null;
+
+  @override
   String get name => unlinkedParam.name;
 
   @override
   ParameterKind get parameterKind {
     switch (unlinkedParam.kind) {
-      case UnlinkedParamKind.required:
+      case UnlinkedParamKind.requiredPositional:
         return ParameterKind.REQUIRED;
-      case UnlinkedParamKind.positional:
+      case UnlinkedParamKind.requiredNamed:
+        return ParameterKind.NAMED_REQUIRED;
+      case UnlinkedParamKind.optionalPositional:
         return ParameterKind.POSITIONAL;
-      case UnlinkedParamKind.named:
+      case UnlinkedParamKind.optionalNamed:
         return ParameterKind.NAMED;
     }
     return null;
@@ -4396,10 +4432,14 @@
   bool get isInitializingFormal => unlinkedParam.isInitializingFormal;
 
   @override
-  bool get isNamed => parameterKind == ParameterKind.NAMED;
+  bool get isNamed =>
+      parameterKind == ParameterKind.NAMED ||
+      parameterKind == ParameterKind.NAMED_REQUIRED;
 
   @override
-  bool get isNotOptional => parameterKind == ParameterKind.REQUIRED;
+  bool get isNotOptional =>
+      parameterKind == ParameterKind.REQUIRED ||
+      parameterKind == ParameterKind.NAMED_REQUIRED;
 
   @override
   bool get isOptional =>
@@ -4407,6 +4447,9 @@
       parameterKind == ParameterKind.POSITIONAL;
 
   @override
+  bool get isOptionalNamed => parameterKind == ParameterKind.NAMED;
+
+  @override
   bool get isOptionalPositional => parameterKind == ParameterKind.POSITIONAL;
 
   @override
@@ -4415,6 +4458,12 @@
       parameterKind == ParameterKind.REQUIRED;
 
   @override
+  bool get isRequiredNamed => parameterKind == ParameterKind.NAMED_REQUIRED;
+
+  @override
+  bool get isRequiredPositional => parameterKind == ParameterKind.REQUIRED;
+
+  @override
   bool get isSynthetic => true;
 
   @override
@@ -5206,10 +5255,14 @@
         case UnlinkedExprOperation.makeUntypedMap:
         case UnlinkedExprOperation.makeUntypedSet:
         case UnlinkedExprOperation.makeUntypedSetOrMap:
+        case UnlinkedExprOperation.forParts:
+        case UnlinkedExprOperation.variableDeclaration:
+        case UnlinkedExprOperation.forInitializerDeclarationsUntyped:
           intPtr++;
           break;
         case UnlinkedExprOperation.makeTypedList:
         case UnlinkedExprOperation.makeTypedSet:
+        case UnlinkedExprOperation.forInitializerDeclarationsTyped:
           refPtr++;
           intPtr++;
           break;
@@ -5246,6 +5299,7 @@
           break;
         case UnlinkedExprOperation.typeCast:
         case UnlinkedExprOperation.typeCheck:
+        case UnlinkedExprOperation.forEachPartsWithTypedDeclaration:
           refPtr++;
           break;
         case UnlinkedExprOperation.pushLocalFunctionReference:
@@ -5420,6 +5474,9 @@
       _mapType ??= _buildInterfaceType(_linker.coreLibrary, 'Map');
 
   @override
+  DartType get neverType => BottomTypeImpl.instance;
+
+  @override
   DartObjectImpl get nullObject {
     // TODO(paulberry): implement if needed
     throw new UnimplementedError();
@@ -5465,9 +5522,6 @@
   InterfaceType get typeType =>
       _typeType ??= _buildInterfaceType(_linker.coreLibrary, 'Type');
 
-  @override
-  DartType get undefinedType => UndefinedTypeImpl.instance;
-
   InterfaceType _buildInterfaceType(
       LibraryElementForLink library, String name) {
     return library.getContainedName(name).buildType((int i) {
diff --git a/analyzer/lib/src/summary/name_filter.dart b/analyzer/lib/src/summary/name_filter.dart
index c71ff18..62633ef 100644
--- a/analyzer/lib/src/summary/name_filter.dart
+++ b/analyzer/lib/src/summary/name_filter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/summary/package_bundle_reader.dart b/analyzer/lib/src/summary/package_bundle_reader.dart
index 55a4f9e..d015e2a 100644
--- a/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -6,23 +6,13 @@
 import 'dart:math' show min;
 
 import 'package:analyzer/dart/analysis/session.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/context/cache.dart';
-import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/dart/constant/evaluation.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/resynthesize.dart';
-import 'package:analyzer/src/task/api/dart.dart';
-import 'package:analyzer/src/task/api/general.dart';
-import 'package:analyzer/src/task/api/model.dart';
-import 'package:analyzer/src/task/dart.dart' hide ConstantEvaluationTarget;
 
 /**
  * A [ConflictingSummaryException] indicates that two different summaries
@@ -75,26 +65,6 @@
 }
 
 /**
- * The [ResultProvider] that provides results from input package summaries.
- */
-class InputPackagesResultProvider extends ResynthesizerResultProvider {
-  InputPackagesResultProvider(
-      InternalAnalysisContext context, SummaryDataStore dataStore,
-      {AnalysisSession session})
-      : super(context, session, dataStore) {
-    createResynthesizer();
-    context.typeProvider = resynthesizer.typeProvider;
-    resynthesizer.finishCoreAsyncLibraries();
-  }
-
-  @override
-  bool hasResultsForSource(Source source) {
-    String uriString = source.uri.toString();
-    return resynthesizer.hasLibrarySummary(uriString);
-  }
-}
-
-/**
  * The [UriResolver] that knows about sources that are served from their
  * summaries.
  */
@@ -170,173 +140,6 @@
 }
 
 /**
- * The [ResultProvider] that provides results using summary resynthesizer.
- */
-abstract class ResynthesizerResultProvider extends ResultProvider {
-  final InternalAnalysisContext context;
-  final AnalysisSession session;
-  final SummaryDataStore _dataStore;
-
-  StoreBasedSummaryResynthesizer _resynthesizer;
-
-  ResynthesizerResultProvider(this.context, this.session, this._dataStore);
-
-  SummaryResynthesizer get resynthesizer => _resynthesizer;
-
-  /**
-   * Add a new [bundle] to the resynthesizer.
-   */
-  void addBundle(String path, PackageBundle bundle) {
-    _dataStore.addBundle(path, bundle);
-  }
-
-  @override
-  bool compute(CacheEntry entry, ResultDescriptor result) {
-    AnalysisTarget target = entry.target;
-
-    if (result == TYPE_PROVIDER) {
-      entry.setValue(result as ResultDescriptor<TypeProvider>,
-          _resynthesizer.typeProvider, const <TargetedResult>[]);
-      return true;
-    }
-
-    // LINE_INFO can be provided using just the UnlinkedUnit.
-    if (target is Source && result == LINE_INFO) {
-      String uriString = target.uri.toString();
-      UnlinkedUnit unlinkedUnit = _dataStore.unlinkedMap[uriString];
-      if (unlinkedUnit != null) {
-        List<int> lineStarts = unlinkedUnit.lineStarts;
-        if (lineStarts.isNotEmpty) {
-          LineInfo lineInfo = new LineInfo(lineStarts);
-          entry.setValue(result as ResultDescriptor<LineInfo>, lineInfo,
-              const <TargetedResult>[]);
-          return true;
-        }
-      }
-      return false;
-    }
-
-    // Check whether there are results for the source.
-    if (!hasResultsForSource(target.librarySource ?? target.source)) {
-      return false;
-    }
-    // Constant expressions are always resolved in summaries.
-    if (result == CONSTANT_EXPRESSION_RESOLVED &&
-        target is ConstantEvaluationTarget) {
-      entry.setValue(
-          result as ResultDescriptor<bool>, true, const <TargetedResult>[]);
-      return true;
-    }
-    // Provide results for Source.
-    if (target is Source) {
-      String uriString = target.uri.toString();
-      // Provide known results.
-      if (result == LIBRARY_ELEMENT1 ||
-          result == LIBRARY_ELEMENT2 ||
-          result == LIBRARY_ELEMENT3 ||
-          result == LIBRARY_ELEMENT4 ||
-          result == LIBRARY_ELEMENT5 ||
-          result == LIBRARY_ELEMENT6 ||
-          result == LIBRARY_ELEMENT7 ||
-          result == LIBRARY_ELEMENT8 ||
-          result == LIBRARY_ELEMENT9 ||
-          result == LIBRARY_ELEMENT) {
-        LibraryElement libraryElement =
-            resynthesizer.getLibraryElement(uriString);
-        entry.setValue(result as ResultDescriptor<LibraryElement>,
-            libraryElement, const <TargetedResult>[]);
-        return true;
-      } else if (result == READY_LIBRARY_ELEMENT2 ||
-          result == READY_LIBRARY_ELEMENT6 ||
-          result == READY_LIBRARY_ELEMENT7) {
-        entry.setValue(
-            result as ResultDescriptor<bool>, true, const <TargetedResult>[]);
-        return true;
-      } else if (result == MODIFICATION_TIME) {
-        entry.setValue(
-            result as ResultDescriptor<int>, 0, const <TargetedResult>[]);
-        return true;
-      } else if (result == SOURCE_KIND) {
-        UnlinkedUnit unlinked = _dataStore.unlinkedMap[uriString];
-        if (unlinked != null) {
-          entry.setValue(
-              result as ResultDescriptor<SourceKind>,
-              unlinked.isPartOf ? SourceKind.PART : SourceKind.LIBRARY,
-              const <TargetedResult>[]);
-          return true;
-        }
-        return false;
-      } else if (result == CONTAINING_LIBRARIES) {
-        List<String> libraryUriStrings =
-            _dataStore.getContainingLibraryUris(uriString);
-        if (libraryUriStrings != null) {
-          List<Source> librarySources = libraryUriStrings
-              .map((libraryUriString) =>
-                  context.sourceFactory.resolveUri(target, libraryUriString))
-              .toList(growable: false);
-          entry.setValue(result as ResultDescriptor<List<Source>>,
-              librarySources, const <TargetedResult>[]);
-          return true;
-        }
-        return false;
-      }
-    } else if (target is LibrarySpecificUnit) {
-      if (result == CREATED_RESOLVED_UNIT1 ||
-          result == CREATED_RESOLVED_UNIT2 ||
-          result == CREATED_RESOLVED_UNIT3 ||
-          result == CREATED_RESOLVED_UNIT4 ||
-          result == CREATED_RESOLVED_UNIT5 ||
-          result == CREATED_RESOLVED_UNIT6 ||
-          result == CREATED_RESOLVED_UNIT7 ||
-          result == CREATED_RESOLVED_UNIT8 ||
-          result == CREATED_RESOLVED_UNIT9 ||
-          result == CREATED_RESOLVED_UNIT10 ||
-          result == CREATED_RESOLVED_UNIT11) {
-        entry.setValue(
-            result as ResultDescriptor<bool>, true, const <TargetedResult>[]);
-        return true;
-      }
-      if (result == COMPILATION_UNIT_ELEMENT) {
-        String libraryUri = target.library.uri.toString();
-        String unitUri = target.unit.uri.toString();
-        CompilationUnitElement unit = resynthesizer.getElement(
-            new ElementLocationImpl.con3(<String>[libraryUri, unitUri]));
-        if (unit != null) {
-          entry.setValue(result as ResultDescriptor<CompilationUnitElement>,
-              unit, const <TargetedResult>[]);
-          return true;
-        }
-      }
-    } else if (target is VariableElement) {
-      if (result == INFERRED_STATIC_VARIABLE) {
-        entry.setValue(result as ResultDescriptor<VariableElement>, target,
-            const <TargetedResult>[]);
-        return true;
-      }
-    }
-    // Unknown target.
-    return false;
-  }
-
-  /**
-   * Create the [resynthesizer] instance.
-   *
-   * Subclasses must call this method in their constructors.
-   */
-  void createResynthesizer() {
-    _resynthesizer = new StoreBasedSummaryResynthesizer(
-        context, session, context.sourceFactory, true, _dataStore);
-  }
-
-  /**
-   * Return `true` if this result provider can provide a result for the
-   * given [source].  The provider must ensure that [addBundle] is invoked for
-   * every bundle that would be required to provide results for the [source].
-   */
-  bool hasResultsForSource(Source source);
-}
-
-/**
  * A concrete resynthesizer that serves summaries from [SummaryDataStore].
  */
 class StoreBasedSummaryResynthesizer extends SummaryResynthesizer {
diff --git a/analyzer/lib/src/summary/prelink.dart b/analyzer/lib/src/summary/prelink.dart
index 1785442..b0116e6 100644
--- a/analyzer/lib/src/summary/prelink.dart
+++ b/analyzer/lib/src/summary/prelink.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/summary/resynthesize.dart b/analyzer/lib/src/summary/resynthesize.dart
index 3c6b194..6f8720e 100644
--- a/analyzer/lib/src/summary/resynthesize.dart
+++ b/analyzer/lib/src/summary/resynthesize.dart
@@ -1491,7 +1491,7 @@
       bool isDeclarableType = false;
       int numTypeParameters = linkedReference.numTypeParameters;
       if (linkedReference.kind == ReferenceKind.unresolved) {
-        type = UndefinedTypeImpl.instance;
+        type = DynamicTypeImpl.instance;
         element = null;
         isDeclarableType = true;
       } else if (name == 'dynamic') {
diff --git a/analyzer/lib/src/summary/summarize_ast.dart b/analyzer/lib/src/summary/summarize_ast.dart
index 1f05586..b50d8cd 100644
--- a/analyzer/lib/src/summary/summarize_ast.dart
+++ b/analyzer/lib/src/summary/summarize_ast.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/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -18,7 +19,8 @@
 /// bodies should be serialized to facilitate type inference.
 UnlinkedUnitBuilder serializeAstUnlinked(CompilationUnit compilationUnit,
     {bool serializeInferrableFields: true}) {
-  return new _SummarizeAstVisitor(serializeInferrableFields)
+  return new _SummarizeAstVisitor(serializeInferrableFields,
+          compilationUnit.featureSet.isEnabled(Feature.non_nullable))
       .serializeCompilationUnit(compilationUnit);
 }
 
@@ -33,17 +35,40 @@
   /// siblings.
   final Map<int, int> localClosureIndexMap;
 
-  /// If the expression being serialized appears inside a function body, the
-  /// names of parameters that are in scope.  Otherwise `null`.
-  final Set<String> parameterNames;
+  /// The names of local variables and parameters that are in scope.
+  /// This is a list so that we can handle nesting by pushing and popping values
+  /// at the end of it.
+  final List<String> variableNames;
 
   _ConstExprSerializer(bool forConst, this.visitor, this.localClosureIndexMap,
-      this.parameterNames)
-      : super(forConst);
+      List<String> variableNames)
+      : variableNames = variableNames ?? [],
+        super(forConst);
+
+  @override
+  EntityRefNullabilitySuffix computeNullabilitySuffix(Token question) =>
+      visitor.computeNullabilitySuffix(question);
 
   @override
   bool isParameterName(String name) {
-    return parameterNames?.contains(name) ?? false;
+    return variableNames?.contains(name) ?? false;
+  }
+
+  @override
+  void popVariableNames(int count) {
+    variableNames.length -= count;
+  }
+
+  @override
+  void pushVariableName(String name) {
+    variableNames.add(name);
+  }
+
+  @override
+  void serialize(Expression expr) {
+    int startingVariableCount = variableNames.length;
+    super.serialize(expr);
+    assert(startingVariableCount == variableNames.length);
   }
 
   @override
@@ -67,7 +92,8 @@
   @override
   EntityRefBuilder serializeConstructorRef(Identifier typeName,
       TypeArgumentList typeArguments, SimpleIdentifier name) {
-    EntityRefBuilder typeBuilder = serializeTypeName(typeName, typeArguments);
+    EntityRefBuilder typeBuilder = serializeTypeName(
+        typeName, typeArguments, EntityRefNullabilitySuffix.starOrIrrelevant);
     if (name == null) {
       return typeBuilder;
     } else {
@@ -95,7 +121,8 @@
       visitor.serializeGenericFunctionType(node);
 
   EntityRefBuilder serializeIdentifier(Identifier identifier) {
-    EntityRefBuilder b = new EntityRefBuilder();
+    EntityRefBuilder b =
+        new EntityRefBuilder(nullabilitySuffix: computeNullabilitySuffix(null));
     if (identifier is SimpleIdentifier) {
       int index = visitor.serializeSimpleReference(identifier.name);
       if (index < 0) {
@@ -141,8 +168,10 @@
 
   @override
   EntityRefBuilder serializeTypeName(
-      Identifier name, TypeArgumentList arguments) {
-    return visitor.serializeTypeName(name, arguments);
+      Identifier name,
+      TypeArgumentList arguments,
+      EntityRefNullabilitySuffix nullabilitySuffix) {
+    return visitor.serializeTypeName(name, arguments, nullabilitySuffix);
   }
 }
 
@@ -197,6 +226,8 @@
   /// performed using the AST representation.
   final bool _serializeInferrableFields;
 
+  final bool _nnbd;
+
   /// List of objects which should be written to [UnlinkedUnit.classes].
   final List<UnlinkedClassBuilder> classes = <UnlinkedClassBuilder>[];
 
@@ -298,15 +329,14 @@
   /// needed by type inference.
   bool _serializeClosureBodyExprs = false;
 
-  /// If a closure function body is being serialized, the set of closure
-  /// parameter names which are currently in scope.  Otherwise `null`.
-  Set<String> _parameterNames;
+  /// The set of variable names which are currently in scope.
+  List<String> _variableNames = [];
 
   /// Indicates whether parameters found during visitors might inherit
   /// covariance.
   bool _parametersMayInheritCovariance = false;
 
-  _SummarizeAstVisitor(this._serializeInferrableFields);
+  _SummarizeAstVisitor(this._serializeInferrableFields, this._nnbd);
 
   /// Create a slot id for storing a propagated or inferred type or const cycle
   /// info.
@@ -337,6 +367,12 @@
     return scope;
   }
 
+  EntityRefNullabilitySuffix computeNullabilitySuffix(Token question) {
+    if (!_nnbd) return EntityRefNullabilitySuffix.starOrIrrelevant;
+    if (question != null) return EntityRefNullabilitySuffix.question;
+    return EntityRefNullabilitySuffix.none;
+  }
+
   /// Serialize the given list of [annotations].  If there are no annotations,
   /// the empty list is returned.
   List<UnlinkedExprBuilder> serializeAnnotations(
@@ -482,9 +518,9 @@
   /// Serialize the given [expression], creating an [UnlinkedExprBuilder].
   UnlinkedExprBuilder serializeConstExpr(
       bool forConst, Map<int, int> localClosureIndexMap, Expression expression,
-      [Set<String> parameterNames]) {
+      [List<String> variableNames]) {
     _ConstExprSerializer serializer = new _ConstExprSerializer(
-        forConst, this, localClosureIndexMap, parameterNames);
+        forConst, this, localClosureIndexMap, variableNames);
     serializer.serialize(expression);
     return serializer.toBuilder(expression.beginToken, expression.endToken);
   }
@@ -591,11 +627,9 @@
     }
     b.visibleOffset = enclosingBlock?.offset;
     b.visibleLength = enclosingBlock?.length;
-    Set<String> oldParameterNames = _parameterNames;
+    int oldVariableNamesLength = _variableNames.length;
     if (formalParameters != null && formalParameters.parameters.isNotEmpty) {
-      _parameterNames =
-          _parameterNames == null ? new Set<String>() : _parameterNames.toSet();
-      _parameterNames.addAll(formalParameters.parameters
+      _variableNames.addAll(formalParameters.parameters
           .map((FormalParameter p) => p.identifier.name));
     }
     serializeFunctionBody(
@@ -605,7 +639,7 @@
       body?.accept(new MixinSuperInvokedNamesCollector(mixinSuperInvokedNames));
     }
 
-    _parameterNames = oldParameterNames;
+    _variableNames.length = oldVariableNamesLength;
     scopes.removeLast();
     assert(scopes.length == oldScopesLength);
     return b;
@@ -659,10 +693,10 @@
     if (serializeBodyExpr) {
       if (body is Expression) {
         b.bodyExpr = serializeConstExpr(
-            forConst, _localClosureIndexMap, body, _parameterNames);
+            forConst, _localClosureIndexMap, body, _variableNames);
       } else if (body is ExpressionFunctionBody) {
         b.bodyExpr = serializeConstExpr(
-            forConst, _localClosureIndexMap, body.expression, _parameterNames);
+            forConst, _localClosureIndexMap, body.expression, _variableNames);
       } else {
         // TODO(paulberry): serialize other types of function bodies.
       }
@@ -695,7 +729,8 @@
   EntityRefBuilder serializeGenericFunctionType(GenericFunctionType node) {
     _TypeParameterScope typeParameterScope = new _TypeParameterScope();
     scopes.add(typeParameterScope);
-    EntityRefBuilder b = new EntityRefBuilder();
+    EntityRefBuilder b = new EntityRefBuilder(
+        nullabilitySuffix: computeNullabilitySuffix(node?.question));
     b.entityKind = EntityRefKind.genericFunctionType;
     b.typeParameters =
         serializeTypeParameters(node.typeParameters, typeParameterScope);
@@ -810,12 +845,14 @@
     if (_parametersMayInheritCovariance) {
       b.inheritsCovariantSlot = assignSlot();
     }
-    if (node.isRequired) {
-      b.kind = UnlinkedParamKind.required;
+    if (node.isRequiredPositional) {
+      b.kind = UnlinkedParamKind.requiredPositional;
+    } else if (node.isRequiredNamed) {
+      b.kind = UnlinkedParamKind.requiredNamed;
     } else if (node.isOptionalPositional) {
-      b.kind = UnlinkedParamKind.positional;
-    } else if (node.isNamed) {
-      b.kind = UnlinkedParamKind.named;
+      b.kind = UnlinkedParamKind.optionalPositional;
+    } else if (node.isOptionalNamed) {
+      b.kind = UnlinkedParamKind.optionalNamed;
     } else {
       // ignore: deprecated_member_use_from_same_package
       throw new StateError('Unexpected parameter kind: ${node.kind}');
@@ -866,8 +903,10 @@
   /// a [EntityRef].  Note that this method does the right thing if the
   /// name doesn't refer to an entity other than a type (e.g. a class member).
   EntityRefBuilder serializeType(TypeAnnotation node) {
+    var nullabilitySuffix = computeNullabilitySuffix(node?.question);
     if (node is TypeName) {
-      return serializeTypeName(node?.name, node?.typeArguments);
+      return serializeTypeName(
+          node?.name, node?.typeArguments, nullabilitySuffix);
     } else if (node is GenericFunctionType) {
       return serializeGenericFunctionType(node);
     } else if (node != null) {
@@ -881,11 +920,14 @@
   /// a [EntityRef].  Note that this method does the right thing if the
   /// name doesn't refer to an entity other than a type (e.g. a class member).
   EntityRefBuilder serializeTypeName(
-      Identifier identifier, TypeArgumentList typeArguments) {
+      Identifier identifier,
+      TypeArgumentList typeArguments,
+      EntityRefNullabilitySuffix nullabilitySuffix) {
     if (identifier == null) {
       return null;
     } else {
-      EntityRefBuilder b = new EntityRefBuilder();
+      EntityRefBuilder b =
+          new EntityRefBuilder(nullabilitySuffix: nullabilitySuffix);
       if (identifier is SimpleIdentifier) {
         String name = identifier.name;
         int indexOffset = 0;
@@ -964,6 +1006,7 @@
       b.isConst = variables.isConst;
       b.isCovariant = isCovariant;
       b.isFinal = variables.isFinal;
+      b.isLate = variable.isLate;
       b.isStatic = isDeclaredStatic;
       b.name = variable.name.name;
       b.nameOffset = variable.name.offset;
@@ -1093,8 +1136,8 @@
     Map<int, int> localClosureIndexMap = serializeFunctionBody(b,
         node.initializers, node.body, node.constKeyword != null, false, false);
     if (node.constKeyword != null) {
-      Set<String> constructorParameterNames =
-          node.parameters.parameters.map((p) => p.identifier.name).toSet();
+      List<String> constructorParameterNames =
+          node.parameters.parameters.map((p) => p.identifier.name).toList();
       b.constantInitializers = node.initializers
           .map((ConstructorInitializer initializer) =>
               serializeConstructorInitializer(initializer, (Expression expr) {
diff --git a/analyzer/lib/src/summary/summarize_const_expr.dart b/analyzer/lib/src/summary/summarize_const_expr.dart
index f367937..6a931fa 100644
--- a/analyzer/lib/src/summary/summarize_const_expr.dart
+++ b/analyzer/lib/src/summary/summarize_const_expr.dart
@@ -127,6 +127,13 @@
   /// Return `true` if the given [name] is a parameter reference.
   bool isParameterName(String name);
 
+  /// Removes the [count] variables that were most recently added to the scope
+  /// by [pushVariableName].
+  void popVariableNames(int count);
+
+  /// Pushes a variable with the given [name] onto the current scope.
+  void pushVariableName(String name);
+
   /// Serialize the given [expr] expression into this serializer state.
   void serialize(Expression expr) {
     try {
@@ -187,7 +194,8 @@
   /// Return [EntityRefBuilder] that corresponds to the given [type].
   EntityRefBuilder serializeType(TypeAnnotation type) {
     if (type is TypeName) {
-      return serializeTypeName(type?.name, type?.typeArguments);
+      return serializeTypeName(type?.name, type?.typeArguments,
+          computeNullabilitySuffix(type.question));
     }
     if (type is GenericFunctionType) {
       return serializeGenericFunctionType(type);
@@ -198,8 +206,8 @@
 
   /// Return [EntityRefBuilder] that corresponds to the type with the given
   /// [name] and [arguments].
-  EntityRefBuilder serializeTypeName(
-      Identifier name, TypeArgumentList arguments);
+  EntityRefBuilder serializeTypeName(Identifier name,
+      TypeArgumentList arguments, EntityRefNullabilitySuffix nullabilitySuffix);
 
   /// Return the [UnlinkedExprBuilder] that corresponds to the state of this
   /// serializer.
@@ -247,6 +255,9 @@
       EntityRefBuilder ref = serializeIdentifierSequence(expr);
       references.add(ref);
       operations.add(UnlinkedExprOperation.assignToRef);
+    } else if (expr is SimpleIdentifier && isParameterName(expr.name)) {
+      strings.add(expr.name);
+      operations.add(UnlinkedExprOperation.assignToParameter);
     } else if (expr is PropertyAccess) {
       if (!expr.isCascaded) {
         _serialize(expr.target);
@@ -293,8 +304,10 @@
   }
 
   /// Serialize the given [expr] expression into this serializer state.
-  void _serialize(Expression expr) {
-    if (expr is IntegerLiteral) {
+  void _serialize(Expression expr, {bool emptyExpressionPermitted: false}) {
+    if (emptyExpressionPermitted && expr == null) {
+      operations.add(UnlinkedExprOperation.pushEmptyExpression);
+    } else if (expr is IntegerLiteral) {
       int value = expr.value ?? 0;
       if (value >= 0) {
         _pushInt(value);
@@ -505,6 +518,8 @@
       operations.add(UnlinkedExprOperation.bitOr);
     } else if (operator == TokenType.GT_GT) {
       operations.add(UnlinkedExprOperation.bitShiftRight);
+    } else if (operator == TokenType.GT_GT_GT) {
+      operations.add(UnlinkedExprOperation.bitShiftRightLogical);
     } else if (operator == TokenType.LT_LT) {
       operations.add(UnlinkedExprOperation.bitShiftLeft);
     } else if (operator == TokenType.PLUS) {
@@ -558,16 +573,82 @@
         _serializeCollectionElement(elseElement);
         operations.add(UnlinkedExprOperation.ifElseElement);
       }
+    } else if (element is ForElement) {
+      isValidConst = false;
+      var parts = element.forLoopParts;
+      int numVariablesToPop = 0;
+      if (parts is ForParts) {
+        if (parts is ForPartsWithExpression) {
+          _serialize(parts.initialization, emptyExpressionPermitted: true);
+        } else if (parts is ForPartsWithDeclarations) {
+          for (var variable in parts.variables.variables) {
+            operations.add(UnlinkedExprOperation.variableDeclarationStart);
+            var name = variable.name.name;
+            strings.add(name);
+            pushVariableName(name);
+            ++numVariablesToPop;
+            _serialize(variable.initializer, emptyExpressionPermitted: true);
+            operations.add(UnlinkedExprOperation.variableDeclaration);
+            ints.add(0);
+          }
+          var type = parts.variables.type;
+          if (type == null) {
+            operations
+                .add(UnlinkedExprOperation.forInitializerDeclarationsUntyped);
+          } else {
+            references.add(serializeType(type));
+            operations
+                .add(UnlinkedExprOperation.forInitializerDeclarationsTyped);
+          }
+          ints.add(parts.variables.variables.length);
+        } else {
+          throw StateError('Unrecognized for parts');
+        }
+        _serialize(parts.condition, emptyExpressionPermitted: true);
+        for (var updater in parts.updaters) {
+          _serialize(updater);
+        }
+        operations.add(UnlinkedExprOperation.forParts);
+        ints.add(parts.updaters.length);
+      } else if (parts is ForEachParts) {
+        if (parts is ForEachPartsWithIdentifier) {
+          _serialize(parts.identifier);
+          _serialize(parts.iterable);
+          operations.add(UnlinkedExprOperation.forEachPartsWithIdentifier);
+        } else if (parts is ForEachPartsWithDeclaration) {
+          _serialize(parts.iterable);
+          var type = parts.loopVariable.type;
+          if (type == null) {
+            operations
+                .add(UnlinkedExprOperation.forEachPartsWithUntypedDeclaration);
+          } else {
+            references.add(serializeType(type));
+            operations
+                .add(UnlinkedExprOperation.forEachPartsWithTypedDeclaration);
+          }
+          var name = parts.loopVariable.identifier.name;
+          strings.add(name);
+          pushVariableName(name);
+          ++numVariablesToPop;
+        } else {
+          throw StateError('Unrecognized for parts');
+        }
+      } else {
+        throw StateError('Unrecognized for parts');
+      }
+      _serializeCollectionElement(element.body);
+      popVariableNames(numVariablesToPop);
+      operations.add(element.awaitKeyword == null
+          ? UnlinkedExprOperation.forElement
+          : UnlinkedExprOperation.forElementWithAwait);
     } else {
-      // TODO(paulberry): Implement serialization for spread and control flow
-      //  elements.
       throw new StateError('Unsupported CollectionElement: $element');
     }
   }
 
   void _serializeListLiteral(ListLiteral expr) {
     if (forConst || expr.typeArguments == null) {
-      List<CollectionElement> elements = expr.elements2;
+      List<CollectionElement> elements = expr.elements;
       elements.forEach(_serializeCollectionElement);
       ints.add(elements.length);
     } else {
@@ -663,10 +744,10 @@
 
   void _serializeSetOrMapLiteral(SetOrMapLiteral expr) {
     if (forConst || expr.typeArguments == null) {
-      for (CollectionElement element in expr.elements2) {
+      for (CollectionElement element in expr.elements) {
         _serializeCollectionElement(element);
       }
-      ints.add(expr.elements2.length);
+      ints.add(expr.elements.length);
     } else {
       ints.add(0);
     }
@@ -722,4 +803,6 @@
       }
     }
   }
+
+  EntityRefNullabilitySuffix computeNullabilitySuffix(Token question);
 }
diff --git a/analyzer/lib/src/summary/summary_file_builder.dart b/analyzer/lib/src/summary/summary_file_builder.dart
index f774d2a..c558609 100644
--- a/analyzer/lib/src/summary/summary_file_builder.dart
+++ b/analyzer/lib/src/summary/summary_file_builder.dart
@@ -5,6 +5,7 @@
 import 'dart:collection';
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/listener.dart';
@@ -129,10 +130,14 @@
     AnalysisErrorListener errorListener = AnalysisErrorListener.NULL_LISTENER;
     String code = source.contents.data;
     CharSequenceReader reader = new CharSequenceReader(code);
-    Scanner scanner = new Scanner(source, reader, errorListener);
+    // TODO(paulberry): figure out the appropriate featureSet to use here
+    var featureSet = FeatureSet.fromEnableFlags([]);
+    Scanner scanner = new Scanner(source, reader, errorListener)
+      ..configureFeatures(featureSet);
     Token token = scanner.tokenize();
     LineInfo lineInfo = new LineInfo(scanner.lineStarts);
     Parser parser = new Parser(source, errorListener,
+        featureSet: featureSet,
         useFasta: context.analysisOptions.useFastaParser);
     parser.enableOptionalNewAndConst = true;
     CompilationUnit unit = parser.parseCompilationUnit(token);
diff --git a/analyzer/lib/src/summary/summary_sdk.dart b/analyzer/lib/src/summary/summary_sdk.dart
index b3389a0..516ca6b 100644
--- a/analyzer/lib/src/summary/summary_sdk.dart
+++ b/analyzer/lib/src/summary/summary_sdk.dart
@@ -61,11 +61,6 @@
       SourceFactory factory = new SourceFactory(
           [new DartUriResolver(this)], null, resourceProvider);
       _analysisContext.sourceFactory = factory;
-      SummaryDataStore dataStore =
-          new SummaryDataStore([], resourceProvider: resourceProvider);
-      dataStore.addBundle(null, _bundle);
-      _analysisContext.resultProvider =
-          new InputPackagesResultProvider(_analysisContext, dataStore);
     }
     return _analysisContext;
   }
@@ -271,6 +266,9 @@
   }
 
   @override
+  DartType get neverType => BottomTypeImpl.instance;
+
+  @override
   DartObjectImpl get nullObject {
     if (_nullObject == null) {
       _nullObject = new DartObjectImpl(nullType, NullState.NULL_STATE);
@@ -347,9 +345,6 @@
     return _typeType;
   }
 
-  @override
-  DartType get undefinedType => UndefinedTypeImpl.instance;
-
   /**
    * Initialize the `dart:async` types provided by this type provider.
    */
diff --git a/analyzer/lib/src/summary2/ast_binary_reader.dart b/analyzer/lib/src/summary2/ast_binary_reader.dart
index 33f51e3..4927499 100644
--- a/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2019, 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.
 
@@ -8,19 +8,1301 @@
 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';
 
 /// Deserializer of fully resolved ASTs from flat buffers.
 class AstBinaryReader {
   final LinkedUnitContext _unitContext;
 
+  /// Set to `true` when this reader is used to lazily read its unit.
+  bool isLazy = false;
+
   AstBinaryReader(this._unitContext);
 
   AstNode readNode(LinkedNode data) {
+    var node = _readNode(data);
+    if (node == null) return null;
+
+    if (!isLazy) {
+      _unitContext.tokensContext.linkTokens(node.beginToken, node.endToken);
+    }
+
+    return node;
+  }
+
+  DartType readType(LinkedNodeType data) {
+    return _readType(data);
+  }
+
+  Element _elementOfComponents(
+    int rawElementIndex,
+    LinkedNodeType definingTypeNode,
+  ) {
+    var element = _getElement(rawElementIndex);
+    if (definingTypeNode == null) return element;
+
+    var definingType = _readType(definingTypeNode);
+    if (element is ConstructorElement) {
+      return ConstructorMember.from(element, definingType);
+    } else if (element is MethodElement) {
+      return MethodMember.from(element, definingType);
+    } else if (element is PropertyAccessorElement) {
+      return PropertyAccessorMember.from(element, definingType);
+    } else {
+      throw UnimplementedError('(${element.runtimeType}) $element');
+    }
+  }
+
+  T _getElement<T extends Element>(int index) {
+    var bundleContext = _unitContext.bundleContext;
+    return bundleContext.elementOfIndex(index);
+  }
+
+  Token _getToken(int index) {
+    return _unitContext.tokensContext.tokenOfIndex(index);
+  }
+
+  List<Token> _getTokens(List<int> indexList) {
+    var result = List<Token>(indexList.length);
+    for (var i = 0; i < indexList.length; ++i) {
+      var index = indexList[i];
+      result[i] = _getToken(index);
+    }
+    return result;
+  }
+
+  AdjacentStrings _read_adjacentStrings(LinkedNode data) {
+    return astFactory.adjacentStrings(
+      _readNodeList(data.adjacentStrings_strings),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  Annotation _read_annotation(LinkedNode data) {
+    return astFactory.annotation(
+      _getToken(data.annotation_atSign),
+      _readNode(data.annotation_name),
+      _getToken(data.annotation_period),
+      _readNode(data.annotation_constructorName),
+      _readNode(data.annotation_arguments),
+    )..element = _elementOfComponents(
+        data.annotation_element,
+        data.annotation_elementType,
+      );
+  }
+
+  ArgumentList _read_argumentList(LinkedNode data) {
+    return astFactory.argumentList(
+      _getToken(data.argumentList_leftParenthesis),
+      _readNodeList(data.argumentList_arguments),
+      _getToken(data.argumentList_rightParenthesis),
+    );
+  }
+
+  AsExpression _read_asExpression(LinkedNode data) {
+    return astFactory.asExpression(
+      _readNode(data.asExpression_expression),
+      _getToken(data.asExpression_asOperator),
+      _readNode(data.asExpression_type),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  AssertInitializer _read_assertInitializer(LinkedNode data) {
+    return astFactory.assertInitializer(
+      _getToken(data.assertInitializer_assertKeyword),
+      _getToken(data.assertInitializer_leftParenthesis),
+      _readNode(data.assertInitializer_condition),
+      _getToken(data.assertInitializer_comma),
+      _readNode(data.assertInitializer_message),
+      _getToken(data.assertInitializer_rightParenthesis),
+    );
+  }
+
+  AssertStatement _read_assertStatement(LinkedNode data) {
+    return astFactory.assertStatement(
+      _getToken(data.assertStatement_assertKeyword),
+      _getToken(data.assertStatement_leftParenthesis),
+      _readNode(data.assertStatement_condition),
+      _getToken(data.assertStatement_comma),
+      _readNode(data.assertStatement_message),
+      _getToken(data.assertStatement_rightParenthesis),
+      _getToken(data.assertStatement_semicolon),
+    );
+  }
+
+  AssignmentExpression _read_assignmentExpression(LinkedNode data) {
+    return astFactory.assignmentExpression(
+      _readNode(data.assignmentExpression_leftHandSide),
+      _getToken(data.assignmentExpression_operator),
+      _readNode(data.assignmentExpression_rightHandSide),
+    )
+      ..staticElement = _elementOfComponents(
+        data.assignmentExpression_element,
+        data.assignmentExpression_elementType,
+      )
+      ..staticType = _readType(data.expression_type);
+  }
+
+  AwaitExpression _read_awaitExpression(LinkedNode data) {
+    return astFactory.awaitExpression(
+      _getToken(data.awaitExpression_awaitKeyword),
+      _readNode(data.awaitExpression_expression),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  BinaryExpression _read_binaryExpression(LinkedNode data) {
+    return astFactory.binaryExpression(
+      _readNode(data.binaryExpression_leftOperand),
+      _getToken(data.binaryExpression_operator),
+      _readNode(data.binaryExpression_rightOperand),
+    )
+      ..staticElement = _elementOfComponents(
+        data.binaryExpression_element,
+        data.binaryExpression_elementType,
+      )
+      ..staticType = _readType(data.expression_type);
+  }
+
+  Block _read_block(LinkedNode data) {
+    return astFactory.block(
+      _getToken(data.block_leftBracket),
+      _readNodeList(data.block_statements),
+      _getToken(data.block_rightBracket),
+    );
+  }
+
+  BlockFunctionBody _read_blockFunctionBody(LinkedNode data) {
+    return astFactory.blockFunctionBody(
+      _getToken(data.blockFunctionBody_keyword),
+      _getToken(data.blockFunctionBody_star),
+      _readNode(data.blockFunctionBody_block),
+    );
+  }
+
+  BooleanLiteral _read_booleanLiteral(LinkedNode data) {
+    return astFactory.booleanLiteral(
+      _getToken(data.booleanLiteral_literal),
+      data.booleanLiteral_value,
+    )..staticType = _readType(data.expression_type);
+  }
+
+  BreakStatement _read_breakStatement(LinkedNode data) {
+    return astFactory.breakStatement(
+      _getToken(data.breakStatement_breakKeyword),
+      _readNode(data.breakStatement_label),
+      _getToken(data.breakStatement_semicolon),
+    );
+  }
+
+  CascadeExpression _read_cascadeExpression(LinkedNode data) {
+    return astFactory.cascadeExpression(
+      _readNode(data.cascadeExpression_target),
+      _readNodeList(data.cascadeExpression_sections),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  CatchClause _read_catchClause(LinkedNode data) {
+    return astFactory.catchClause(
+      _getToken(data.catchClause_onKeyword),
+      _readNode(data.catchClause_exceptionType),
+      _getToken(data.catchClause_catchKeyword),
+      _getToken(data.catchClause_leftParenthesis),
+      _readNode(data.catchClause_exceptionParameter),
+      _getToken(data.catchClause_comma),
+      _readNode(data.catchClause_stackTraceParameter),
+      _getToken(data.catchClause_rightParenthesis),
+      _readNode(data.catchClause_body),
+    );
+  }
+
+  ClassDeclaration _read_classDeclaration(LinkedNode data) {
+    var node = astFactory.classDeclaration(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.classDeclaration_abstractKeyword),
+      _getToken(data.classDeclaration_classKeyword),
+      _readNode(data.namedCompilationUnitMember_name),
+      _readNode(data.classOrMixinDeclaration_typeParameters),
+      _readNodeLazy(data.classDeclaration_extendsClause),
+      _readNodeLazy(data.classDeclaration_withClause),
+      _readNodeLazy(data.classOrMixinDeclaration_implementsClause),
+      _getToken(data.classOrMixinDeclaration_leftBracket),
+      _readNodeListLazy(data.classOrMixinDeclaration_members),
+      _getToken(data.classOrMixinDeclaration_rightBracket),
+    );
+    node.nativeClause = _readNodeLazy(data.classDeclaration_nativeClause);
+    LazyClassDeclaration.setData(node, data);
+    return node;
+  }
+
+  ClassTypeAlias _read_classTypeAlias(LinkedNode data) {
+    var node = astFactory.classTypeAlias(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.typeAlias_typedefKeyword),
+      _readNode(data.namedCompilationUnitMember_name),
+      _readNode(data.classTypeAlias_typeParameters),
+      _getToken(data.classTypeAlias_equals),
+      _getToken(data.classTypeAlias_abstractKeyword),
+      _readNodeLazy(data.classTypeAlias_superclass),
+      _readNodeLazy(data.classTypeAlias_withClause),
+      _readNodeLazy(data.classTypeAlias_implementsClause),
+      _getToken(data.typeAlias_semicolon),
+    );
+    LazyClassTypeAlias.setData(node, data);
+    return node;
+  }
+
+  Comment _read_comment(LinkedNode data) {
+    var tokens = _getTokens(data.comment_tokens);
+    switch (data.comment_type) {
+      case LinkedNodeCommentType.block:
+        return astFactory.endOfLineComment(
+          tokens,
+        );
+      case LinkedNodeCommentType.documentation:
+        return astFactory.documentationComment(
+          tokens,
+          _readNodeList(data.comment_references),
+        );
+      case LinkedNodeCommentType.endOfLine:
+        return astFactory.endOfLineComment(
+          tokens,
+        );
+      default:
+        throw StateError('${data.comment_type}');
+    }
+  }
+
+  CommentReference _read_commentReference(LinkedNode data) {
+    return astFactory.commentReference(
+      _getToken(data.commentReference_newKeyword),
+      _readNode(data.commentReference_identifier),
+    );
+  }
+
+  CompilationUnit _read_compilationUnit(LinkedNode data) {
+    return astFactory.compilationUnit2(
+        beginToken: _getToken(data.compilationUnit_beginToken),
+        scriptTag: _readNode(data.compilationUnit_scriptTag),
+        directives: _readNodeList(data.compilationUnit_directives),
+        declarations: _readNodeList(data.compilationUnit_declarations),
+        endToken: _getToken(data.compilationUnit_endToken),
+        featureSet: null);
+  }
+
+  ConditionalExpression _read_conditionalExpression(LinkedNode data) {
+    return astFactory.conditionalExpression(
+      _readNode(data.conditionalExpression_condition),
+      _getToken(data.conditionalExpression_question),
+      _readNode(data.conditionalExpression_thenExpression),
+      _getToken(data.conditionalExpression_colon),
+      _readNode(data.conditionalExpression_elseExpression),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  Configuration _read_configuration(LinkedNode data) {
+    return astFactory.configuration(
+      _getToken(data.configuration_ifKeyword),
+      _getToken(data.configuration_leftParenthesis),
+      _readNode(data.configuration_name),
+      _getToken(data.configuration_equalToken),
+      _readNode(data.configuration_value),
+      _getToken(data.configuration_rightParenthesis),
+      _readNode(data.configuration_uri),
+    );
+  }
+
+  ConstructorDeclaration _read_constructorDeclaration(LinkedNode data) {
+    var node = astFactory.constructorDeclaration(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.constructorDeclaration_externalKeyword),
+      _getToken(data.constructorDeclaration_constKeyword),
+      _getToken(data.constructorDeclaration_factoryKeyword),
+      _readNode(data.constructorDeclaration_returnType),
+      _getToken(data.constructorDeclaration_period),
+      _readNode(data.constructorDeclaration_name),
+      _readNodeLazy(data.constructorDeclaration_parameters),
+      _getToken(data.constructorDeclaration_separator),
+      _readNodeListLazy(data.constructorDeclaration_initializers),
+      _readNodeLazy(data.constructorDeclaration_redirectedConstructor),
+      _readNodeLazy(data.constructorDeclaration_body),
+    );
+    LazyConstructorDeclaration.setData(node, data);
+    return node;
+  }
+
+  ConstructorFieldInitializer _read_constructorFieldInitializer(
+      LinkedNode data) {
+    return astFactory.constructorFieldInitializer(
+      _getToken(data.constructorFieldInitializer_thisKeyword),
+      _getToken(data.constructorFieldInitializer_period),
+      _readNode(data.constructorFieldInitializer_fieldName),
+      _getToken(data.constructorFieldInitializer_equals),
+      _readNode(data.constructorFieldInitializer_expression),
+    );
+  }
+
+  ConstructorName _read_constructorName(LinkedNode data) {
+    return astFactory.constructorName(
+      _readNode(data.constructorName_type),
+      _getToken(data.constructorName_period),
+      _readNode(data.constructorName_name),
+    )..staticElement = _elementOfComponents(
+        data.constructorName_element,
+        data.constructorName_elementType,
+      );
+  }
+
+  ContinueStatement _read_continueStatement(LinkedNode data) {
+    return astFactory.continueStatement(
+      _getToken(data.continueStatement_continueKeyword),
+      _readNode(data.continueStatement_label),
+      _getToken(data.continueStatement_semicolon),
+    );
+  }
+
+  DeclaredIdentifier _read_declaredIdentifier(LinkedNode data) {
+    return astFactory.declaredIdentifier(
+      _readNode(data.annotatedNode_comment),
+      _readNodeList(data.annotatedNode_metadata),
+      _getToken(data.declaredIdentifier_keyword),
+      _readNode(data.declaredIdentifier_type),
+      _readNode(data.declaredIdentifier_identifier),
+    );
+  }
+
+  DefaultFormalParameter _read_defaultFormalParameter(LinkedNode data) {
+    var node = astFactory.defaultFormalParameter(
+      _readNode(data.defaultFormalParameter_parameter),
+      _toParameterKind(data.defaultFormalParameter_kind),
+      _getToken(data.defaultFormalParameter_separator),
+      _readNodeLazy(data.defaultFormalParameter_defaultValue),
+    );
+    LazyFormalParameter.setData(node, data);
+    return node;
+  }
+
+  DoStatement _read_doStatement(LinkedNode data) {
+    return astFactory.doStatement(
+      _getToken(data.doStatement_doKeyword),
+      _readNode(data.doStatement_body),
+      _getToken(data.doStatement_whileKeyword),
+      _getToken(data.doStatement_leftParenthesis),
+      _readNode(data.doStatement_condition),
+      _getToken(data.doStatement_rightParenthesis),
+      _getToken(data.doStatement_semicolon),
+    );
+  }
+
+  DottedName _read_dottedName(LinkedNode data) {
+    return astFactory.dottedName(
+      _readNodeList(data.dottedName_components),
+    );
+  }
+
+  DoubleLiteral _read_doubleLiteral(LinkedNode data) {
+    return astFactory.doubleLiteral(
+      _getToken(data.doubleLiteral_literal),
+      data.doubleLiteral_value,
+    )..staticType = _readType(data.expression_type);
+  }
+
+  EmptyFunctionBody _read_emptyFunctionBody(LinkedNode data) {
+    return astFactory.emptyFunctionBody(
+      _getToken(data.emptyFunctionBody_semicolon),
+    );
+  }
+
+  EmptyStatement _read_emptyStatement(LinkedNode data) {
+    return astFactory.emptyStatement(
+      _getToken(data.emptyStatement_semicolon),
+    );
+  }
+
+  EnumConstantDeclaration _read_enumConstantDeclaration(LinkedNode data) {
+    var node = astFactory.enumConstantDeclaration(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _readNode(data.enumConstantDeclaration_name),
+    );
+    LazyEnumConstantDeclaration.setData(node, data);
+    return node;
+  }
+
+  EnumDeclaration _read_enumDeclaration(LinkedNode data) {
+    var node = astFactory.enumDeclaration(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.enumDeclaration_enumKeyword),
+      _readNode(data.namedCompilationUnitMember_name),
+      _getToken(data.enumDeclaration_leftBracket),
+      _readNodeListLazy(data.enumDeclaration_constants),
+      _getToken(data.enumDeclaration_rightBracket),
+    );
+    LazyEnumDeclaration.setData(node, data);
+    return node;
+  }
+
+  ExportDirective _read_exportDirective(LinkedNode data) {
+    var node = astFactory.exportDirective(
+      _readNode(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.directive_keyword),
+      _readNode(data.uriBasedDirective_uri),
+      _readNodeList(data.namespaceDirective_configurations),
+      _readNodeList(data.namespaceDirective_combinators),
+      _getToken(data.directive_semicolon),
+    );
+    LazyDirective.setData(node, data);
+    return node;
+  }
+
+  ExpressionFunctionBody _read_expressionFunctionBody(LinkedNode data) {
+    return astFactory.expressionFunctionBody(
+      _getToken(data.expressionFunctionBody_keyword),
+      _getToken(data.expressionFunctionBody_arrow),
+      _readNode(data.expressionFunctionBody_expression),
+      _getToken(data.expressionFunctionBody_semicolon),
+    );
+  }
+
+  ExpressionStatement _read_expressionStatement(LinkedNode data) {
+    return astFactory.expressionStatement(
+      _readNode(data.expressionStatement_expression),
+      _getToken(data.expressionStatement_semicolon),
+    );
+  }
+
+  ExtendsClause _read_extendsClause(LinkedNode data) {
+    return astFactory.extendsClause(
+      _getToken(data.extendsClause_extendsKeyword),
+      _readNode(data.extendsClause_superclass),
+    );
+  }
+
+  FieldDeclaration _read_fieldDeclaration(LinkedNode data) {
+    var node = astFactory.fieldDeclaration2(
+      comment: _readNodeLazy(data.annotatedNode_comment),
+      covariantKeyword: _getToken(data.fieldDeclaration_covariantKeyword),
+      fieldList: _readNode(data.fieldDeclaration_fields),
+      metadata: _readNodeListLazy(data.annotatedNode_metadata),
+      semicolon: _getToken(data.fieldDeclaration_semicolon),
+      staticKeyword: _getToken(data.fieldDeclaration_staticKeyword),
+    );
+    LazyFieldDeclaration.setData(node, data);
+    return node;
+  }
+
+  FieldFormalParameter _read_fieldFormalParameter(LinkedNode data) {
+    var node = astFactory.fieldFormalParameter2(
+      identifier: _readNode(data.normalFormalParameter_identifier),
+      period: _getToken(data.fieldFormalParameter_period),
+      thisKeyword: _getToken(data.fieldFormalParameter_thisKeyword),
+      covariantKeyword: _getToken(data.normalFormalParameter_covariantKeyword),
+      typeParameters: _readNode(data.fieldFormalParameter_typeParameters),
+      keyword: _getToken(data.fieldFormalParameter_keyword),
+      metadata: _readNodeList(data.normalFormalParameter_metadata),
+      comment: _readNode(data.normalFormalParameter_comment),
+      type: _readNode(data.fieldFormalParameter_type),
+      parameters: _readNode(data.fieldFormalParameter_formalParameters),
+      requiredKeyword: _getToken(data.normalFormalParameter_requiredKeyword),
+    );
+    LazyFormalParameter.setData(node, data);
+    return node;
+  }
+
+  ForEachPartsWithDeclaration _read_forEachPartsWithDeclaration(
+      LinkedNode data) {
+    return astFactory.forEachPartsWithDeclaration(
+      inKeyword: _getToken(data.forEachParts_inKeyword),
+      iterable: _readNode(data.forEachParts_iterable),
+      loopVariable: _readNode(data.forEachPartsWithDeclaration_loopVariable),
+    );
+  }
+
+  ForEachPartsWithIdentifier _read_forEachPartsWithIdentifier(LinkedNode data) {
+    return astFactory.forEachPartsWithIdentifier(
+      inKeyword: _getToken(data.forEachParts_inKeyword),
+      iterable: _readNode(data.forEachParts_iterable),
+      identifier: _readNode(data.forEachPartsWithIdentifier_identifier),
+    );
+  }
+
+  ForElement _read_forElement(LinkedNode data) {
+    return astFactory.forElement(
+      awaitKeyword: _getToken(data.forMixin_awaitKeyword),
+      body: _readNode(data.forElement_body),
+      forKeyword: _getToken(data.forMixin_forKeyword),
+      forLoopParts: _readNode(data.forMixin_forLoopParts),
+      leftParenthesis: _getToken(data.forMixin_leftParenthesis),
+      rightParenthesis: _getToken(data.forMixin_rightParenthesis),
+    );
+  }
+
+  FormalParameterList _read_formalParameterList(LinkedNode data) {
+    return astFactory.formalParameterList(
+      _getToken(data.formalParameterList_leftParenthesis),
+      _readNodeList(data.formalParameterList_parameters),
+      _getToken(data.formalParameterList_leftDelimiter),
+      _getToken(data.formalParameterList_rightDelimiter),
+      _getToken(data.formalParameterList_rightParenthesis),
+    );
+  }
+
+  ForPartsWithDeclarations _read_forPartsWithDeclarations(LinkedNode data) {
+    return astFactory.forPartsWithDeclarations(
+      condition: _readNode(data.forParts_condition),
+      leftSeparator: _getToken(data.forParts_leftSeparator),
+      rightSeparator: _getToken(data.forParts_rightSeparator),
+      updaters: _readNodeList(data.forParts_updaters),
+      variables: _readNode(data.forPartsWithDeclarations_variables),
+    );
+  }
+
+  ForPartsWithExpression _read_forPartsWithExpression(LinkedNode data) {
+    return astFactory.forPartsWithExpression(
+      condition: _readNode(data.forParts_condition),
+      initialization: _readNode(data.forPartsWithExpression_initialization),
+      leftSeparator: _getToken(data.forParts_leftSeparator),
+      rightSeparator: _getToken(data.forParts_rightSeparator),
+      updaters: _readNodeList(data.forParts_updaters),
+    );
+  }
+
+  ForStatement _read_forStatement(LinkedNode data) {
+    return astFactory.forStatement(
+      awaitKeyword: _getToken(data.forMixin_awaitKeyword),
+      forKeyword: _getToken(data.forMixin_forKeyword),
+      leftParenthesis: _getToken(data.forMixin_leftParenthesis),
+      forLoopParts: _readNode(data.forMixin_forLoopParts),
+      rightParenthesis: _getToken(data.forMixin_rightParenthesis),
+      body: _readNode(data.forStatement_body),
+    );
+  }
+
+  FunctionDeclaration _read_functionDeclaration(LinkedNode data) {
+    var node = astFactory.functionDeclaration(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.functionDeclaration_externalKeyword),
+      _readNodeLazy(data.functionDeclaration_returnType),
+      _getToken(data.functionDeclaration_propertyKeyword),
+      _readNode(data.namedCompilationUnitMember_name),
+      _readNodeLazy(data.functionDeclaration_functionExpression),
+    );
+    LazyFunctionDeclaration.setData(node, data);
+    return node;
+  }
+
+  FunctionDeclarationStatement _read_functionDeclarationStatement(
+      LinkedNode data) {
+    return astFactory.functionDeclarationStatement(
+      _readNode(data.functionDeclarationStatement_functionDeclaration),
+    );
+  }
+
+  FunctionExpression _read_functionExpression(LinkedNode data) {
+    var node = astFactory.functionExpression(
+      _readNode(data.functionExpression_typeParameters),
+      _readNodeLazy(data.functionExpression_formalParameters),
+      _readNodeLazy(data.functionExpression_body),
+    );
+    LazyFunctionExpression.setData(node, data);
+    return node;
+  }
+
+  FunctionExpressionInvocation _read_functionExpressionInvocation(
+      LinkedNode data) {
+    return astFactory.functionExpressionInvocation(
+      _readNode(data.functionExpressionInvocation_function),
+      _readNode(data.invocationExpression_typeArguments),
+      _readNode(data.invocationExpression_arguments),
+    )..staticInvokeType = _readType(data.invocationExpression_invokeType);
+  }
+
+  FunctionTypeAlias _read_functionTypeAlias(LinkedNode data) {
+    var node = astFactory.functionTypeAlias(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.typeAlias_typedefKeyword),
+      _readNodeLazy(data.functionTypeAlias_returnType),
+      _readNode(data.namedCompilationUnitMember_name),
+      _readNode(data.functionTypeAlias_typeParameters),
+      _readNodeLazy(data.functionTypeAlias_formalParameters),
+      _getToken(data.typeAlias_semicolon),
+    );
+    LazyFunctionTypeAlias.setData(node, data);
+    LazyFunctionTypeAlias.setHasSelfReference(
+      node,
+      data.typeAlias_hasSelfReference,
+    );
+    return node;
+  }
+
+  FunctionTypedFormalParameter _read_functionTypedFormalParameter(
+      LinkedNode data) {
+    var node = astFactory.functionTypedFormalParameter2(
+      comment: _readNodeLazy(data.normalFormalParameter_comment),
+      covariantKeyword: _getToken(data.normalFormalParameter_covariantKeyword),
+      identifier: _readNode(data.normalFormalParameter_identifier),
+      metadata: _readNodeListLazy(data.normalFormalParameter_metadata),
+      parameters: _readNodeLazy(
+        data.functionTypedFormalParameter_formalParameters,
+      ),
+      requiredKeyword: _getToken(data.normalFormalParameter_requiredKeyword),
+      returnType: _readNodeLazy(data.functionTypedFormalParameter_returnType),
+      typeParameters: _readNode(
+        data.functionTypedFormalParameter_typeParameters,
+      ),
+    );
+    LazyFormalParameter.setData(node, data);
+    return node;
+  }
+
+  GenericFunctionType _read_genericFunctionType(LinkedNode data) {
+    GenericFunctionTypeImpl node = astFactory.genericFunctionType(
+      _readNodeLazy(data.genericFunctionType_returnType),
+      _getToken(data.genericFunctionType_functionKeyword),
+      _readNode(data.genericFunctionType_typeParameters),
+      _readNodeLazy(data.genericFunctionType_formalParameters),
+      question: _getToken(data.genericFunctionType_question),
+    );
+    node.type = _readType(data.genericFunctionType_type);
+    LazyGenericFunctionType.setData(node, data);
+    _unitContext.addGenericFunctionType(data.genericFunctionType_id, node);
+    return node;
+  }
+
+  GenericTypeAlias _read_genericTypeAlias(LinkedNode data) {
+    var node = astFactory.genericTypeAlias(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.typeAlias_typedefKeyword),
+      _readNode(data.namedCompilationUnitMember_name),
+      _readNode(data.genericTypeAlias_typeParameters),
+      _getToken(data.genericTypeAlias_equals),
+      _readNodeLazy(data.genericTypeAlias_functionType),
+      _getToken(data.typeAlias_semicolon),
+    );
+    LazyGenericTypeAlias.setData(node, data);
+    LazyGenericTypeAlias.setHasSelfReference(
+      node,
+      data.typeAlias_hasSelfReference,
+    );
+    return node;
+  }
+
+  HideCombinator _read_hideCombinator(LinkedNode data) {
+    return astFactory.hideCombinator(
+      _getToken(data.combinator_keyword),
+      _readNodeList(data.hideCombinator_hiddenNames),
+    );
+  }
+
+  IfElement _read_ifElement(LinkedNode data) {
+    return astFactory.ifElement(
+      condition: _readNode(data.ifMixin_condition),
+      elseElement: _readNode(data.ifElement_elseElement),
+      elseKeyword: _getToken(data.ifMixin_elseKeyword),
+      ifKeyword: _getToken(data.ifMixin_ifKeyword),
+      leftParenthesis: _getToken(data.ifMixin_leftParenthesis),
+      rightParenthesis: _getToken(data.ifMixin_rightParenthesis),
+      thenElement: _readNode(data.ifElement_thenElement),
+    );
+  }
+
+  IfStatement _read_ifStatement(LinkedNode data) {
+    return astFactory.ifStatement(
+      _getToken(data.ifMixin_ifKeyword),
+      _getToken(data.ifMixin_leftParenthesis),
+      _readNode(data.ifMixin_condition),
+      _getToken(data.ifMixin_rightParenthesis),
+      _readNode(data.ifStatement_thenStatement),
+      _getToken(data.ifMixin_elseKeyword),
+      _readNode(data.ifStatement_elseStatement),
+    );
+  }
+
+  ImplementsClause _read_implementsClause(LinkedNode data) {
+    return astFactory.implementsClause(
+      _getToken(data.implementsClause_implementsKeyword),
+      _readNodeList(data.implementsClause_interfaces),
+    );
+  }
+
+  ImportDirective _read_importDirective(LinkedNode data) {
+    var node = astFactory.importDirective(
+      _readNode(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.directive_keyword),
+      _readNode(data.uriBasedDirective_uri),
+      _readNodeList(data.namespaceDirective_configurations),
+      _getToken(data.importDirective_deferredKeyword),
+      _getToken(data.importDirective_asKeyword),
+      _readNode(data.importDirective_prefix),
+      _readNodeList(data.namespaceDirective_combinators),
+      _getToken(data.directive_semicolon),
+    );
+    LazyDirective.setData(node, data);
+    return node;
+  }
+
+  IndexExpression _read_indexExpression(LinkedNode data) {
+    return astFactory.indexExpressionForTarget(
+      _readNode(data.indexExpression_target),
+      _getToken(data.indexExpression_leftBracket),
+      _readNode(data.indexExpression_index),
+      _getToken(data.indexExpression_rightBracket),
+    )
+      ..period = _getToken(data.indexExpression_period)
+      ..staticElement = _elementOfComponents(
+        data.indexExpression_element,
+        data.indexExpression_elementType,
+      )
+      ..staticType = _readType(data.expression_type);
+  }
+
+  InstanceCreationExpression _read_instanceCreationExpression(LinkedNode data) {
+    var node = astFactory.instanceCreationExpression(
+      _getToken(data.instanceCreationExpression_keyword),
+      _readNode(data.instanceCreationExpression_constructorName),
+      _readNode(data.instanceCreationExpression_arguments),
+      typeArguments: _readNode(data.instanceCreationExpression_typeArguments),
+    );
+    node.staticElement = node.constructorName.staticElement;
+    node.staticType = _readType(data.expression_type);
+    return node;
+  }
+
+  IntegerLiteral _read_integerLiteral(LinkedNode data) {
+    return astFactory.integerLiteral(
+      _getToken(data.integerLiteral_literal),
+      data.integerLiteral_value,
+    )..staticType = _readType(data.expression_type);
+  }
+
+  InterpolationExpression _read_interpolationExpression(LinkedNode data) {
+    return astFactory.interpolationExpression(
+      _getToken(data.interpolationExpression_leftBracket),
+      _readNode(data.interpolationExpression_expression),
+      _getToken(data.interpolationExpression_rightBracket),
+    );
+  }
+
+  InterpolationString _read_interpolationString(LinkedNode data) {
+    return astFactory.interpolationString(
+      _getToken(data.interpolationString_token),
+      data.interpolationString_value,
+    );
+  }
+
+  IsExpression _read_isExpression(LinkedNode data) {
+    return astFactory.isExpression(
+      _readNode(data.isExpression_expression),
+      _getToken(data.isExpression_isOperator),
+      _getToken(data.isExpression_notOperator),
+      _readNode(data.isExpression_type),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  Label _read_label(LinkedNode data) {
+    return astFactory.label(
+      _readNode(data.label_label),
+      _getToken(data.label_colon),
+    );
+  }
+
+  LabeledStatement _read_labeledStatement(LinkedNode data) {
+    return astFactory.labeledStatement(
+      _readNodeList(data.labeledStatement_labels),
+      _readNode(data.labeledStatement_statement),
+    );
+  }
+
+  LibraryDirective _read_libraryDirective(LinkedNode data) {
+    var node = astFactory.libraryDirective(
+      _readNode(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.directive_keyword),
+      _readNode(data.libraryDirective_name),
+      _getToken(data.directive_semicolon),
+    );
+    LazyDirective.setData(node, data);
+    return node;
+  }
+
+  LibraryIdentifier _read_libraryIdentifier(LinkedNode data) {
+    return astFactory.libraryIdentifier(
+      _readNodeList(data.libraryIdentifier_components),
+    );
+  }
+
+  ListLiteral _read_listLiteral(LinkedNode data) {
+    return astFactory.listLiteral(
+      _getToken(data.typedLiteral_constKeyword),
+      _readNode(data.typedLiteral_typeArguments),
+      _getToken(data.listLiteral_leftBracket),
+      _readNodeList(data.listLiteral_elements),
+      _getToken(data.listLiteral_rightBracket),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  MapLiteralEntry _read_mapLiteralEntry(LinkedNode data) {
+    return astFactory.mapLiteralEntry(
+      _readNode(data.mapLiteralEntry_key),
+      _getToken(data.mapLiteralEntry_separator),
+      _readNode(data.mapLiteralEntry_value),
+    );
+  }
+
+  MethodDeclaration _read_methodDeclaration(LinkedNode data) {
+    var node = astFactory.methodDeclaration(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.methodDeclaration_externalKeyword),
+      _getToken(data.methodDeclaration_modifierKeyword),
+      _readNodeLazy(data.methodDeclaration_returnType),
+      _getToken(data.methodDeclaration_propertyKeyword),
+      _getToken(data.methodDeclaration_operatorKeyword),
+      _readNode(data.methodDeclaration_name),
+      _readNode(data.methodDeclaration_typeParameters),
+      _readNodeLazy(data.methodDeclaration_formalParameters),
+      _readNodeLazy(data.methodDeclaration_body),
+    );
+    LazyMethodDeclaration.setData(node, data);
+    return node;
+  }
+
+  MethodInvocation _read_methodInvocation(LinkedNode data) {
+    return astFactory.methodInvocation(
+      _readNode(data.methodInvocation_target),
+      _getToken(data.methodInvocation_operator),
+      _readNode(data.methodInvocation_methodName),
+      _readNode(data.invocationExpression_typeArguments),
+      _readNode(data.invocationExpression_arguments),
+    )..staticInvokeType = _readType(data.invocationExpression_invokeType);
+  }
+
+  MixinDeclaration _read_mixinDeclaration(LinkedNode data) {
+    var node = astFactory.mixinDeclaration(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.mixinDeclaration_mixinKeyword),
+      _readNode(data.namedCompilationUnitMember_name),
+      _readNode(data.classOrMixinDeclaration_typeParameters),
+      _readNodeLazy(data.mixinDeclaration_onClause),
+      _readNodeLazy(data.classOrMixinDeclaration_implementsClause),
+      _getToken(data.classOrMixinDeclaration_leftBracket),
+      _readNodeListLazy(data.classOrMixinDeclaration_members),
+      _getToken(data.classOrMixinDeclaration_rightBracket),
+    );
+    LazyMixinDeclaration(node, data);
+    return node;
+  }
+
+  NamedExpression _read_namedExpression(LinkedNode data) {
+    return astFactory.namedExpression(
+      _readNode(data.namedExpression_name),
+      _readNode(data.namedExpression_expression),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  NativeClause _read_nativeClause(LinkedNode data) {
+    return astFactory.nativeClause(
+      _getToken(data.nativeClause_nativeKeyword),
+      _readNode(data.nativeClause_name),
+    );
+  }
+
+  NativeFunctionBody _read_nativeFunctionBody(LinkedNode data) {
+    return astFactory.nativeFunctionBody(
+      _getToken(data.nativeFunctionBody_nativeKeyword),
+      _readNode(data.nativeFunctionBody_stringLiteral),
+      _getToken(data.nativeFunctionBody_semicolon),
+    );
+  }
+
+  NullLiteral _read_nullLiteral(LinkedNode data) {
+    return astFactory.nullLiteral(
+      _getToken(data.nullLiteral_literal),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  OnClause _read_onClause(LinkedNode data) {
+    return astFactory.onClause(
+      _getToken(data.onClause_onKeyword),
+      _readNodeList(data.onClause_superclassConstraints),
+    );
+  }
+
+  ParenthesizedExpression _read_parenthesizedExpression(LinkedNode data) {
+    return astFactory.parenthesizedExpression(
+      _getToken(data.parenthesizedExpression_leftParenthesis),
+      _readNode(data.parenthesizedExpression_expression),
+      _getToken(data.parenthesizedExpression_rightParenthesis),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  PartDirective _read_partDirective(LinkedNode data) {
+    var node = astFactory.partDirective(
+      _readNode(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.directive_keyword),
+      _readNode(data.uriBasedDirective_uri),
+      _getToken(data.directive_semicolon),
+    );
+    LazyDirective.setData(node, data);
+    return node;
+  }
+
+  PartOfDirective _read_partOfDirective(LinkedNode data) {
+    var node = astFactory.partOfDirective(
+      _readNode(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _getToken(data.directive_keyword),
+      _getToken(data.partOfDirective_ofKeyword),
+      _readNode(data.partOfDirective_uri),
+      _readNode(data.partOfDirective_libraryName),
+      _getToken(data.directive_semicolon),
+    );
+    LazyDirective.setData(node, data);
+    return node;
+  }
+
+  PostfixExpression _read_postfixExpression(LinkedNode data) {
+    return astFactory.postfixExpression(
+      _readNode(data.postfixExpression_operand),
+      _getToken(data.postfixExpression_operator),
+    )
+      ..staticElement = _elementOfComponents(
+        data.postfixExpression_element,
+        data.postfixExpression_elementType,
+      )
+      ..staticType = _readType(data.expression_type);
+  }
+
+  PrefixedIdentifier _read_prefixedIdentifier(LinkedNode data) {
+    return astFactory.prefixedIdentifier(
+      _readNode(data.prefixedIdentifier_prefix),
+      _getToken(data.prefixedIdentifier_period),
+      _readNode(data.prefixedIdentifier_identifier),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  PrefixExpression _read_prefixExpression(LinkedNode data) {
+    return astFactory.prefixExpression(
+      _getToken(data.prefixExpression_operator),
+      _readNode(data.prefixExpression_operand),
+    )
+      ..staticElement = _elementOfComponents(
+        data.prefixExpression_element,
+        data.prefixExpression_elementType,
+      )
+      ..staticType = _readType(data.expression_type);
+  }
+
+  PropertyAccess _read_propertyAccess(LinkedNode data) {
+    return astFactory.propertyAccess(
+      _readNode(data.propertyAccess_target),
+      _getToken(data.propertyAccess_operator),
+      _readNode(data.propertyAccess_propertyName),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  RedirectingConstructorInvocation _read_redirectingConstructorInvocation(
+      LinkedNode data) {
+    return astFactory.redirectingConstructorInvocation(
+      _getToken(data.redirectingConstructorInvocation_thisKeyword),
+      _getToken(data.redirectingConstructorInvocation_period),
+      _readNode(data.redirectingConstructorInvocation_constructorName),
+      _readNode(data.redirectingConstructorInvocation_arguments),
+    )..staticElement = _elementOfComponents(
+        data.redirectingConstructorInvocation_element,
+        data.redirectingConstructorInvocation_elementType,
+      );
+  }
+
+  RethrowExpression _read_rethrowExpression(LinkedNode data) {
+    return astFactory.rethrowExpression(
+      _getToken(data.rethrowExpression_rethrowKeyword),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  ReturnStatement _read_returnStatement(LinkedNode data) {
+    return astFactory.returnStatement(
+      _getToken(data.returnStatement_returnKeyword),
+      _readNode(data.returnStatement_expression),
+      _getToken(data.returnStatement_semicolon),
+    );
+  }
+
+  ScriptTag _read_scriptTag(LinkedNode data) {
+    return astFactory.scriptTag(
+      _getToken(data.scriptTag_scriptTag),
+    );
+  }
+
+  SetOrMapLiteral _read_setOrMapLiteral(LinkedNode data) {
+    SetOrMapLiteralImpl node = astFactory.setOrMapLiteral(
+      constKeyword: _getToken(data.typedLiteral_constKeyword),
+      elements: _readNodeList(data.setOrMapLiteral_elements),
+      leftBracket: _getToken(data.setOrMapLiteral_leftBracket),
+      typeArguments: _readNode(data.typedLiteral_typeArguments),
+      rightBracket: _getToken(data.setOrMapLiteral_rightBracket),
+    )..staticType = _readType(data.expression_type);
+    if (data.setOrMapLiteral_isMap) {
+      node.becomeMap();
+    } else if (data.setOrMapLiteral_isSet) {
+      node.becomeSet();
+    }
+    return node;
+  }
+
+  ShowCombinator _read_showCombinator(LinkedNode data) {
+    return astFactory.showCombinator(
+      _getToken(data.combinator_keyword),
+      _readNodeList(data.showCombinator_shownNames),
+    );
+  }
+
+  SimpleFormalParameter _read_simpleFormalParameter(LinkedNode data) {
+    SimpleFormalParameterImpl node = astFactory.simpleFormalParameter2(
+      identifier: _readNode(data.normalFormalParameter_identifier),
+      type: _readNode(data.simpleFormalParameter_type),
+      covariantKeyword: _getToken(data.normalFormalParameter_covariantKeyword),
+      comment: _readNode(data.normalFormalParameter_comment),
+      metadata: _readNodeList(data.normalFormalParameter_metadata),
+      keyword: _getToken(data.simpleFormalParameter_keyword),
+      requiredKeyword: _getToken(data.normalFormalParameter_requiredKeyword),
+    );
+    LazyFormalParameter.setData(node, data);
+    LazyAst.setInheritsCovariant(node, data.inheritsCovariant);
+    return node;
+  }
+
+  SimpleIdentifier _read_simpleIdentifier(LinkedNode data) {
+    return astFactory.simpleIdentifier(
+      _getToken(data.simpleIdentifier_token),
+      isDeclaration: data.simpleIdentifier_isDeclaration,
+    )
+      ..staticElement = _elementOfComponents(
+        data.simpleIdentifier_element,
+        data.simpleIdentifier_elementType,
+      )
+      ..staticType = _readType(data.expression_type);
+  }
+
+  SimpleStringLiteral _read_simpleStringLiteral(LinkedNode data) {
+    return astFactory.simpleStringLiteral(
+      _getToken(data.simpleStringLiteral_token),
+      data.simpleStringLiteral_value,
+    )..staticType = _readType(data.expression_type);
+  }
+
+  SpreadElement _read_spreadElement(LinkedNode data) {
+    return astFactory.spreadElement(
+      spreadOperator: _getToken(data.spreadElement_spreadOperator),
+      expression: _readNode(data.spreadElement_expression),
+    );
+  }
+
+  StringInterpolation _read_stringInterpolation(LinkedNode data) {
+    return astFactory.stringInterpolation(
+      _readNodeList(data.stringInterpolation_elements),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  SuperConstructorInvocation _read_superConstructorInvocation(LinkedNode data) {
+    return astFactory.superConstructorInvocation(
+      _getToken(data.superConstructorInvocation_superKeyword),
+      _getToken(data.superConstructorInvocation_period),
+      _readNode(data.superConstructorInvocation_constructorName),
+      _readNode(data.superConstructorInvocation_arguments),
+    )..staticElement = _elementOfComponents(
+        data.superConstructorInvocation_element,
+        data.superConstructorInvocation_elementType,
+      );
+  }
+
+  SuperExpression _read_superExpression(LinkedNode data) {
+    return astFactory.superExpression(
+      _getToken(data.superExpression_superKeyword),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  SwitchCase _read_switchCase(LinkedNode data) {
+    return astFactory.switchCase(
+      _readNodeList(data.switchMember_labels),
+      _getToken(data.switchMember_keyword),
+      _readNode(data.switchCase_expression),
+      _getToken(data.switchMember_colon),
+      _readNodeList(data.switchMember_statements),
+    );
+  }
+
+  SwitchDefault _read_switchDefault(LinkedNode data) {
+    return astFactory.switchDefault(
+      _readNodeList(data.switchMember_labels),
+      _getToken(data.switchMember_keyword),
+      _getToken(data.switchMember_colon),
+      _readNodeList(data.switchMember_statements),
+    );
+  }
+
+  SwitchStatement _read_switchStatement(LinkedNode data) {
+    return astFactory.switchStatement(
+      _getToken(data.switchStatement_switchKeyword),
+      _getToken(data.switchStatement_leftParenthesis),
+      _readNode(data.switchStatement_expression),
+      _getToken(data.switchStatement_rightParenthesis),
+      _getToken(data.switchStatement_leftBracket),
+      _readNodeList(data.switchStatement_members),
+      _getToken(data.switchStatement_rightBracket),
+    );
+  }
+
+  SymbolLiteral _read_symbolLiteral(LinkedNode data) {
+    return astFactory.symbolLiteral(
+      _getToken(data.symbolLiteral_poundSign),
+      _getTokens(data.symbolLiteral_components),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  ThisExpression _read_thisExpression(LinkedNode data) {
+    return astFactory.thisExpression(
+      _getToken(data.thisExpression_thisKeyword),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  ThrowExpression _read_throwExpression(LinkedNode data) {
+    return astFactory.throwExpression(
+      _getToken(data.throwExpression_throwKeyword),
+      _readNode(data.throwExpression_expression),
+    )..staticType = _readType(data.expression_type);
+  }
+
+  TopLevelVariableDeclaration _read_topLevelVariableDeclaration(
+      LinkedNode data) {
+    var node = astFactory.topLevelVariableDeclaration(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _readNode(data.topLevelVariableDeclaration_variableList),
+      _getToken(data.topLevelVariableDeclaration_semicolon),
+    );
+    LazyTopLevelVariableDeclaration.setData(node, data);
+    return node;
+  }
+
+  TryStatement _read_tryStatement(LinkedNode data) {
+    return astFactory.tryStatement(
+      _getToken(data.tryStatement_tryKeyword),
+      _readNode(data.tryStatement_body),
+      _readNodeList(data.tryStatement_catchClauses),
+      _getToken(data.tryStatement_finallyKeyword),
+      _readNode(data.tryStatement_finallyBlock),
+    );
+  }
+
+  TypeArgumentList _read_typeArgumentList(LinkedNode data) {
+    return astFactory.typeArgumentList(
+      _getToken(data.typeArgumentList_leftBracket),
+      _readNodeList(data.typeArgumentList_arguments),
+      _getToken(data.typeArgumentList_rightBracket),
+    );
+  }
+
+  TypeName _read_typeName(LinkedNode data) {
+    return astFactory.typeName(
+      _readNode(data.typeName_name),
+      _readNode(data.typeName_typeArguments),
+      question: _getToken(data.typeName_question),
+    )..type = _readType(data.typeName_type);
+  }
+
+  TypeParameter _read_typeParameter(LinkedNode data) {
+    var node = astFactory.typeParameter(
+      _readNodeLazy(data.annotatedNode_comment),
+      _readNodeListLazy(data.annotatedNode_metadata),
+      _readNode(data.typeParameter_name),
+      _getToken(data.typeParameter_extendsKeyword),
+      _readNodeLazy(data.typeParameter_bound),
+    );
+    LazyTypeParameter.setData(node, data);
+    return node;
+  }
+
+  TypeParameterList _read_typeParameterList(LinkedNode data) {
+    return astFactory.typeParameterList(
+      _getToken(data.typeParameterList_leftBracket),
+      _readNodeList(data.typeParameterList_typeParameters),
+      _getToken(data.typeParameterList_rightBracket),
+    );
+  }
+
+  VariableDeclaration _read_variableDeclaration(LinkedNode data) {
+    var node = astFactory.variableDeclaration(
+      _readNode(data.variableDeclaration_name),
+      _getToken(data.variableDeclaration_equals),
+      _readNodeLazy(data.variableDeclaration_initializer),
+    );
+    LazyVariableDeclaration.setData(node, data);
+    LazyAst.setInheritsCovariant(node, data.inheritsCovariant);
+    return node;
+  }
+
+  VariableDeclarationList _read_variableDeclarationList(LinkedNode data) {
+    var node = astFactory.variableDeclarationList2(
+      comment: _readNodeLazy(data.annotatedNode_comment),
+      keyword: _getToken(data.variableDeclarationList_keyword),
+      lateKeyword: _getToken(data.variableDeclarationList_lateKeyword),
+      metadata: _readNodeListLazy(data.annotatedNode_metadata),
+      type: _readNodeLazy(data.variableDeclarationList_type),
+      variables: _readNodeList(data.variableDeclarationList_variables),
+    );
+    LazyVariableDeclarationList.setData(node, data);
+    return node;
+  }
+
+  VariableDeclarationStatement _read_variableDeclarationStatement(
+      LinkedNode data) {
+    return astFactory.variableDeclarationStatement(
+      _readNode(data.variableDeclarationStatement_variables),
+      _getToken(data.variableDeclarationStatement_semicolon),
+    );
+  }
+
+  WhileStatement _read_whileStatement(LinkedNode data) {
+    return astFactory.whileStatement(
+      _getToken(data.whileStatement_whileKeyword),
+      _getToken(data.whileStatement_leftParenthesis),
+      _readNode(data.whileStatement_condition),
+      _getToken(data.whileStatement_rightParenthesis),
+      _readNode(data.whileStatement_body),
+    );
+  }
+
+  WithClause _read_withClause(LinkedNode data) {
+    return astFactory.withClause(
+      _getToken(data.withClause_withKeyword),
+      _readNodeList(data.withClause_mixinTypes),
+    );
+  }
+
+  YieldStatement _read_yieldStatement(LinkedNode data) {
+    return astFactory.yieldStatement(
+      _getToken(data.yieldStatement_yieldKeyword),
+      _getToken(data.yieldStatement_star),
+      _readNode(data.yieldStatement_expression),
+      _getToken(data.yieldStatement_semicolon),
+    );
+  }
+
+  AstNode _readNode(LinkedNode data) {
     if (data == null) return null;
 
     switch (data.kind) {
@@ -60,6 +1342,8 @@
         return _read_classTypeAlias(data);
       case LinkedNodeKind.comment:
         return _read_comment(data);
+      case LinkedNodeKind.commentReference:
+        return _read_commentReference(data);
       case LinkedNodeKind.compilationUnit:
         return _read_compilationUnit(data);
       case LinkedNodeKind.conditionalExpression:
@@ -176,6 +1460,10 @@
         return _read_mixinDeclaration(data);
       case LinkedNodeKind.namedExpression:
         return _read_namedExpression(data);
+      case LinkedNodeKind.nativeClause:
+        return _read_nativeClause(data);
+      case LinkedNodeKind.nativeFunctionBody:
+        return _read_nativeFunctionBody(data);
       case LinkedNodeKind.nullLiteral:
         return _read_nullLiteral(data);
       case LinkedNodeKind.onClause:
@@ -261,1187 +1549,45 @@
     }
   }
 
-  T _getElement<T extends Element>(int index) {
-    var bundleContext = _unitContext.bundleContext;
-    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);
-  }
-
-  List<Token> _getTokens(List<int> indexList) {
-    var result = List<Token>(indexList.length);
-    for (var i = 0; i < indexList.length; ++i) {
-      var index = indexList[i];
-      result[i] = _getToken(index);
-    }
-    return result;
-  }
-
-  AdjacentStrings _read_adjacentStrings(LinkedNode data) {
-    return astFactory.adjacentStrings(
-      _readNodeList(data.adjacentStrings_strings),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  Annotation _read_annotation(LinkedNode data) {
-    return astFactory.annotation(
-      _getToken(data.annotation_atSign),
-      readNode(data.annotation_name),
-      _getToken(data.annotation_period),
-      readNode(data.annotation_constructorName),
-      readNode(data.annotation_arguments),
-    );
-  }
-
-  ArgumentList _read_argumentList(LinkedNode data) {
-    return astFactory.argumentList(
-      _getToken(data.argumentList_leftParenthesis),
-      _readNodeList(data.argumentList_arguments),
-      _getToken(data.argumentList_rightParenthesis),
-    );
-  }
-
-  AsExpression _read_asExpression(LinkedNode data) {
-    return astFactory.asExpression(
-      readNode(data.asExpression_expression),
-      _getToken(data.asExpression_asOperator),
-      readNode(data.asExpression_type),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  AssertInitializer _read_assertInitializer(LinkedNode data) {
-    return astFactory.assertInitializer(
-      _getToken(data.assertInitializer_assertKeyword),
-      _getToken(data.assertInitializer_leftParenthesis),
-      readNode(data.assertInitializer_condition),
-      _getToken(data.assertInitializer_comma),
-      readNode(data.assertInitializer_message),
-      _getToken(data.assertInitializer_rightParenthesis),
-    );
-  }
-
-  AssertStatement _read_assertStatement(LinkedNode data) {
-    return astFactory.assertStatement(
-      _getToken(data.assertStatement_assertKeyword),
-      _getToken(data.assertStatement_leftParenthesis),
-      readNode(data.assertStatement_condition),
-      _getToken(data.assertStatement_comma),
-      readNode(data.assertStatement_message),
-      _getToken(data.assertStatement_rightParenthesis),
-      _getToken(data.assertStatement_semicolon),
-    );
-  }
-
-  AssignmentExpression _read_assignmentExpression(LinkedNode data) {
-    return astFactory.assignmentExpression(
-      readNode(data.assignmentExpression_leftHandSide),
-      _getToken(data.assignmentExpression_operator),
-      readNode(data.assignmentExpression_rightHandSide),
-    )
-      ..staticElement = _getElement(data.assignmentExpression_element)
-      ..staticType = _readType(data.expression_type);
-  }
-
-  AwaitExpression _read_awaitExpression(LinkedNode data) {
-    return astFactory.awaitExpression(
-      _getToken(data.awaitExpression_awaitKeyword),
-      readNode(data.awaitExpression_expression),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  BinaryExpression _read_binaryExpression(LinkedNode data) {
-    return astFactory.binaryExpression(
-      readNode(data.binaryExpression_leftOperand),
-      _getToken(data.binaryExpression_operator),
-      readNode(data.binaryExpression_rightOperand),
-    )
-      ..staticElement = _getElement(data.binaryExpression_element)
-      ..staticType = _readType(data.expression_type);
-  }
-
-  Block _read_block(LinkedNode data) {
-    return astFactory.block(
-      _getToken(data.block_leftBracket),
-      _readNodeList(data.block_statements),
-      _getToken(data.block_rightBracket),
-    );
-  }
-
-  BlockFunctionBody _read_blockFunctionBody(LinkedNode data) {
-    return astFactory.blockFunctionBody(
-      _getToken(data.blockFunctionBody_keyword),
-      _getToken(data.blockFunctionBody_star),
-      readNode(data.blockFunctionBody_block),
-    );
-  }
-
-  BooleanLiteral _read_booleanLiteral(LinkedNode data) {
-    return astFactory.booleanLiteral(
-      _getToken(data.booleanLiteral_literal),
-      data.booleanLiteral_value,
-    )..staticType = _readType(data.expression_type);
-  }
-
-  BreakStatement _read_breakStatement(LinkedNode data) {
-    return astFactory.breakStatement(
-      _getToken(data.breakStatement_breakKeyword),
-      readNode(data.breakStatement_label),
-      _getToken(data.breakStatement_semicolon),
-    );
-  }
-
-  CascadeExpression _read_cascadeExpression(LinkedNode data) {
-    return astFactory.cascadeExpression(
-      readNode(data.cascadeExpression_target),
-      _readNodeList(data.cascadeExpression_sections),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  CatchClause _read_catchClause(LinkedNode data) {
-    return astFactory.catchClause(
-      _getToken(data.catchClause_onKeyword),
-      readNode(data.catchClause_exceptionType),
-      _getToken(data.catchClause_catchKeyword),
-      _getToken(data.catchClause_leftParenthesis),
-      readNode(data.catchClause_exceptionParameter),
-      _getToken(data.catchClause_comma),
-      readNode(data.catchClause_stackTraceParameter),
-      _getToken(data.catchClause_rightParenthesis),
-      readNode(data.catchClause_body),
-    );
-  }
-
-  ClassDeclaration _read_classDeclaration(LinkedNode data) {
-    return astFactory.classDeclaration(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.classDeclaration_abstractKeyword),
-      _getToken(data.classDeclaration_classKeyword),
-      readNode(data.namedCompilationUnitMember_name),
-      readNode(data.classOrMixinDeclaration_typeParameters),
-      readNode(data.classDeclaration_extendsClause),
-      readNode(data.classDeclaration_withClause),
-      readNode(data.classOrMixinDeclaration_implementsClause),
-      _getToken(data.classOrMixinDeclaration_leftBracket),
-      _readNodeList(data.classOrMixinDeclaration_members),
-      _getToken(data.classOrMixinDeclaration_rightBracket),
-    );
-  }
-
-  ClassTypeAlias _read_classTypeAlias(LinkedNode data) {
-    return astFactory.classTypeAlias(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.typeAlias_typedefKeyword),
-      readNode(data.namedCompilationUnitMember_name),
-      readNode(data.classTypeAlias_typeParameters),
-      _getToken(data.classTypeAlias_equals),
-      _getToken(data.classTypeAlias_abstractKeyword),
-      readNode(data.classTypeAlias_superclass),
-      readNode(data.classTypeAlias_withClause),
-      readNode(data.classTypeAlias_implementsClause),
-      _getToken(data.typeAlias_semicolon),
-    );
-  }
-
-  Comment _read_comment(LinkedNode data) {
-    var tokens = _getTokens(data.comment_tokens);
-    switch (data.comment_type) {
-      case LinkedNodeCommentType.block:
-        return astFactory.endOfLineComment(
-          tokens,
-        );
-      case LinkedNodeCommentType.documentation:
-        return astFactory.documentationComment(
-          tokens,
-          // TODO(scheglov) references
-        );
-      case LinkedNodeCommentType.endOfLine:
-        return astFactory.endOfLineComment(
-          tokens,
-        );
-      default:
-        throw StateError('${data.comment_type}');
-    }
-  }
-
-  CompilationUnit _read_compilationUnit(LinkedNode data) {
-    return astFactory.compilationUnit(
-      _getToken(data.compilationUnit_beginToken),
-      readNode(data.compilationUnit_scriptTag),
-      _readNodeList(data.compilationUnit_directives),
-      _readNodeList(data.compilationUnit_declarations),
-      _getToken(data.compilationUnit_endToken),
-    );
-  }
-
-  ConditionalExpression _read_conditionalExpression(LinkedNode data) {
-    return astFactory.conditionalExpression(
-      readNode(data.conditionalExpression_condition),
-      _getToken(data.conditionalExpression_question),
-      readNode(data.conditionalExpression_thenExpression),
-      _getToken(data.conditionalExpression_colon),
-      readNode(data.conditionalExpression_elseExpression),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  Configuration _read_configuration(LinkedNode data) {
-    return astFactory.configuration(
-      _getToken(data.configuration_ifKeyword),
-      _getToken(data.configuration_leftParenthesis),
-      readNode(data.configuration_name),
-      _getToken(data.configuration_equalToken),
-      readNode(data.configuration_value),
-      _getToken(data.configuration_rightParenthesis),
-      readNode(data.configuration_uri),
-    );
-  }
-
-  ConstructorDeclaration _read_constructorDeclaration(LinkedNode data) {
-    return astFactory.constructorDeclaration(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.constructorDeclaration_externalKeyword),
-      _getToken(data.constructorDeclaration_constKeyword),
-      _getToken(data.constructorDeclaration_factoryKeyword),
-      readNode(data.constructorDeclaration_returnType),
-      _getToken(data.constructorDeclaration_period),
-      readNode(data.constructorDeclaration_name),
-      readNode(data.constructorDeclaration_parameters),
-      _getToken(data.constructorDeclaration_separator),
-      _readNodeList(data.constructorDeclaration_initializers),
-      readNode(data.constructorDeclaration_redirectedConstructor),
-      readNode(data.constructorDeclaration_body),
-    );
-  }
-
-  ConstructorFieldInitializer _read_constructorFieldInitializer(
-      LinkedNode data) {
-    return astFactory.constructorFieldInitializer(
-      _getToken(data.constructorFieldInitializer_thisKeyword),
-      _getToken(data.constructorFieldInitializer_period),
-      readNode(data.constructorFieldInitializer_fieldName),
-      _getToken(data.constructorFieldInitializer_equals),
-      readNode(data.constructorFieldInitializer_expression),
-    );
-  }
-
-  ConstructorName _read_constructorName(LinkedNode data) {
-    return astFactory.constructorName(
-      readNode(data.constructorName_type),
-      _getToken(data.constructorName_period),
-      readNode(data.constructorName_name),
-    )..staticElement = _getElement(data.constructorName_element);
-  }
-
-  ContinueStatement _read_continueStatement(LinkedNode data) {
-    return astFactory.continueStatement(
-      _getToken(data.continueStatement_continueKeyword),
-      readNode(data.continueStatement_label),
-      _getToken(data.continueStatement_semicolon),
-    );
-  }
-
-  DeclaredIdentifier _read_declaredIdentifier(LinkedNode data) {
-    return astFactory.declaredIdentifier(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.declaredIdentifier_keyword),
-      readNode(data.declaredIdentifier_type),
-      readNode(data.declaredIdentifier_identifier),
-    );
-  }
-
-  DefaultFormalParameter _read_defaultFormalParameter(LinkedNode data) {
-    return astFactory.defaultFormalParameter(
-      readNode(data.defaultFormalParameter_parameter),
-      data.defaultFormalParameter_isNamed
-          ? ParameterKind.NAMED
-          : ParameterKind.POSITIONAL,
-      _getToken(data.defaultFormalParameter_separator),
-      readNode(data.defaultFormalParameter_defaultValue),
-    );
-  }
-
-  DoStatement _read_doStatement(LinkedNode data) {
-    return astFactory.doStatement(
-      _getToken(data.doStatement_doKeyword),
-      readNode(data.doStatement_body),
-      _getToken(data.doStatement_whileKeyword),
-      _getToken(data.doStatement_leftParenthesis),
-      readNode(data.doStatement_condition),
-      _getToken(data.doStatement_rightParenthesis),
-      _getToken(data.doStatement_semicolon),
-    );
-  }
-
-  DottedName _read_dottedName(LinkedNode data) {
-    return astFactory.dottedName(
-      _readNodeList(data.dottedName_components),
-    );
-  }
-
-  DoubleLiteral _read_doubleLiteral(LinkedNode data) {
-    return astFactory.doubleLiteral(
-      _getToken(data.doubleLiteral_literal),
-      data.doubleLiteral_value,
-    )..staticType = _readType(data.expression_type);
-  }
-
-  EmptyFunctionBody _read_emptyFunctionBody(LinkedNode data) {
-    return astFactory.emptyFunctionBody(
-      _getToken(data.emptyFunctionBody_semicolon),
-    );
-  }
-
-  EmptyStatement _read_emptyStatement(LinkedNode data) {
-    return astFactory.emptyStatement(
-      _getToken(data.emptyStatement_semicolon),
-    );
-  }
-
-  EnumConstantDeclaration _read_enumConstantDeclaration(LinkedNode data) {
-    return astFactory.enumConstantDeclaration(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      readNode(data.enumConstantDeclaration_name),
-    );
-  }
-
-  EnumDeclaration _read_enumDeclaration(LinkedNode data) {
-    return astFactory.enumDeclaration(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.enumDeclaration_enumKeyword),
-      readNode(data.namedCompilationUnitMember_name),
-      _getToken(data.enumDeclaration_leftBracket),
-      _readNodeList(data.enumDeclaration_constants),
-      _getToken(data.enumDeclaration_rightBracket),
-    );
-  }
-
-  ExportDirective _read_exportDirective(LinkedNode data) {
-    return astFactory.exportDirective(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.directive_keyword),
-      readNode(data.uriBasedDirective_uri),
-      _readNodeList(data.namespaceDirective_configurations),
-      _readNodeList(data.namespaceDirective_combinators),
-      _getToken(data.namespaceDirective_semicolon),
-    );
-  }
-
-  ExpressionFunctionBody _read_expressionFunctionBody(LinkedNode data) {
-    return astFactory.expressionFunctionBody(
-      _getToken(data.expressionFunctionBody_keyword),
-      _getToken(data.expressionFunctionBody_arrow),
-      readNode(data.expressionFunctionBody_expression),
-      _getToken(data.expressionFunctionBody_semicolon),
-    );
-  }
-
-  ExpressionStatement _read_expressionStatement(LinkedNode data) {
-    return astFactory.expressionStatement(
-      readNode(data.expressionStatement_expression),
-      _getToken(data.expressionStatement_semicolon),
-    );
-  }
-
-  ExtendsClause _read_extendsClause(LinkedNode data) {
-    return astFactory.extendsClause(
-      _getToken(data.extendsClause_extendsKeyword),
-      readNode(data.extendsClause_superclass),
-    );
-  }
-
-  FieldDeclaration _read_fieldDeclaration(LinkedNode data) {
-    return astFactory.fieldDeclaration2(
-      comment: readNode(data.annotatedNode_comment),
-      covariantKeyword: _getToken(data.fieldDeclaration_covariantKeyword),
-      fieldList: readNode(data.fieldDeclaration_fields),
-      metadata: _readNodeList(data.annotatedNode_metadata),
-      semicolon: _getToken(data.fieldDeclaration_semicolon),
-      staticKeyword: _getToken(data.fieldDeclaration_staticKeyword),
-    );
-  }
-
-  FieldFormalParameter _read_fieldFormalParameter(LinkedNode data) {
-    return astFactory.fieldFormalParameter2(
-      identifier: readNode(data.normalFormalParameter_identifier),
-      period: _getToken(data.fieldFormalParameter_period),
-      thisKeyword: _getToken(data.fieldFormalParameter_thisKeyword),
-      covariantKeyword: _getToken(data.normalFormalParameter_covariantKeyword),
-      typeParameters: readNode(data.fieldFormalParameter_typeParameters),
-      keyword: _getToken(data.fieldFormalParameter_keyword),
-      metadata: _readNodeList(data.normalFormalParameter_metadata),
-      comment: readNode(data.normalFormalParameter_comment),
-      type: readNode(data.fieldFormalParameter_type),
-      parameters: readNode(data.fieldFormalParameter_formalParameters),
-    );
-  }
-
-  ForEachPartsWithDeclaration _read_forEachPartsWithDeclaration(
-      LinkedNode data) {
-    return astFactory.forEachPartsWithDeclaration(
-      inKeyword: _getToken(data.forEachParts_inKeyword),
-      iterable: readNode(data.forEachParts_iterable),
-      loopVariable: readNode(data.forEachPartsWithDeclaration_loopVariable),
-    );
-  }
-
-  ForEachPartsWithIdentifier _read_forEachPartsWithIdentifier(LinkedNode data) {
-    return astFactory.forEachPartsWithIdentifier(
-      inKeyword: _getToken(data.forEachParts_inKeyword),
-      iterable: readNode(data.forEachParts_iterable),
-      identifier: readNode(data.forEachPartsWithIdentifier_identifier),
-    );
-  }
-
-  ForElement _read_forElement(LinkedNode data) {
-    return astFactory.forElement(
-      awaitKeyword: _getToken(data.forMixin_awaitKeyword),
-      body: readNode(data.forElement_body),
-      forKeyword: _getToken(data.forMixin_forKeyword),
-      forLoopParts: readNode(data.forMixin_forLoopParts),
-      leftParenthesis: _getToken(data.forMixin_leftParenthesis),
-      rightParenthesis: _getToken(data.forMixin_rightParenthesis),
-    );
-  }
-
-  FormalParameterList _read_formalParameterList(LinkedNode data) {
-    return astFactory.formalParameterList(
-      _getToken(data.formalParameterList_leftParenthesis),
-      _readNodeList(data.formalParameterList_parameters),
-      _getToken(data.formalParameterList_leftDelimiter),
-      _getToken(data.formalParameterList_rightDelimiter),
-      _getToken(data.formalParameterList_rightParenthesis),
-    );
-  }
-
-  ForPartsWithDeclarations _read_forPartsWithDeclarations(LinkedNode data) {
-    return astFactory.forPartsWithDeclarations(
-      condition: readNode(data.forParts_condition),
-      leftSeparator: _getToken(data.forParts_leftSeparator),
-      rightSeparator: _getToken(data.forParts_rightSeparator),
-      updaters: _readNodeList(data.forParts_updaters),
-      variables: readNode(data.forPartsWithDeclarations_variables),
-    );
-  }
-
-  ForPartsWithExpression _read_forPartsWithExpression(LinkedNode data) {
-    return astFactory.forPartsWithExpression(
-      condition: readNode(data.forParts_condition),
-      initialization: readNode(data.forPartsWithExpression_initialization),
-      leftSeparator: _getToken(data.forParts_leftSeparator),
-      rightSeparator: _getToken(data.forParts_rightSeparator),
-      updaters: _readNodeList(data.forParts_updaters),
-    );
-  }
-
-  ForStatement2 _read_forStatement(LinkedNode data) {
-    return astFactory.forStatement2(
-      forKeyword: _getToken(data.forMixin_forKeyword),
-      leftParenthesis: _getToken(data.forMixin_leftParenthesis),
-      forLoopParts: readNode(data.forMixin_forLoopParts),
-      rightParenthesis: _getToken(data.forMixin_rightParenthesis),
-      body: readNode(data.forStatement_body),
-    );
-  }
-
-  FunctionDeclaration _read_functionDeclaration(LinkedNode data) {
-    return astFactory.functionDeclaration(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.functionDeclaration_externalKeyword),
-      readNode(data.functionDeclaration_returnType),
-      _getToken(data.functionDeclaration_propertyKeyword),
-      readNode(data.namedCompilationUnitMember_name),
-      readNode(data.functionDeclaration_functionExpression),
-    );
-  }
-
-  FunctionDeclarationStatement _read_functionDeclarationStatement(
-      LinkedNode data) {
-    return astFactory.functionDeclarationStatement(
-      readNode(data.functionDeclarationStatement_functionDeclaration),
-    );
-  }
-
-  FunctionExpression _read_functionExpression(LinkedNode data) {
-    return astFactory.functionExpression(
-      readNode(data.functionExpression_typeParameters),
-      readNode(data.functionExpression_formalParameters),
-      readNode(data.functionExpression_body),
-    );
-  }
-
-  FunctionExpressionInvocation _read_functionExpressionInvocation(
-      LinkedNode data) {
-    return astFactory.functionExpressionInvocation(
-      readNode(data.functionExpressionInvocation_function),
-      readNode(data.invocationExpression_typeArguments),
-      readNode(data.invocationExpression_arguments),
-    )..staticInvokeType = _readType(data.invocationExpression_invokeType);
-  }
-
-  FunctionTypeAlias _read_functionTypeAlias(LinkedNode data) {
-    return astFactory.functionTypeAlias(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.typeAlias_typedefKeyword),
-      readNode(data.functionTypeAlias_returnType),
-      readNode(data.namedCompilationUnitMember_name),
-      readNode(data.functionTypeAlias_typeParameters),
-      readNode(data.functionTypeAlias_formalParameters),
-      _getToken(data.typeAlias_semicolon),
-    );
-  }
-
-  FunctionTypedFormalParameter _read_functionTypedFormalParameter(
-      LinkedNode data) {
-    return astFactory.functionTypedFormalParameter2(
-      identifier: readNode(data.normalFormalParameter_identifier),
-      parameters: readNode(data.functionTypedFormalParameter_formalParameters),
-      returnType: readNode(data.functionTypedFormalParameter_returnType),
-      covariantKeyword: _getToken(data.normalFormalParameter_covariantKeyword),
-      comment: readNode(data.normalFormalParameter_comment),
-      metadata: _readNodeList(data.normalFormalParameter_metadata),
-      typeParameters:
-          readNode(data.functionTypedFormalParameter_typeParameters),
-    );
-  }
-
-  GenericFunctionType _read_genericFunctionType(LinkedNode data) {
-    return astFactory.genericFunctionType(
-      readNode(data.genericFunctionType_returnType),
-      _getToken(data.genericFunctionType_functionKeyword),
-      readNode(data.genericFunctionType_typeParameters),
-      readNode(data.genericFunctionType_formalParameters),
-      question: _getToken(data.genericFunctionType_question),
-    );
-  }
-
-  GenericTypeAlias _read_genericTypeAlias(LinkedNode data) {
-    return astFactory.genericTypeAlias(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.typeAlias_typedefKeyword),
-      readNode(data.namedCompilationUnitMember_name),
-      readNode(data.genericTypeAlias_typeParameters),
-      _getToken(data.genericTypeAlias_equals),
-      readNode(data.genericTypeAlias_functionType),
-      _getToken(data.typeAlias_semicolon),
-    );
-  }
-
-  HideCombinator _read_hideCombinator(LinkedNode data) {
-    return astFactory.hideCombinator(
-      _getToken(data.combinator_keyword),
-      _readNodeList(data.hideCombinator_hiddenNames),
-    );
-  }
-
-  IfElement _read_ifElement(LinkedNode data) {
-    return astFactory.ifElement(
-      condition: readNode(data.ifMixin_condition),
-      elseElement: readNode(data.ifElement_elseElement),
-      elseKeyword: _getToken(data.ifMixin_elseKeyword),
-      ifKeyword: _getToken(data.ifMixin_ifKeyword),
-      leftParenthesis: _getToken(data.ifMixin_leftParenthesis),
-      rightParenthesis: _getToken(data.ifMixin_rightParenthesis),
-      thenElement: readNode(data.ifElement_thenElement),
-    );
-  }
-
-  IfStatement _read_ifStatement(LinkedNode data) {
-    return astFactory.ifStatement(
-      _getToken(data.ifMixin_ifKeyword),
-      _getToken(data.ifMixin_leftParenthesis),
-      readNode(data.ifMixin_condition),
-      _getToken(data.ifMixin_rightParenthesis),
-      readNode(data.ifStatement_thenStatement),
-      _getToken(data.ifMixin_elseKeyword),
-      readNode(data.ifStatement_elseStatement),
-    );
-  }
-
-  ImplementsClause _read_implementsClause(LinkedNode data) {
-    return astFactory.implementsClause(
-      _getToken(data.implementsClause_implementsKeyword),
-      _readNodeList(data.implementsClause_interfaces),
-    );
-  }
-
-  ImportDirective _read_importDirective(LinkedNode data) {
-    return astFactory.importDirective(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.directive_keyword),
-      readNode(data.uriBasedDirective_uri),
-      _readNodeList(data.namespaceDirective_configurations),
-      _getToken(data.importDirective_deferredKeyword),
-      _getToken(data.importDirective_asKeyword),
-      readNode(data.importDirective_prefix),
-      _readNodeList(data.namespaceDirective_combinators),
-      _getToken(data.namespaceDirective_semicolon),
-    );
-  }
-
-  IndexExpression _read_indexExpression(LinkedNode data) {
-    return astFactory.indexExpressionForTarget(
-      readNode(data.indexExpression_target),
-      _getToken(data.indexExpression_leftBracket),
-      readNode(data.indexExpression_index),
-      _getToken(data.indexExpression_rightBracket),
-    )
-      ..staticElement = _getElement(data.indexExpression_element)
-      ..staticType = _readType(data.expression_type);
-  }
-
-  InstanceCreationExpression _read_instanceCreationExpression(LinkedNode data) {
-    return astFactory.instanceCreationExpression(
-      _getToken(data.instanceCreationExpression_keyword),
-      readNode(data.instanceCreationExpression_constructorName),
-      readNode(data.instanceCreationExpression_arguments),
-      typeArguments: readNode(data.instanceCreationExpression_typeArguments),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  IntegerLiteral _read_integerLiteral(LinkedNode data) {
-    return astFactory.integerLiteral(
-      _getToken(data.integerLiteral_literal),
-      data.integerLiteral_value,
-    )..staticType = _readType(data.expression_type);
-  }
-
-  InterpolationExpression _read_interpolationExpression(LinkedNode data) {
-    return astFactory.interpolationExpression(
-      _getToken(data.interpolationExpression_leftBracket),
-      readNode(data.interpolationExpression_expression),
-      _getToken(data.interpolationExpression_rightBracket),
-    );
-  }
-
-  InterpolationString _read_interpolationString(LinkedNode data) {
-    return astFactory.interpolationString(
-      _getToken(data.interpolationString_token),
-      data.interpolationString_value,
-    );
-  }
-
-  IsExpression _read_isExpression(LinkedNode data) {
-    return astFactory.isExpression(
-      readNode(data.isExpression_expression),
-      _getToken(data.isExpression_isOperator),
-      _getToken(data.isExpression_notOperator),
-      readNode(data.isExpression_type),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  Label _read_label(LinkedNode data) {
-    return astFactory.label(
-      readNode(data.label_label),
-      _getToken(data.label_colon),
-    );
-  }
-
-  LabeledStatement _read_labeledStatement(LinkedNode data) {
-    return astFactory.labeledStatement(
-      _readNodeList(data.labeledStatement_labels),
-      readNode(data.labeledStatement_statement),
-    );
-  }
-
-  LibraryDirective _read_libraryDirective(LinkedNode data) {
-    return astFactory.libraryDirective(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.directive_keyword),
-      readNode(data.libraryDirective_name),
-      _getToken(data.namespaceDirective_semicolon),
-    );
-  }
-
-  LibraryIdentifier _read_libraryIdentifier(LinkedNode data) {
-    return astFactory.libraryIdentifier(
-      _readNodeList(data.libraryIdentifier_components),
-    );
-  }
-
-  ListLiteral _read_listLiteral(LinkedNode data) {
-    return astFactory.listLiteral(
-      _getToken(data.typedLiteral_constKeyword),
-      readNode(data.typedLiteral_typeArguments),
-      _getToken(data.listLiteral_leftBracket),
-      _readNodeList(data.listLiteral_elements),
-      _getToken(data.listLiteral_rightBracket),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  MapLiteralEntry _read_mapLiteralEntry(LinkedNode data) {
-    return astFactory.mapLiteralEntry(
-      readNode(data.mapLiteralEntry_key),
-      _getToken(data.mapLiteralEntry_separator),
-      readNode(data.mapLiteralEntry_value),
-    );
-  }
-
-  MethodDeclaration _read_methodDeclaration(LinkedNode data) {
-    return astFactory.methodDeclaration(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.methodDeclaration_externalKeyword),
-      _getToken(data.methodDeclaration_modifierKeyword),
-      readNode(data.methodDeclaration_returnType),
-      _getToken(data.methodDeclaration_propertyKeyword),
-      _getToken(data.methodDeclaration_operatorKeyword),
-      readNode(data.methodDeclaration_name),
-      readNode(data.methodDeclaration_typeParameters),
-      readNode(data.methodDeclaration_formalParameters),
-      readNode(data.methodDeclaration_body),
-    );
-  }
-
-  MethodInvocation _read_methodInvocation(LinkedNode data) {
-    return astFactory.methodInvocation(
-      readNode(data.methodInvocation_target),
-      _getToken(data.methodInvocation_operator),
-      readNode(data.methodInvocation_methodName),
-      readNode(data.invocationExpression_typeArguments),
-      readNode(data.invocationExpression_arguments),
-    )..staticInvokeType = _readType(data.invocationExpression_invokeType);
-  }
-
-  MixinDeclaration _read_mixinDeclaration(LinkedNode data) {
-    return astFactory.mixinDeclaration(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.mixinDeclaration_mixinKeyword),
-      readNode(data.namedCompilationUnitMember_name),
-      readNode(data.classOrMixinDeclaration_typeParameters),
-      readNode(data.mixinDeclaration_onClause),
-      readNode(data.classOrMixinDeclaration_implementsClause),
-      _getToken(data.classOrMixinDeclaration_leftBracket),
-      _readNodeList(data.classOrMixinDeclaration_members),
-      _getToken(data.classOrMixinDeclaration_rightBracket),
-    );
-  }
-
-  NamedExpression _read_namedExpression(LinkedNode data) {
-    return astFactory.namedExpression(
-      readNode(data.namedExpression_name),
-      readNode(data.namedExpression_expression),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  NullLiteral _read_nullLiteral(LinkedNode data) {
-    return astFactory.nullLiteral(
-      _getToken(data.nullLiteral_literal),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  OnClause _read_onClause(LinkedNode data) {
-    return astFactory.onClause(
-      _getToken(data.onClause_onKeyword),
-      _readNodeList(data.onClause_superclassConstraints),
-    );
-  }
-
-  ParenthesizedExpression _read_parenthesizedExpression(LinkedNode data) {
-    return astFactory.parenthesizedExpression(
-      _getToken(data.parenthesizedExpression_leftParenthesis),
-      readNode(data.parenthesizedExpression_expression),
-      _getToken(data.parenthesizedExpression_rightParenthesis),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  PartDirective _read_partDirective(LinkedNode data) {
-    return astFactory.partDirective(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.directive_keyword),
-      readNode(data.uriBasedDirective_uri),
-      _getToken(data.namespaceDirective_semicolon),
-    );
-  }
-
-  PartOfDirective _read_partOfDirective(LinkedNode data) {
-    return astFactory.partOfDirective(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.directive_keyword),
-      _getToken(data.partOfDirective_ofKeyword),
-      readNode(data.partOfDirective_uri),
-      readNode(data.partOfDirective_libraryName),
-      _getToken(data.partOfDirective_semicolon),
-    );
-  }
-
-  PostfixExpression _read_postfixExpression(LinkedNode data) {
-    return astFactory.postfixExpression(
-      readNode(data.postfixExpression_operand),
-      _getToken(data.postfixExpression_operator),
-    )
-      ..staticElement = _getElement(data.postfixExpression_element)
-      ..staticType = _readType(data.expression_type);
-  }
-
-  PrefixedIdentifier _read_prefixedIdentifier(LinkedNode data) {
-    return astFactory.prefixedIdentifier(
-      readNode(data.prefixedIdentifier_prefix),
-      _getToken(data.prefixedIdentifier_period),
-      readNode(data.prefixedIdentifier_identifier),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  PrefixExpression _read_prefixExpression(LinkedNode data) {
-    return astFactory.prefixExpression(
-      _getToken(data.prefixExpression_operator),
-      readNode(data.prefixExpression_operand),
-    )
-      ..staticElement = _getElement(data.prefixExpression_element)
-      ..staticType = _readType(data.expression_type);
-  }
-
-  PropertyAccess _read_propertyAccess(LinkedNode data) {
-    return astFactory.propertyAccess(
-      readNode(data.propertyAccess_target),
-      _getToken(data.propertyAccess_operator),
-      readNode(data.propertyAccess_propertyName),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  RedirectingConstructorInvocation _read_redirectingConstructorInvocation(
-      LinkedNode data) {
-    return astFactory.redirectingConstructorInvocation(
-      _getToken(data.redirectingConstructorInvocation_thisKeyword),
-      _getToken(data.redirectingConstructorInvocation_period),
-      readNode(data.redirectingConstructorInvocation_constructorName),
-      readNode(data.redirectingConstructorInvocation_arguments),
-    )..staticElement =
-        _getElement(data.redirectingConstructorInvocation_element);
-  }
-
-  RethrowExpression _read_rethrowExpression(LinkedNode data) {
-    return astFactory.rethrowExpression(
-      _getToken(data.rethrowExpression_rethrowKeyword),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  ReturnStatement _read_returnStatement(LinkedNode data) {
-    return astFactory.returnStatement(
-      _getToken(data.returnStatement_returnKeyword),
-      readNode(data.returnStatement_expression),
-      _getToken(data.returnStatement_semicolon),
-    );
-  }
-
-  ScriptTag _read_scriptTag(LinkedNode data) {
-    return astFactory.scriptTag(
-      _getToken(data.scriptTag_scriptTag),
-    );
-  }
-
-  SetOrMapLiteral _read_setOrMapLiteral(LinkedNode data) {
-    SetOrMapLiteralImpl node = astFactory.setOrMapLiteral(
-      constKeyword: _getToken(data.typedLiteral_constKeyword),
-      elements: _readNodeList(data.setOrMapLiteral_elements),
-      leftBracket: _getToken(data.setOrMapLiteral_leftBracket),
-      typeArguments: readNode(data.typedLiteral_typeArguments),
-      rightBracket: _getToken(data.setOrMapLiteral_leftBracket),
-    )..staticType = _readType(data.expression_type);
-    if (data.setOrMapLiteral_isMap) {
-      node.becomeMap();
-    } else if (data.setOrMapLiteral_isSet) {
-      node.becomeSet();
-    }
-    return node;
-  }
-
-  ShowCombinator _read_showCombinator(LinkedNode data) {
-    return astFactory.showCombinator(
-      _getToken(data.combinator_keyword),
-      _readNodeList(data.showCombinator_shownNames),
-    );
-  }
-
-  SimpleFormalParameter _read_simpleFormalParameter(LinkedNode data) {
-    return astFactory.simpleFormalParameter2(
-      identifier: readNode(data.normalFormalParameter_identifier),
-      type: readNode(data.simpleFormalParameter_type),
-      covariantKeyword: _getToken(data.normalFormalParameter_covariantKeyword),
-      comment: readNode(data.normalFormalParameter_comment),
-      metadata: _readNodeList(data.normalFormalParameter_metadata),
-      keyword: _getToken(data.simpleFormalParameter_keyword),
-    );
-  }
-
-  SimpleIdentifier _read_simpleIdentifier(LinkedNode data) {
-    return astFactory.simpleIdentifier(
-      _getToken(data.simpleIdentifier_token),
-    )
-      ..staticElement = _getElement(data.simpleIdentifier_element)
-      ..staticType = _readType(data.expression_type);
-  }
-
-  SimpleStringLiteral _read_simpleStringLiteral(LinkedNode data) {
-    return astFactory.simpleStringLiteral(
-      _getToken(data.simpleStringLiteral_token),
-      data.simpleStringLiteral_value,
-    )..staticType = _readType(data.expression_type);
-  }
-
-  SpreadElement _read_spreadElement(LinkedNode data) {
-    return astFactory.spreadElement(
-      spreadOperator: _getToken(data.spreadElement_spreadOperator),
-      expression: readNode(data.spreadElement_expression),
-    );
-  }
-
-  StringInterpolation _read_stringInterpolation(LinkedNode data) {
-    return astFactory.stringInterpolation(
-      _readNodeList(data.stringInterpolation_elements),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  SuperConstructorInvocation _read_superConstructorInvocation(LinkedNode data) {
-    return astFactory.superConstructorInvocation(
-      _getToken(data.superConstructorInvocation_superKeyword),
-      _getToken(data.superConstructorInvocation_period),
-      readNode(data.superConstructorInvocation_constructorName),
-      readNode(data.superConstructorInvocation_arguments),
-    )..staticElement = _getElement(data.superConstructorInvocation_element);
-  }
-
-  SuperExpression _read_superExpression(LinkedNode data) {
-    return astFactory.superExpression(
-      _getToken(data.superExpression_superKeyword),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  SwitchCase _read_switchCase(LinkedNode data) {
-    return astFactory.switchCase(
-      _readNodeList(data.switchMember_labels),
-      _getToken(data.switchMember_keyword),
-      readNode(data.switchCase_expression),
-      _getToken(data.switchMember_colon),
-      _readNodeList(data.switchMember_statements),
-    );
-  }
-
-  SwitchDefault _read_switchDefault(LinkedNode data) {
-    return astFactory.switchDefault(
-      _readNodeList(data.switchMember_labels),
-      _getToken(data.switchMember_keyword),
-      _getToken(data.switchMember_colon),
-      _readNodeList(data.switchMember_statements),
-    );
-  }
-
-  SwitchStatement _read_switchStatement(LinkedNode data) {
-    return astFactory.switchStatement(
-      _getToken(data.switchStatement_switchKeyword),
-      _getToken(data.switchStatement_leftParenthesis),
-      readNode(data.switchStatement_expression),
-      _getToken(data.switchStatement_rightParenthesis),
-      _getToken(data.switchStatement_leftBracket),
-      _readNodeList(data.switchStatement_members),
-      _getToken(data.switchStatement_rightBracket),
-    );
-  }
-
-  SymbolLiteral _read_symbolLiteral(LinkedNode data) {
-    return astFactory.symbolLiteral(
-      _getToken(data.symbolLiteral_poundSign),
-      _getTokens(data.symbolLiteral_components),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  ThisExpression _read_thisExpression(LinkedNode data) {
-    return astFactory.thisExpression(
-      _getToken(data.thisExpression_thisKeyword),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  ThrowExpression _read_throwExpression(LinkedNode data) {
-    return astFactory.throwExpression(
-      _getToken(data.throwExpression_throwKeyword),
-      readNode(data.throwExpression_expression),
-    )..staticType = _readType(data.expression_type);
-  }
-
-  TopLevelVariableDeclaration _read_topLevelVariableDeclaration(
-      LinkedNode data) {
-    return astFactory.topLevelVariableDeclaration(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      readNode(data.topLevelVariableDeclaration_variableList),
-      _getToken(data.topLevelVariableDeclaration_semicolon),
-    );
-  }
-
-  TryStatement _read_tryStatement(LinkedNode data) {
-    return astFactory.tryStatement(
-      _getToken(data.tryStatement_tryKeyword),
-      readNode(data.tryStatement_body),
-      _readNodeList(data.tryStatement_catchClauses),
-      _getToken(data.tryStatement_tryKeyword),
-      readNode(data.tryStatement_finallyBlock),
-    );
-  }
-
-  TypeArgumentList _read_typeArgumentList(LinkedNode data) {
-    return astFactory.typeArgumentList(
-      _getToken(data.typeArgumentList_leftBracket),
-      _readNodeList(data.typeArgumentList_arguments),
-      _getToken(data.typeArgumentList_rightBracket),
-    );
-  }
-
-  TypeName _read_typeName(LinkedNode data) {
-    return astFactory.typeName(
-      readNode(data.typeName_name),
-      readNode(data.typeName_typeArguments),
-      question: _getToken(data.typeName_question),
-    )..type = _readType(data.typeName_type);
-  }
-
-  TypeParameter _read_typeParameter(LinkedNode data) {
-    return astFactory.typeParameter(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      readNode(data.typeParameter_name),
-      _getToken(data.typeParameter_extendsKeyword),
-      readNode(data.typeParameter_bound),
-    );
-  }
-
-  TypeParameterList _read_typeParameterList(LinkedNode data) {
-    return astFactory.typeParameterList(
-      _getToken(data.typeParameterList_leftBracket),
-      _readNodeList(data.typeParameterList_typeParameters),
-      _getToken(data.typeParameterList_rightBracket),
-    );
-  }
-
-  VariableDeclaration _read_variableDeclaration(LinkedNode data) {
-    return astFactory.variableDeclaration(
-      readNode(data.variableDeclaration_name),
-      _getToken(data.variableDeclaration_equals),
-      readNode(data.variableDeclaration_initializer),
-    );
-  }
-
-  VariableDeclarationList _read_variableDeclarationList(LinkedNode data) {
-    return astFactory.variableDeclarationList(
-      readNode(data.annotatedNode_comment),
-      _readNodeList(data.annotatedNode_metadata),
-      _getToken(data.variableDeclarationList_keyword),
-      readNode(data.variableDeclarationList_type),
-      _readNodeList(data.variableDeclarationList_variables),
-    );
-  }
-
-  VariableDeclarationStatement _read_variableDeclarationStatement(
-      LinkedNode data) {
-    return astFactory.variableDeclarationStatement(
-      readNode(data.variableDeclarationStatement_variables),
-      _getToken(data.variableDeclarationStatement_semicolon),
-    );
-  }
-
-  WhileStatement _read_whileStatement(LinkedNode data) {
-    return astFactory.whileStatement(
-      _getToken(data.whileStatement_whileKeyword),
-      _getToken(data.whileStatement_leftParenthesis),
-      readNode(data.whileStatement_condition),
-      _getToken(data.whileStatement_rightParenthesis),
-      readNode(data.whileStatement_body),
-    );
-  }
-
-  WithClause _read_withClause(LinkedNode data) {
-    return astFactory.withClause(
-      _getToken(data.withClause_withKeyword),
-      _readNodeList(data.withClause_mixinTypes),
-    );
-  }
-
-  YieldStatement _read_yieldStatement(LinkedNode data) {
-    return astFactory.yieldStatement(
-      _getToken(data.yieldStatement_yieldKeyword),
-      _getToken(data.yieldStatement_star),
-      readNode(data.yieldStatement_expression),
-      _getToken(data.yieldStatement_semicolon),
-    );
+  AstNode _readNodeLazy(LinkedNode data) {
+    if (isLazy) return null;
+    return _readNode(data);
   }
 
   List<T> _readNodeList<T>(List<LinkedNode> nodeList) {
     var result = List<T>.filled(nodeList.length, null);
     for (var i = 0; i < nodeList.length; ++i) {
       var linkedNode = nodeList[i];
-      result[i] = readNode(linkedNode) as T;
+      result[i] = _readNode(linkedNode) as T;
     }
     return result;
   }
 
+  List<T> _readNodeListLazy<T>(List<LinkedNode> nodeList) {
+    if (isLazy) {
+      return List<T>.filled(nodeList.length, null);
+    }
+    return _readNodeList(nodeList);
+  }
+
   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),
-          _getElements(data.functionFormalParameters),
-        );
-      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}');
-    }
+    return _unitContext.readType(data);
   }
 
-  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);
+  static ParameterKind _toParameterKind(LinkedNodeFormalParameterKind kind) {
+    switch (kind) {
+      case LinkedNodeFormalParameterKind.requiredPositional:
+        return ParameterKind.REQUIRED;
+      case LinkedNodeFormalParameterKind.requiredNamed:
+        return ParameterKind.NAMED_REQUIRED;
+        break;
+      case LinkedNodeFormalParameterKind.optionalPositional:
+        return ParameterKind.POSITIONAL;
+        break;
+      case LinkedNodeFormalParameterKind.optionalNamed:
+        return ParameterKind.NAMED;
+      default:
+        throw StateError('Unexpected: $kind');
     }
-    return result;
   }
 }
diff --git a/analyzer/lib/src/summary2/ast_binary_writer.dart b/analyzer/lib/src/summary2/ast_binary_writer.dart
index 187dc7b..2cc58d4 100644
--- a/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2019, 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.
 
@@ -8,24 +8,26 @@
 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';
+import 'package:analyzer/src/summary2/lazy_ast.dart';
 import 'package:analyzer/src/summary2/linking_bundle_context.dart';
-import 'package:analyzer/src/summary2/tokens_context.dart';
+import 'package:analyzer/src/summary2/tokens_writer.dart';
 
 /// Serializer of fully resolved ASTs into flat buffers.
 class AstBinaryWriter extends ThrowingAstVisitor<LinkedNodeBuilder> {
-  final LinkingBundleContext _linkingBundleContext;
-  final TokensContext _tokensContext;
+  final LinkingBundleContext _linkingContext;
+  final _tokensWriter = TokensWriter();
 
   /// This field is set temporary while visiting [FieldDeclaration] or
   /// [TopLevelVariableDeclaration] to store data shared among all variables
   /// in these declarations.
   LinkedNodeVariablesDeclarationBuilder _variablesDeclaration;
 
-  AstBinaryWriter(this._linkingBundleContext, this._tokensContext);
+  AstBinaryWriter(this._linkingContext);
+
+  UnlinkedTokensBuilder get tokensBuilder => _tokensWriter.tokensBuilder;
 
   @override
   LinkedNodeBuilder visitAdjacentStrings(AdjacentStrings node) {
@@ -36,10 +38,13 @@
 
   @override
   LinkedNodeBuilder visitAnnotation(Annotation node) {
+    var elementComponents = _componentsOfElement(node.element);
     return LinkedNodeBuilder.annotation(
       annotation_arguments: node.arguments?.accept(this),
       annotation_atSign: _getToken(node.atSign),
       annotation_constructorName: node.constructorName?.accept(this),
+      annotation_element: elementComponents.rawElement,
+      annotation_elementType: elementComponents.definingType,
       annotation_name: node.name?.accept(this),
       annotation_period: _getToken(node.period),
     );
@@ -92,8 +97,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),
@@ -112,8 +119,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),
@@ -189,6 +198,7 @@
       classDeclaration_abstractKeyword: _getToken(node.abstractKeyword),
       classDeclaration_classKeyword: _getToken(node.classKeyword),
       classDeclaration_extendsClause: node.extendsClause?.accept(this),
+      classDeclaration_nativeClause: node.nativeClause?.accept(this),
       classDeclaration_withClause: node.withClause?.accept(this),
     );
     _storeClassOrMixinDeclaration(builder, node);
@@ -206,6 +216,7 @@
       classTypeAlias_withClause: node.withClause.accept(this),
     );
     _storeTypeAlias(builder, node);
+    _storeIsSimpleBounded(builder, node);
     return builder;
   }
 
@@ -223,18 +234,35 @@
     return LinkedNodeBuilder.comment(
       comment_tokens: _getTokens(node.tokens),
       comment_type: type,
+      comment_references: _writeNodeList(node.references),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitCommentReference(CommentReference node) {
+    var identifier = node.identifier;
+    _tokensWriter.writeTokens(
+      node.newKeyword ?? identifier.beginToken,
+      identifier.endToken,
+    );
+
+    return LinkedNodeBuilder.commentReference(
+      commentReference_identifier: identifier.accept(this),
+      commentReference_newKeyword: _getToken(node.newKeyword),
     );
   }
 
   @override
   LinkedNodeBuilder visitCompilationUnit(CompilationUnit node) {
-    return LinkedNodeBuilder.compilationUnit(
+    var builder = LinkedNodeBuilder.compilationUnit(
       compilationUnit_beginToken: _getToken(node.beginToken),
       compilationUnit_declarations: _writeNodeList(node.declarations),
       compilationUnit_directives: _writeNodeList(node.directives),
       compilationUnit_endToken: _getToken(node.endToken),
       compilationUnit_scriptTag: node.scriptTag?.accept(this),
     );
+    _storeCodeOffsetLength(builder, node);
+    return builder;
   }
 
   @override
@@ -280,6 +308,7 @@
       constructorDeclaration_separator: _getToken(node.separator),
     );
     _storeClassMember(builder, node);
+    _storeCodeOffsetLength(builder, node);
     return builder;
   }
 
@@ -299,8 +328,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),
@@ -331,12 +362,14 @@
 
   @override
   LinkedNodeBuilder visitDefaultFormalParameter(DefaultFormalParameter node) {
-    return LinkedNodeBuilder.defaultFormalParameter(
+    var builder = LinkedNodeBuilder.defaultFormalParameter(
       defaultFormalParameter_defaultValue: node.defaultValue?.accept(this),
-      defaultFormalParameter_isNamed: node.isNamed,
+      defaultFormalParameter_kind: _toParameterKind(node),
       defaultFormalParameter_parameter: node.parameter.accept(this),
       defaultFormalParameter_separator: _getToken(node.separator),
     );
+    _storeCodeOffsetLength(builder, node);
+    return builder;
   }
 
   @override
@@ -347,7 +380,7 @@
       doStatement_doKeyword: _getToken(node.doKeyword),
       doStatement_leftParenthesis: _getToken(node.leftParenthesis),
       doStatement_rightParenthesis: _getToken(node.rightParenthesis),
-      doStatement_semicolon: _getToken(node.whileKeyword),
+      doStatement_semicolon: _getToken(node.semicolon),
       doStatement_whileKeyword: _getToken(node.whileKeyword),
     );
   }
@@ -441,6 +474,7 @@
   @override
   LinkedNodeBuilder visitFieldDeclaration(FieldDeclaration node) {
     _variablesDeclaration = LinkedNodeVariablesDeclarationBuilder(
+      isCovariant: node.covariantKeyword != null,
       isStatic: node.isStatic,
     );
 
@@ -532,11 +566,11 @@
   }
 
   @override
-  LinkedNodeBuilder visitForStatement2(ForStatement2 node) {
+  LinkedNodeBuilder visitForStatement(ForStatement node) {
     var builder = LinkedNodeBuilder.forStatement(
       forStatement_body: node.body.accept(this),
     );
-    _storeForMixin(builder, node as ForStatement2Impl);
+    _storeForMixin(builder, node as ForStatementImpl);
     return builder;
   }
 
@@ -550,6 +584,7 @@
       functionDeclaration_returnType: node.returnType?.accept(this),
     );
     _storeNamedCompilationUnitMember(builder, node);
+    _writeActualReturnType(builder, node);
     return builder;
   }
 
@@ -587,8 +622,12 @@
       functionTypeAlias_formalParameters: node.parameters.accept(this),
       functionTypeAlias_returnType: node.returnType?.accept(this),
       functionTypeAlias_typeParameters: node.typeParameters?.accept(this),
+      typeAlias_hasSelfReference:
+          LazyFunctionTypeAlias.getHasSelfReference(node),
     );
     _storeTypeAlias(builder, node);
+    _writeActualReturnType(builder, node);
+    _storeIsSimpleBounded(builder, node);
     return builder;
   }
 
@@ -608,23 +647,33 @@
 
   @override
   LinkedNodeBuilder visitGenericFunctionType(GenericFunctionType node) {
-    return LinkedNodeBuilder.genericFunctionType(
+    var builder = LinkedNodeBuilder.genericFunctionType(
       genericFunctionType_formalParameters: node.parameters.accept(this),
       genericFunctionType_functionKeyword: _getToken(node.functionKeyword),
       genericFunctionType_question: _getToken(node.question),
       genericFunctionType_returnType: node.returnType?.accept(this),
+      genericFunctionType_type: _writeType(node.type),
       genericFunctionType_typeParameters: node.typeParameters?.accept(this),
     );
+    _writeActualReturnType(builder, node);
+
+    var id = LazyAst.getGenericFunctionTypeId(node);
+    builder.genericFunctionType_id = id;
+
+    return builder;
   }
 
   @override
   LinkedNodeBuilder visitGenericTypeAlias(GenericTypeAlias node) {
     var builder = LinkedNodeBuilder.genericTypeAlias(
       genericTypeAlias_equals: _getToken(node.equals),
-      genericTypeAlias_functionType: node.functionType.accept(this),
+      genericTypeAlias_functionType: node.functionType?.accept(this),
       genericTypeAlias_typeParameters: node.typeParameters?.accept(this),
+      typeAlias_hasSelfReference:
+          LazyGenericTypeAlias.getHasSelfReference(node),
     );
     _storeTypeAlias(builder, node);
+    _storeIsSimpleBounded(builder, node);
     return builder;
   }
 
@@ -683,10 +732,13 @@
 
   @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),
       indexExpression_rightBracket: _getToken(node.rightBracket),
       indexExpression_target: node.target?.accept(this),
       expression_type: _writeType(node.staticType),
@@ -704,6 +756,7 @@
       instanceCreationExpression_keyword: _getToken(node.keyword),
       instanceCreationExpression_typeArguments:
           nodeImpl.typeArguments?.accept(this),
+      expression_type: _writeType(node.staticType),
     );
   }
 
@@ -765,6 +818,7 @@
   LinkedNodeBuilder visitLibraryDirective(LibraryDirective node) {
     var builder = LinkedNodeBuilder.libraryDirective(
       libraryDirective_name: node.name.accept(this),
+      directive_semicolon: _getToken(node.semicolon),
     );
     _storeDirective(builder, node);
     return builder;
@@ -780,7 +834,7 @@
   @override
   LinkedNodeBuilder visitListLiteral(ListLiteral node) {
     var builder = LinkedNodeBuilder.listLiteral(
-      listLiteral_elements: _writeNodeList(node.elements2),
+      listLiteral_elements: _writeNodeList(node.elements),
       listLiteral_leftBracket: _getToken(node.leftBracket),
       listLiteral_rightBracket: _getToken(node.rightBracket),
     );
@@ -811,6 +865,8 @@
       methodDeclaration_typeParameters: node.typeParameters?.accept(this),
     );
     _storeClassMember(builder, node);
+    _storeCodeOffsetLength(builder, node);
+    _writeActualReturnType(builder, node);
     return builder;
   }
 
@@ -832,6 +888,7 @@
       mixinDeclaration_onClause: node.onClause?.accept(this),
     );
     _storeClassOrMixinDeclaration(builder, node);
+    LazyMixinDeclaration.get(node).put(builder);
     return builder;
   }
 
@@ -844,6 +901,23 @@
   }
 
   @override
+  LinkedNodeBuilder visitNativeClause(NativeClause node) {
+    return LinkedNodeBuilder.nativeClause(
+      nativeClause_nativeKeyword: _getToken(node.nativeKeyword),
+      nativeClause_name: node.name.accept(this),
+    );
+  }
+
+  @override
+  LinkedNodeBuilder visitNativeFunctionBody(NativeFunctionBody node) {
+    return LinkedNodeBuilder.nativeFunctionBody(
+      nativeFunctionBody_nativeKeyword: _getToken(node.nativeKeyword),
+      nativeFunctionBody_semicolon: _getToken(node.semicolon),
+      nativeFunctionBody_stringLiteral: node.stringLiteral?.accept(this),
+    );
+  }
+
+  @override
   LinkedNodeBuilder visitNullLiteral(NullLiteral node) {
     var builder = LinkedNodeBuilder.nullLiteral(
       nullLiteral_literal: _getToken(node.literal),
@@ -875,7 +949,9 @@
 
   @override
   LinkedNodeBuilder visitPartDirective(PartDirective node) {
-    var builder = LinkedNodeBuilder.partDirective();
+    var builder = LinkedNodeBuilder.partDirective(
+      directive_semicolon: _getToken(node.semicolon),
+    );
     _storeUriBasedDirective(builder, node);
     return builder;
   }
@@ -885,7 +961,7 @@
     var builder = LinkedNodeBuilder.partOfDirective(
       partOfDirective_libraryName: node.libraryName?.accept(this),
       partOfDirective_ofKeyword: _getToken(node.ofKeyword),
-      partOfDirective_semicolon: _getToken(node.semicolon),
+      directive_semicolon: _getToken(node.semicolon),
       partOfDirective_uri: node.uri?.accept(this),
     );
     _storeDirective(builder, node);
@@ -894,9 +970,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),
     );
@@ -914,9 +992,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),
     );
@@ -936,13 +1016,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),
     );
@@ -978,7 +1060,7 @@
   @override
   LinkedNodeBuilder visitSetOrMapLiteral(SetOrMapLiteral node) {
     var builder = LinkedNodeBuilder.setOrMapLiteral(
-      setOrMapLiteral_elements: _writeNodeList(node.elements2),
+      setOrMapLiteral_elements: _writeNodeList(node.elements),
       setOrMapLiteral_isMap: node.isMap,
       setOrMapLiteral_isSet: node.isSet,
       setOrMapLiteral_leftBracket: _getToken(node.leftBracket),
@@ -1003,7 +1085,9 @@
       simpleFormalParameter_keyword: _getToken(node.keyword),
       simpleFormalParameter_type: node.type?.accept(this),
     );
+    builder.topLevelTypeInferenceError = LazyAst.getTypeInferenceError(node);
     _storeNormalFormalParameter(builder, node);
+    _storeInheritsCovariant(builder, node);
     return builder;
   }
 
@@ -1017,8 +1101,11 @@
       }
     }
 
+    var elementComponents = _componentsOfElement(element);
     return LinkedNodeBuilder.simpleIdentifier(
-      simpleIdentifier_element: _getReferenceIndex(element),
+      simpleIdentifier_element: elementComponents.rawElement,
+      simpleIdentifier_elementType: elementComponents.definingType,
+      simpleIdentifier_isDeclaration: node is DeclaredSimpleIdentifier,
       simpleIdentifier_token: _getToken(node.token),
       expression_type: _writeType(node.staticType),
     );
@@ -1053,12 +1140,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),
     );
@@ -1182,10 +1270,13 @@
   @override
   LinkedNodeBuilder visitTypeParameter(TypeParameter node) {
     var builder = LinkedNodeBuilder.typeParameter(
-        typeParameter_bound: node.bound?.accept(this),
-        typeParameter_extendsKeyword: _getToken(node.extendsKeyword),
-        typeParameter_name: node.name.accept(this));
+      typeParameter_bound: node.bound?.accept(this),
+      typeParameter_defaultType: _writeType(LazyAst.getDefaultType(node)),
+      typeParameter_extendsKeyword: _getToken(node.extendsKeyword),
+      typeParameter_name: node.name.accept(this),
+    );
     _storeDeclaration(builder, node);
+    _storeCodeOffsetLength(builder, node);
     return builder;
   }
 
@@ -1200,12 +1291,16 @@
 
   @override
   LinkedNodeBuilder visitVariableDeclaration(VariableDeclaration node) {
-    return LinkedNodeBuilder.variableDeclaration(
+    var builder = LinkedNodeBuilder.variableDeclaration(
       variableDeclaration_equals: _getToken(node.equals),
       variableDeclaration_initializer: node.initializer?.accept(this),
       variableDeclaration_name: node.name.accept(this),
       variableDeclaration_declaration: _variablesDeclaration,
     );
+    builder.topLevelTypeInferenceError = LazyAst.getTypeInferenceError(node);
+    _writeActualType(builder, node);
+    _storeInheritsCovariant(builder, node);
+    return builder;
   }
 
   @override
@@ -1217,10 +1312,12 @@
 
     var builder = LinkedNodeBuilder.variableDeclarationList(
       variableDeclarationList_keyword: _getToken(node.keyword),
+      variableDeclarationList_lateKeyword: _getToken(node.lateKeyword),
       variableDeclarationList_type: node.type?.accept(this),
       variableDeclarationList_variables: _writeNodeList(node.variables),
     );
     _storeAnnotatedNode(builder, node);
+    _storeCodeOffsetLengthVariables(builder, node);
     return builder;
   }
 
@@ -1265,26 +1362,27 @@
   }
 
   LinkedNodeBuilder writeNode(AstNode node) {
+    _tokensWriter.writeTokens(node.beginToken, node.endToken);
     return node.accept(this);
   }
 
-  int _getReferenceIndex(Element element) {
-    if (element == null) return 0;
+  _ElementComponents _componentsOfElement(Element element) {
+    while (element is ParameterMember) {
+      element = (element as ParameterMember).baseElement;
+    }
 
     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) {
-    return _tokensContext.indexOfToken(token);
+    return _tokensWriter.indexOfToken(token);
   }
 
   List<int> _getTokens(List<Token> tokenList) {
@@ -1296,6 +1394,10 @@
     return result;
   }
 
+  int _indexOfElement(Element element) {
+    return _linkingContext.indexOfElement(element);
+  }
+
   void _storeAnnotatedNode(LinkedNodeBuilder builder, AnnotatedNode node) {
     builder
       ..annotatedNode_comment = node.documentationComment?.accept(this)
@@ -1317,6 +1419,24 @@
       ..classOrMixinDeclaration_typeParameters =
           node.typeParameters?.accept(this);
     _storeNamedCompilationUnitMember(builder, node);
+    _storeIsSimpleBounded(builder, node);
+  }
+
+  void _storeCodeOffsetLength(LinkedNodeBuilder builder, AstNode node) {
+    builder.codeOffset = node.offset;
+    builder.codeLength = node.length;
+  }
+
+  void _storeCodeOffsetLengthVariables(
+      LinkedNodeBuilder builder, VariableDeclarationList node) {
+    var builders = builder.variableDeclarationList_variables;
+    for (var i = 0; i < builders.length; ++i) {
+      var variableBuilder = builders[i];
+      var variableNode = node.variables[i];
+      var offset = (i == 0 ? node.parent : variableNode).offset;
+      variableBuilder.codeOffset = offset;
+      variableBuilder.codeLength = variableNode.end - offset;
+    }
   }
 
   void _storeCombinator(LinkedNodeBuilder builder, Combinator node) {
@@ -1354,14 +1474,8 @@
   void _storeForLoopParts(LinkedNodeBuilder builder, ForLoopParts node) {}
 
   void _storeFormalParameter(LinkedNodeBuilder builder, FormalParameter node) {
-    var kind = LinkedNodeFormalParameterKind.required;
-    if (node.isNamed) {
-      kind = LinkedNodeFormalParameterKind.optionalNamed;
-    } else if (node.isOptionalPositional) {
-      kind = LinkedNodeFormalParameterKind.optionalPositional;
-    }
-
-    builder.formalParameter_kind = kind;
+    _storeCodeOffsetLength(builder, node);
+    _writeActualType(builder, node);
   }
 
   void _storeForMixin(LinkedNodeBuilder builder, ForMixin node) {
@@ -1393,6 +1507,11 @@
       ..ifMixin_rightParenthesis = _getToken(node.rightParenthesis);
   }
 
+  void _storeInheritsCovariant(LinkedNodeBuilder builder, AstNode node) {
+    var value = LazyAst.getInheritsCovariant(node);
+    builder.inheritsCovariant = value;
+  }
+
   void _storeInvocationExpression(
       LinkedNodeBuilder builder, InvocationExpression node) {
     _storeExpression(builder, node);
@@ -1402,9 +1521,16 @@
       ..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);
+    _storeCodeOffsetLength(builder, node);
     builder..namedCompilationUnitMember_name = node.name.accept(this);
   }
 
@@ -1414,8 +1540,8 @@
     builder
       ..namespaceDirective_combinators = _writeNodeList(node.combinators)
       ..namespaceDirective_configurations = _writeNodeList(node.configurations)
-      ..namespaceDirective_selectedUriContent = node.selectedUriContent
-      ..namespaceDirective_semicolon = _getToken(node.semicolon);
+      ..namespaceDirective_selectedUri = LazyDirective.getSelectedUri(node)
+      ..directive_semicolon = _getToken(node.semicolon);
   }
 
   void _storeNormalFormalParameter(
@@ -1426,7 +1552,8 @@
       ..normalFormalParameter_covariantKeyword =
           _getToken(node.covariantKeyword)
       ..normalFormalParameter_identifier = node.identifier?.accept(this)
-      ..normalFormalParameter_metadata = _writeNodeList(node.metadata);
+      ..normalFormalParameter_metadata = _writeNodeList(node.metadata)
+      ..normalFormalParameter_requiredKeyword = _getToken(node.requiredKeyword);
   }
 
   void _storeStatement(LinkedNodeBuilder builder, Statement node) {}
@@ -1458,7 +1585,19 @@
     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) {
+    var type = LazyAst.getReturnType(node);
+    // TODO(scheglov) Check for `null` when writing resolved AST.
+    builder.actualReturnType = _writeType(type);
+  }
+
+  void _writeActualType(LinkedNodeBuilder builder, AstNode node) {
+    var type = LazyAst.getType(node);
+    // TODO(scheglov) Check for `null` when writing resolved AST.
+    builder.actualType = _writeType(type);
   }
 
   List<LinkedNodeBuilder> _writeNodeList(List<AstNode> nodeList) {
@@ -1474,6 +1613,28 @@
   }
 
   LinkedNodeTypeBuilder _writeType(DartType type) {
-    return _linkingBundleContext.writeType(type);
+    return _linkingContext.writeType(type);
   }
+
+  static LinkedNodeFormalParameterKind _toParameterKind(FormalParameter node) {
+    if (node.isRequiredPositional) {
+      return LinkedNodeFormalParameterKind.requiredPositional;
+    } else if (node.isRequiredNamed) {
+      return LinkedNodeFormalParameterKind.requiredNamed;
+    } else if (node.isOptionalPositional) {
+      return LinkedNodeFormalParameterKind.optionalPositional;
+    } else if (node.isOptionalNamed) {
+      return LinkedNodeFormalParameterKind.optionalNamed;
+    } else {
+      throw new StateError('Unknown kind of parameter');
+    }
+  }
+}
+
+/// 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/analyzer/lib/src/summary2/ast_resolver.dart b/analyzer/lib/src/summary2/ast_resolver.dart
index c3dcf81..bf3ac6d 100644
--- a/analyzer/lib/src/summary2/ast_resolver.dart
+++ b/analyzer/lib/src/summary2/ast_resolver.dart
@@ -2,30 +2,30 @@
 // for 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/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/summary2/ast_binary_writer.dart';
-import 'package:analyzer/src/summary2/builder/source_library_builder.dart';
 import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/reference.dart';
 
 /// Used to resolve some AST nodes - variable initializers, and annotations.
 class AstResolver {
   final Linker _linker;
+  final LibraryElement _library;
+  final Scope _nameScope;
 
-  LibraryElement _library;
-  Scope _nameScope;
+  AstResolver(this._linker, this._library, this._nameScope);
 
-  AstResolver(this._linker, Reference libraryRef) {
-    _library = _linker.elementFactory.elementOfReference(libraryRef);
-    _nameScope = LibraryScope(_library);
-  }
-
-  LinkedNode resolve(UnitBuilder unit, AstNode node) {
+  void resolve(
+    AstNode node, {
+    ClassElement enclosingClassElement,
+    ExecutableElement enclosingExecutableElement,
+    FeatureSet featureSet,
+    bool doAstRewrite = false,
+  }) {
     var source = _FakeSource();
     var errorListener = AnalysisErrorListener.NULL_LISTENER;
 
@@ -34,27 +34,41 @@
         nameScope: _nameScope);
     node.accept(typeResolverVisitor);
 
-//    expression.accept(_astRewriteVisitor);
-//    expression.accept(_variableResolverVisitor);
+    if (doAstRewrite) {
+      var astRewriteVisitor = new AstRewriteVisitor(_linker.typeSystem,
+          _library, source, _linker.typeProvider, errorListener,
+          nameScope: _nameScope);
+      node.accept(astRewriteVisitor);
+    }
+
+    var variableResolverVisitor = new VariableResolverVisitor(
+        _library, source, _linker.typeProvider, errorListener,
+        nameScope: _nameScope, localVariableInfo: LocalVariableInfo());
+    node.accept(variableResolverVisitor);
+
 //    if (_linker.getAst != null) {
 //      expression.accept(_partialResolverVisitor);
 //    }
 
     var resolverVisitor = new ResolverVisitor(_linker.inheritance, _library,
         source, _linker.typeProvider, errorListener,
+        featureSet: featureSet,
         nameScope: _nameScope,
         propagateTypes: false,
         reportConstEvaluationErrors: false);
-    node.accept(resolverVisitor);
-
-    var writer = AstBinaryWriter(
-      _linker.linkingBundleContext,
-      unit.context.tokensContext,
+    resolverVisitor.prepareEnclosingDeclarations(
+      enclosingClassElement: enclosingClassElement,
+      enclosingExecutableElement: enclosingExecutableElement,
     );
-    return writer.writeNode(node);
+
+    node.accept(resolverVisitor);
   }
 }
 
 class _FakeSource implements Source {
+  @override
+  String get fullName => '/package/lib/test.dart';
+
+  @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
diff --git a/analyzer/lib/src/summary2/ast_text_printer.dart b/analyzer/lib/src/summary2/ast_text_printer.dart
new file mode 100644
index 0000000..eefebe8
--- /dev/null
+++ b/analyzer/lib/src/summary2/ast_text_printer.dart
@@ -0,0 +1,1068 @@
+// 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/dart/ast/token.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/source/line_info.dart';
+
+/// AST visitor that prints tokens into their original positions.
+class AstTextPrinter extends ThrowingAstVisitor<void> {
+  final StringBuffer _buffer;
+  final LineInfo _lineInfo;
+
+  Token _last;
+  int _lastEnd = 0;
+  int _lastEndLine = 0;
+
+  AstTextPrinter(this._buffer, this._lineInfo);
+
+  @override
+  void visitAdjacentStrings(AdjacentStrings node) {
+    _nodeList(node.strings);
+  }
+
+  @override
+  void visitAnnotation(Annotation node) {
+    _token(node.atSign);
+    node.name.accept(this);
+    _token(node.period);
+    node.constructorName?.accept(this);
+    node.arguments?.accept(this);
+  }
+
+  @override
+  void visitArgumentList(ArgumentList node) {
+    _token(node.leftParenthesis);
+    _nodeList(node.arguments, node.rightParenthesis);
+    _token(node.rightParenthesis);
+  }
+
+  @override
+  void visitAsExpression(AsExpression node) {
+    node.expression.accept(this);
+    _token(node.asOperator);
+    node.type.accept(this);
+  }
+
+  @override
+  void visitAssertInitializer(AssertInitializer node) {
+    _token(node.assertKeyword);
+    _token(node.leftParenthesis);
+
+    node.condition.accept(this);
+    _tokenIfNot(node.condition.endToken.next, node.rightParenthesis);
+
+    node.message?.accept(this);
+    _tokenIfNot(node.message?.endToken?.next, node.rightParenthesis);
+
+    _token(node.rightParenthesis);
+  }
+
+  @override
+  void visitAssertStatement(AssertStatement node) {
+    _token(node.assertKeyword);
+    _token(node.leftParenthesis);
+
+    node.condition.accept(this);
+    _tokenIfNot(node.condition.endToken.next, node.rightParenthesis);
+
+    node.message?.accept(this);
+    _tokenIfNot(node.message?.endToken?.next, node.rightParenthesis);
+
+    _token(node.rightParenthesis);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitAssignmentExpression(AssignmentExpression node) {
+    node.leftHandSide.accept(this);
+    _token(node.operator);
+    node.rightHandSide.accept(this);
+  }
+
+  @override
+  void visitAwaitExpression(AwaitExpression node) {
+    _token(node.awaitKeyword);
+    node.expression.accept(this);
+  }
+
+  @override
+  void visitBinaryExpression(BinaryExpression node) {
+    node.leftOperand.accept(this);
+    _token(node.operator);
+    node.rightOperand.accept(this);
+  }
+
+  @override
+  void visitBlock(Block node) {
+    _token(node.leftBracket);
+    _nodeList(node.statements);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitBlockFunctionBody(BlockFunctionBody node) {
+    _functionBody(node);
+    node.block.accept(this);
+  }
+
+  @override
+  void visitBooleanLiteral(BooleanLiteral node) {
+    _token(node.literal);
+  }
+
+  @override
+  void visitBreakStatement(BreakStatement node) {
+    _token(node.breakKeyword);
+    node.label?.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitCascadeExpression(CascadeExpression node) {
+    node.target.accept(this);
+    _nodeList(node.cascadeSections);
+  }
+
+  @override
+  void visitCatchClause(CatchClause node) {
+    _token(node.onKeyword);
+    node.exceptionType?.accept(this);
+    _token(node.catchKeyword);
+    _token(node.leftParenthesis);
+    node.exceptionParameter?.accept(this);
+    _token(node.comma);
+    node.stackTraceParameter?.accept(this);
+    _token(node.rightParenthesis);
+    node.body.accept(this);
+  }
+
+  @override
+  void visitClassDeclaration(ClassDeclaration node) {
+    _compilationUnitMember(node);
+    _token(node.abstractKeyword);
+    _token(node.classKeyword);
+    node.name.accept(this);
+    node.typeParameters?.accept(this);
+    node.extendsClause?.accept(this);
+    node.withClause?.accept(this);
+    node.implementsClause?.accept(this);
+    node.nativeClause?.accept(this);
+    _token(node.leftBracket);
+    node.members.accept(this);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitClassTypeAlias(ClassTypeAlias node) {
+    _compilationUnitMember(node);
+    _token(node.abstractKeyword);
+    _token(node.typedefKeyword);
+    node.name.accept(this);
+    node.typeParameters?.accept(this);
+    _token(node.equals);
+    node.superclass?.accept(this);
+    node.withClause.accept(this);
+    node.implementsClause?.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitComment(Comment node) {}
+
+  @override
+  void visitCompilationUnit(CompilationUnit node) {
+    node.scriptTag?.accept(this);
+    node.directives.accept(this);
+    node.declarations.accept(this);
+    _token(node.endToken);
+  }
+
+  @override
+  void visitConditionalExpression(ConditionalExpression node) {
+    node.condition.accept(this);
+    _token(node.question);
+    node.thenExpression.accept(this);
+    _token(node.colon);
+    node.elseExpression.accept(this);
+  }
+
+  @override
+  void visitConfiguration(Configuration node) {
+    _token(node.ifKeyword);
+    _token(node.leftParenthesis);
+    node.name.accept(this);
+    _token(node.equalToken);
+    node.value?.accept(this);
+    _token(node.rightParenthesis);
+    node.uri.accept(this);
+  }
+
+  @override
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
+    _classMember(node);
+    _token(node.externalKeyword);
+    _token(node.constKeyword);
+    _token(node.factoryKeyword);
+    node.returnType?.accept(this);
+    _token(node.period);
+    node.name?.accept(this);
+    node.parameters.accept(this);
+    _token(node.separator);
+    _nodeList(node.initializers, node.body.beginToken);
+    node.redirectedConstructor?.accept(this);
+    node.body.accept(this);
+  }
+
+  @override
+  void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    _token(node.thisKeyword);
+    _token(node.period);
+    node.fieldName.accept(this);
+    _token(node.equals);
+    node.expression.accept(this);
+  }
+
+  @override
+  void visitConstructorName(ConstructorName node) {
+    node.type.accept(this);
+    _token(node.period);
+    node.name?.accept(this);
+  }
+
+  @override
+  void visitContinueStatement(ContinueStatement node) {
+    _token(node.continueKeyword);
+    node.label?.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitDeclaredIdentifier(DeclaredIdentifier node) {
+    _declaration(node);
+    _token(node.keyword);
+    node.type?.accept(this);
+    node.identifier.accept(this);
+  }
+
+  @override
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
+    node.parameter.accept(this);
+    _token(node.separator);
+    node.defaultValue?.accept(this);
+  }
+
+  @override
+  void visitDoStatement(DoStatement node) {
+    _token(node.doKeyword);
+    node.body.accept(this);
+    _token(node.whileKeyword);
+    _token(node.leftParenthesis);
+    node.condition.accept(this);
+    _token(node.rightParenthesis);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitDottedName(DottedName node) {
+    _nodeList(node.components, node.endToken.next);
+  }
+
+  @override
+  void visitDoubleLiteral(DoubleLiteral node) {
+    _token(node.literal);
+  }
+
+  @override
+  void visitEmptyFunctionBody(EmptyFunctionBody node) {
+    _functionBody(node);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitEmptyStatement(EmptyStatement node) {
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    _declaration(node);
+    node.name.accept(this);
+  }
+
+  @override
+  void visitEnumDeclaration(EnumDeclaration node) {
+    _compilationUnitMember(node);
+    _token(node.enumKeyword);
+    node.name.accept(this);
+    _token(node.leftBracket);
+    _nodeList(node.constants, node.rightBracket);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitExportDirective(ExportDirective node) {
+    _directive(node);
+    _token(node.keyword);
+    node.uri.accept(this);
+    node.configurations?.accept(this);
+    _nodeList(node.combinators);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    _functionBody(node);
+    _token(node.functionDefinition);
+    node.expression.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitExpressionStatement(ExpressionStatement node) {
+    node.expression.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitExtendsClause(ExtendsClause node) {
+    _token(node.extendsKeyword);
+    node.superclass.accept(this);
+  }
+
+  @override
+  void visitFieldDeclaration(FieldDeclaration node) {
+    _classMember(node);
+    _token(node.staticKeyword);
+    _token(node.covariantKeyword);
+    node.fields.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitFieldFormalParameter(FieldFormalParameter node) {
+    _normalFormalParameter(node);
+    _token(node.keyword);
+    node.type?.accept(this);
+    _token(node.thisKeyword);
+    _token(node.period);
+    node.identifier.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters?.accept(this);
+  }
+
+  @override
+  void visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
+    node.loopVariable.accept(this);
+    _token(node.inKeyword);
+    node.iterable.accept(this);
+  }
+
+  @override
+  void visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
+    node.identifier.accept(this);
+    _token(node.inKeyword);
+    node.iterable.accept(this);
+  }
+
+  @override
+  void visitForElement(ForElement node) {
+    _token(node.forKeyword);
+    _token(node.leftParenthesis);
+    node.forLoopParts.accept(this);
+    _token(node.rightParenthesis);
+    node.body.accept(this);
+  }
+
+  @override
+  void visitFormalParameterList(FormalParameterList node) {
+    _token(node.leftParenthesis);
+
+    var parameters = node.parameters;
+    for (var i = 0; i < parameters.length; ++i) {
+      var parameter = parameters[i];
+      if (node.leftDelimiter?.next == parameter.beginToken) {
+        _token(node.leftDelimiter);
+      }
+
+      parameter.accept(this);
+
+      var itemSeparator = parameter.endToken.next;
+      if (itemSeparator != node.rightParenthesis) {
+        _token(itemSeparator);
+        itemSeparator = itemSeparator.next;
+      }
+
+      if (itemSeparator == node.rightDelimiter) {
+        _token(node.rightDelimiter);
+      }
+    }
+
+    _token(node.rightParenthesis);
+  }
+
+  @override
+  void visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
+    node.variables.accept(this);
+    _token(node.leftSeparator);
+    node.condition?.accept(this);
+    _token(node.rightSeparator);
+    _nodeList(node.updaters, node.endToken.next);
+  }
+
+  @override
+  void visitForPartsWithExpression(ForPartsWithExpression node) {
+    node.initialization?.accept(this);
+    _token(node.leftSeparator);
+    node.condition?.accept(this);
+    _token(node.rightSeparator);
+    _nodeList(node.updaters, node.updaters.endToken?.next);
+  }
+
+  @override
+  void visitForStatement(ForStatement node) {
+    _token(node.awaitKeyword);
+    _token(node.forKeyword);
+    _token(node.leftParenthesis);
+    node.forLoopParts.accept(this);
+    _token(node.rightParenthesis);
+    node.body.accept(this);
+  }
+
+  @override
+  void visitFunctionDeclaration(FunctionDeclaration node) {
+    _compilationUnitMember(node);
+    _token(node.externalKeyword);
+    node.returnType?.accept(this);
+    _token(node.propertyKeyword);
+    node.name.accept(this);
+    node.functionExpression.accept(this);
+  }
+
+  @override
+  void visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    node.functionDeclaration.accept(this);
+  }
+
+  @override
+  void visitFunctionExpression(FunctionExpression node) {
+    node.typeParameters?.accept(this);
+    node.parameters?.accept(this);
+    node.body.accept(this);
+  }
+
+  @override
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    node.function.accept(this);
+    node.typeArguments?.accept(this);
+    node.argumentList.accept(this);
+  }
+
+  @override
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
+    _compilationUnitMember(node);
+    _token(node.typedefKeyword);
+    node.returnType?.accept(this);
+    node.name.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    _normalFormalParameter(node);
+    node.returnType?.accept(this);
+    node.identifier.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters.accept(this);
+  }
+
+  @override
+  void visitGenericFunctionType(GenericFunctionType node) {
+    node.returnType?.accept(this);
+    _token(node.functionKeyword);
+    node.typeParameters?.accept(this);
+    node.parameters.accept(this);
+  }
+
+  @override
+  void visitGenericTypeAlias(GenericTypeAlias node) {
+    _compilationUnitMember(node);
+    _token(node.typedefKeyword);
+    node.name.accept(this);
+    node.typeParameters?.accept(this);
+    _token(node.equals);
+    node.functionType.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitHideCombinator(HideCombinator node) {
+    _token(node.keyword);
+    _nodeList(node.hiddenNames, node.endToken.next);
+  }
+
+  @override
+  void visitIfElement(IfElement node) {
+    _token(node.ifKeyword);
+    _token(node.leftParenthesis);
+    node.condition.accept(this);
+    _token(node.rightParenthesis);
+    node.thenElement.accept(this);
+    _token(node.elseKeyword);
+    node.elseElement?.accept(this);
+  }
+
+  @override
+  void visitIfStatement(IfStatement node) {
+    _token(node.ifKeyword);
+    _token(node.leftParenthesis);
+    node.condition.accept(this);
+    _token(node.rightParenthesis);
+    node.thenStatement.accept(this);
+    _token(node.elseKeyword);
+    node.elseStatement?.accept(this);
+  }
+
+  @override
+  void visitImplementsClause(ImplementsClause node) {
+    _token(node.implementsKeyword);
+    _nodeList(node.interfaces, node.endToken.next);
+  }
+
+  @override
+  void visitImportDirective(ImportDirective node) {
+    _directive(node);
+    _token(node.keyword);
+    node.uri.accept(this);
+    node.configurations?.accept(this);
+    _token(node.deferredKeyword);
+    _token(node.asKeyword);
+    node.prefix?.accept(this);
+    _nodeList(node.combinators);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitIndexExpression(IndexExpression node) {
+    node.target?.accept(this);
+    _token(node.period);
+    _token(node.leftBracket);
+    node.index.accept(this);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _token(node.keyword);
+    node.constructorName.accept(this);
+    node.argumentList.accept(this);
+  }
+
+  @override
+  void visitIntegerLiteral(IntegerLiteral node) {
+    _token(node.literal);
+  }
+
+  @override
+  void visitInterpolationExpression(InterpolationExpression node) {
+    _token(node.leftBracket);
+    node.expression.accept(this);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitInterpolationString(InterpolationString node) {
+    _token(node.contents);
+  }
+
+  @override
+  void visitIsExpression(IsExpression node) {
+    node.expression.accept(this);
+    _token(node.isOperator);
+    _token(node.notOperator);
+    node.type.accept(this);
+  }
+
+  @override
+  void visitLabel(Label node) {
+    node.label.accept(this);
+    _token(node.colon);
+  }
+
+  @override
+  void visitLabeledStatement(LabeledStatement node) {
+    _nodeList(node.labels);
+    node.statement.accept(this);
+  }
+
+  @override
+  void visitLibraryDirective(LibraryDirective node) {
+    _directive(node);
+    _token(node.libraryKeyword);
+    node.name.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitLibraryIdentifier(LibraryIdentifier node) {
+    _nodeList(node.components, node.endToken.next);
+  }
+
+  @override
+  void visitListLiteral(ListLiteral node) {
+    _typedLiteral(node);
+    _token(node.leftBracket);
+    _nodeList(node.elements, node.rightBracket);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitMapLiteralEntry(MapLiteralEntry node) {
+    node.key.accept(this);
+    _token(node.separator);
+    node.value.accept(this);
+  }
+
+  @override
+  void visitMethodDeclaration(MethodDeclaration node) {
+    _classMember(node);
+    _token(node.externalKeyword);
+    _token(node.modifierKeyword);
+    node.returnType?.accept(this);
+    _token(node.propertyKeyword);
+    _token(node.operatorKeyword);
+    node.name.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters?.accept(this);
+    node.body?.accept(this);
+  }
+
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    node.target?.accept(this);
+    _token(node.operator);
+    node.methodName.accept(this);
+    node.typeArguments?.accept(this);
+    node.argumentList.accept(this);
+  }
+
+  @override
+  void visitMixinDeclaration(MixinDeclaration node) {
+    _compilationUnitMember(node);
+    _token(node.mixinKeyword);
+    node.name.accept(this);
+    node.typeParameters?.accept(this);
+    node.onClause?.accept(this);
+    node.implementsClause?.accept(this);
+    _token(node.leftBracket);
+    node.members.accept(this);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitNamedExpression(NamedExpression node) {
+    node.name.accept(this);
+    node.expression.accept(this);
+  }
+
+  @override
+  void visitNativeClause(NativeClause node) {
+    _token(node.nativeKeyword);
+    node.name.accept(this);
+  }
+
+  @override
+  void visitNativeFunctionBody(NativeFunctionBody node) {
+    _token(node.nativeKeyword);
+    node.stringLiteral?.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitNullLiteral(NullLiteral node) {
+    _token(node.literal);
+  }
+
+  @override
+  void visitOnClause(OnClause node) {
+    _token(node.onKeyword);
+    _nodeList(node.superclassConstraints, node.endToken.next);
+  }
+
+  @override
+  void visitParenthesizedExpression(ParenthesizedExpression node) {
+    _token(node.leftParenthesis);
+    node.expression.accept(this);
+    _token(node.rightParenthesis);
+  }
+
+  @override
+  void visitPartDirective(PartDirective node) {
+    _directive(node);
+    _token(node.partKeyword);
+    node.uri.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitPartOfDirective(PartOfDirective node) {
+    _directive(node);
+    _token(node.partKeyword);
+    _token(node.ofKeyword);
+    node.uri?.accept(this);
+    node.libraryName?.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitPostfixExpression(PostfixExpression node) {
+    node.operand.accept(this);
+    _token(node.operator);
+  }
+
+  @override
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
+    node.prefix.accept(this);
+    _token(node.period);
+    node.identifier.accept(this);
+  }
+
+  @override
+  void visitPrefixExpression(PrefixExpression node) {
+    _token(node.operator);
+    node.operand.accept(this);
+  }
+
+  @override
+  void visitPropertyAccess(PropertyAccess node) {
+    node.target?.accept(this);
+    _token(node.operator);
+    node.propertyName.accept(this);
+  }
+
+  @override
+  void visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    _token(node.thisKeyword);
+    _token(node.period);
+    node.constructorName?.accept(this);
+    node.argumentList.accept(this);
+  }
+
+  @override
+  void visitRethrowExpression(RethrowExpression node) {
+    _token(node.rethrowKeyword);
+  }
+
+  @override
+  void visitReturnStatement(ReturnStatement node) {
+    _token(node.returnKeyword);
+    node.expression?.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitScriptTag(ScriptTag node) {
+    _token(node.scriptTag);
+  }
+
+  @override
+  void visitSetOrMapLiteral(SetOrMapLiteral node) {
+    _typedLiteral(node);
+    _token(node.leftBracket);
+    _nodeList(node.elements, node.rightBracket);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitShowCombinator(ShowCombinator node) {
+    _token(node.keyword);
+    _nodeList(node.shownNames, node.endToken.next);
+  }
+
+  @override
+  void visitSimpleFormalParameter(SimpleFormalParameter node) {
+    _normalFormalParameter(node);
+    _token(node.keyword);
+    node.type?.accept(this);
+    node.identifier?.accept(this);
+  }
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    _token(node.token);
+  }
+
+  @override
+  void visitSimpleStringLiteral(SimpleStringLiteral node) {
+    _token(node.literal);
+  }
+
+  @override
+  void visitSpreadElement(SpreadElement node) {
+    _token(node.spreadOperator);
+    node.expression.accept(this);
+  }
+
+  @override
+  void visitStringInterpolation(StringInterpolation node) {
+    _nodeList(node.elements);
+  }
+
+  @override
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    _token(node.superKeyword);
+    _token(node.period);
+    node.constructorName?.accept(this);
+    node.argumentList.accept(this);
+  }
+
+  @override
+  void visitSuperExpression(SuperExpression node) {
+    _token(node.superKeyword);
+  }
+
+  @override
+  void visitSwitchCase(SwitchCase node) {
+    _nodeList(node.labels);
+    _token(node.keyword);
+    node.expression.accept(this);
+    _token(node.colon);
+    _nodeList(node.statements);
+  }
+
+  @override
+  void visitSwitchDefault(SwitchDefault node) {
+    _nodeList(node.labels);
+    _token(node.keyword);
+    _token(node.colon);
+    _nodeList(node.statements);
+  }
+
+  @override
+  void visitSwitchStatement(SwitchStatement node) {
+    _token(node.switchKeyword);
+    _token(node.leftParenthesis);
+    node.expression.accept(this);
+    _token(node.rightParenthesis);
+    _token(node.leftBracket);
+    _nodeList(node.members);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitSymbolLiteral(SymbolLiteral node) {
+    _token(node.poundSign);
+    var components = node.components;
+    for (var i = 0; i < components.length; ++i) {
+      var component = components[i];
+      _token(component);
+      if (i != components.length - 1) {
+        _token(component.next);
+      }
+    }
+  }
+
+  @override
+  void visitThisExpression(ThisExpression node) {
+    _token(node.thisKeyword);
+  }
+
+  @override
+  void visitThrowExpression(ThrowExpression node) {
+    _token(node.throwKeyword);
+    node.expression.accept(this);
+  }
+
+  @override
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _compilationUnitMember(node);
+    node.variables.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitTryStatement(TryStatement node) {
+    _token(node.tryKeyword);
+    node.body.accept(this);
+    _nodeList(node.catchClauses);
+    _token(node.finallyKeyword);
+    node.finallyBlock?.accept(this);
+  }
+
+  @override
+  void visitTypeArgumentList(TypeArgumentList node) {
+    _token(node.leftBracket);
+    _nodeList(node.arguments, node.rightBracket);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitTypeName(TypeName node) {
+    node.name.accept(this);
+    node.typeArguments?.accept(this);
+  }
+
+  @override
+  void visitTypeParameter(TypeParameter node) {
+    _declaration(node);
+    node.name?.accept(this);
+    _token(node.extendsKeyword);
+    node.bound?.accept(this);
+  }
+
+  @override
+  void visitTypeParameterList(TypeParameterList node) {
+    _token(node.leftBracket);
+    _nodeList(node.typeParameters, node.rightBracket);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitVariableDeclaration(VariableDeclaration node) {
+    _annotatedNode(node);
+    node.name.accept(this);
+    _token(node.equals);
+    node.initializer?.accept(this);
+  }
+
+  @override
+  void visitVariableDeclarationList(VariableDeclarationList node) {
+    _annotatedNode(node);
+    _token(node.keyword);
+    node.type?.accept(this);
+    _nodeList(node.variables, node.endToken.next);
+  }
+
+  @override
+  void visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    node.variables.accept(this);
+    _token(node.semicolon);
+  }
+
+  @override
+  void visitWhileStatement(WhileStatement node) {
+    _token(node.whileKeyword);
+    _token(node.leftParenthesis);
+    node.condition.accept(this);
+    _token(node.rightParenthesis);
+    node.body.accept(this);
+  }
+
+  @override
+  void visitWithClause(WithClause node) {
+    _token(node.withKeyword);
+    _nodeList(node.mixinTypes, node.endToken.next);
+  }
+
+  @override
+  void visitYieldStatement(YieldStatement node) {
+    _token(node.yieldKeyword);
+    _token(node.star);
+    node.expression.accept(this);
+    _token(node.semicolon);
+  }
+
+  void _annotatedNode(AnnotatedNode node) {
+    node.documentationComment?.accept(this);
+    _nodeList(node.metadata);
+  }
+
+  void _classMember(ClassMember node) {
+    _declaration(node);
+  }
+
+  void _compilationUnitMember(CompilationUnitMember node) {
+    _declaration(node);
+  }
+
+  void _declaration(Declaration node) {
+    _annotatedNode(node);
+  }
+
+  void _directive(Directive node) {
+    _annotatedNode(node);
+  }
+
+  void _functionBody(FunctionBody node) {
+    _token(node.keyword);
+    _token(node.star);
+  }
+
+  /// Print nodes from the [nodeList].
+  ///
+  /// If the [endToken] is not `null`, print one token after every node,
+  /// unless it is the [endToken].
+  void _nodeList(List<AstNode> nodeList, [Token endToken]) {
+    var length = nodeList.length;
+    for (var i = 0; i < length; ++i) {
+      var node = nodeList[i];
+      node.accept(this);
+      if (endToken != null && node.endToken.next != endToken) {
+        _token(node.endToken.next);
+      }
+    }
+  }
+
+  void _normalFormalParameter(NormalFormalParameter node) {
+    node.documentationComment?.accept(this);
+    _nodeList(node.metadata);
+    _token(node.covariantKeyword);
+  }
+
+  void _token(Token token) {
+    if (token == null) return;
+
+    if (_last != null) {
+      if (_last.next != token) {
+        throw StateError(
+          '|$_last| must be followed by |${_last.next}|, got |$token|',
+        );
+      }
+    }
+
+    // Print preceding comments as a separate sequence of tokens.
+    if (token.precedingComments != null) {
+      var lastToken = _last;
+      _last = null;
+      for (var c = token.precedingComments; c != null; c = c.next) {
+        _token(c);
+      }
+      _last = lastToken;
+    }
+
+    for (var offset = _lastEnd; offset < token.offset; offset++) {
+      var offsetLocation = _lineInfo.getLocation(offset + 1);
+      var offsetLine = offsetLocation.lineNumber - 1;
+      if (offsetLine == _lastEndLine) {
+        _buffer.write(' ');
+      } else {
+        _buffer.write('\n');
+        _lastEndLine++;
+      }
+    }
+
+    _buffer.write(token.lexeme);
+
+    _last = token;
+    _lastEnd = token.end;
+
+    var endLocation = _lineInfo.getLocation(token.end);
+    _lastEndLine = endLocation.lineNumber - 1;
+  }
+
+  void _tokenIfNot(Token maybe, Token ifNot) {
+    if (maybe == null) return;
+    if (maybe == ifNot) return;
+    _token(maybe);
+  }
+
+  _typedLiteral(TypedLiteral node) {
+    _token(node.constKeyword);
+    node.typeArguments?.accept(this);
+  }
+}
diff --git a/analyzer/lib/src/summary2/builder/prefix_builder.dart b/analyzer/lib/src/summary2/builder/prefix_builder.dart
deleted file mode 100644
index c655f34..0000000
--- a/analyzer/lib/src/summary2/builder/prefix_builder.dart
+++ /dev/null
@@ -1,9 +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.
-
-import 'package:analyzer/src/summary2/declaration.dart';
-
-class PrefixBuilder extends Declaration {
-  PrefixBuilder(String name) : super(name, null);
-}
diff --git a/analyzer/lib/src/summary2/builder/source_library_builder.dart b/analyzer/lib/src/summary2/builder/source_library_builder.dart
index f029ec9..eff744a 100644
--- a/analyzer/lib/src/summary2/builder/source_library_builder.dart
+++ b/analyzer/lib/src/summary2/builder/source_library_builder.dart
@@ -2,168 +2,247 @@
 // for 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/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart' as ast;
-import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/dart/ast/mixin_super_invoked_names.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/resolver/scope.dart' show LibraryScope;
 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_writer.dart';
-import 'package:analyzer/src/summary2/builder/prefix_builder.dart';
-import 'package:analyzer/src/summary2/declaration.dart';
+import 'package:analyzer/src/summary2/combinator.dart';
+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';
 import 'package:analyzer/src/summary2/metadata_resolver.dart';
 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/tokens_writer.dart';
-import 'package:analyzer/src/summary2/top_level_inference.dart';
+import 'package:analyzer/src/summary2/types_builder.dart';
 
 class SourceLibraryBuilder {
   final Linker linker;
   final Uri uri;
   final Reference reference;
   final LinkedNodeLibraryBuilder node;
-  final List<UnitBuilder> units = [];
 
-  /// The import scope of the library.
-  final Scope importScope;
+  LinkedLibraryContext context;
 
-  /// Local declarations, enclosed by [importScope].
-  final Scope scope;
+  LibraryElementImpl element;
+  LibraryScope libraryScope;
+
+  /// Local declarations.
+  final Scope localScope = Scope.top();
 
   /// The export scope of the library.
   final Scope exportScope = Scope.top();
 
-  SourceLibraryBuilder(Linker linker, Uri uri, Reference reference,
-      LinkedNodeLibraryBuilder node)
-      : this._(linker, uri, reference, node, Scope.top());
+  final List<Export> exporters = [];
 
-  SourceLibraryBuilder._(
-      this.linker, this.uri, this.reference, this.node, this.importScope)
-      : scope = Scope(importScope, <String, Declaration>{});
+  SourceLibraryBuilder(this.linker, this.uri, this.reference, this.node);
 
-  void addImportsToScope() {
-    // TODO
-    var hasDartCore = false;
-    var unitContext = units[0].context;
-    for (var directive in units[0].node.compilationUnit_directives) {
-      if (directive.kind == LinkedNodeKind.importDirective) {
-        var relativeUriStr = unitContext.getStringContent(
-          directive.uriBasedDirective_uri,
-        );
-        var relativeUri = Uri.parse(relativeUriStr);
-        var uri = resolveRelativeUri(this.uri, relativeUri);
-        var builder = linker.builders[uri];
-        if (builder != null) {
-          builder.exportScope.forEach((name, declaration) {
-            importScope.declare(name, declaration);
-          });
+  void addExporters() {
+    var unitContext = context.units[0];
+    for (var directive in unitContext.unit_withDirectives.directives) {
+      if (directive is ast.ExportDirective) {
+        Uri uri;
+        try {
+          uri = _selectAbsoluteUri(directive);
+          if (uri == null) continue;
+        } on FormatException {
+          continue;
+        }
+
+        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');
-          _importExportedReferences(references);
+          for (var reference in references) {
+            export.addToExportScope(reference.name, reference);
+          }
         }
-        // TODO(scheglov) prefix
-        // TODO(scheglov) combinators
       }
     }
-    if (!hasDartCore) {
-      var importDartCore = LinkedNodeBuilder.importDirective(
-        uriBasedDirective_uri: LinkedNodeBuilder.simpleStringLiteral(
-          simpleStringLiteral_value: 'dart:core',
-        ),
-      )..isSynthetic = true;
-      units[0].node.compilationUnit_directives.add(importDartCore);
-
-      // TODO(scheglov) This works only when dart:core is linked
-      var references = linker.elementFactory.exportsOfLibrary('dart:core');
-      _importExportedReferences(references);
-    }
   }
 
   /// Add top-level declaration of the library units to the local scope.
   void addLocalDeclarations() {
-    for (var unit in units) {
-      var unitRef = reference.getChild('@unit').getChild('${unit.uri}');
+    for (var unitContext in context.units) {
+      var unitRef = reference.getChild('@unit').getChild(unitContext.uriStr);
       var classRef = unitRef.getChild('@class');
       var enumRef = unitRef.getChild('@enum');
       var functionRef = unitRef.getChild('@function');
+      var mixinRef = unitRef.getChild('@mixin');
       var typeAliasRef = unitRef.getChild('@typeAlias');
       var getterRef = unitRef.getChild('@getter');
       var setterRef = unitRef.getChild('@setter');
       var variableRef = unitRef.getChild('@variable');
-      for (var node in unit.node.compilationUnit_declarations) {
-        if (node.kind == LinkedNodeKind.classDeclaration ||
-            node.kind == LinkedNodeKind.classTypeAlias) {
-          var name = unit.context.getUnitMemberName(node);
+      for (var node in unitContext.unit.declarations) {
+        if (node is ast.ClassDeclaration) {
+          var name = node.name.name;
           var reference = classRef.getChild(name);
-          reference.node = node;
-          var declaration = Declaration(name, reference);
-          scope.declare(name, declaration);
-        } else if (node.kind == LinkedNodeKind.enumDeclaration) {
-          var name = unit.context.getUnitMemberName(node);
+          reference.node2 = node;
+          localScope.declare(name, reference);
+        } else if (node is ast.ClassTypeAlias) {
+          var name = node.name.name;
+          var reference = classRef.getChild(name);
+          reference.node2 = node;
+          localScope.declare(name, reference);
+        } else if (node is ast.EnumDeclaration) {
+          var name = node.name.name;
           var reference = enumRef.getChild(name);
-          reference.node = node;
-          var declaration = Declaration(name, reference);
-          scope.declare(name, declaration);
-        } else if (node.kind == LinkedNodeKind.functionDeclaration) {
-          var name = unit.context.getUnitMemberName(node);
+          reference.node2 = node;
+          localScope.declare(name, reference);
+        } else if (node is ast.FunctionDeclaration) {
+          var name = node.name.name;
 
           Reference containerRef;
-          if (unit.context.isGetterFunction(node)) {
+          if (node.isGetter) {
             containerRef = getterRef;
-          } else if (unit.context.isSetterFunction(node)) {
+          } else if (node.isSetter) {
             containerRef = setterRef;
           } else {
             containerRef = functionRef;
           }
 
           var reference = containerRef.getChild(name);
-          reference.node = node;
-
-          var declaration = Declaration(name, reference);
-          scope.declare(name, declaration);
-        } else if (node.kind == LinkedNodeKind.functionTypeAlias) {
-          var name = unit.context.getUnitMemberName(node);
+          reference.node2 = node;
+          localScope.declare(name, reference);
+        } else if (node is ast.FunctionTypeAlias) {
+          var name = node.name.name;
           var reference = typeAliasRef.getChild(name);
-          reference.node = node;
+          reference.node2 = node;
 
-          var declaration = Declaration(name, reference);
-          scope.declare(name, declaration);
-        } else if (node.kind == LinkedNodeKind.genericTypeAlias) {
-          var name = unit.context.getUnitMemberName(node);
+          localScope.declare(name, reference);
+        } else if (node is ast.GenericTypeAlias) {
+          var name = node.name.name;
           var reference = typeAliasRef.getChild(name);
-          reference.node = node;
+          reference.node2 = node;
 
-          var declaration = Declaration(name, reference);
-          scope.declare(name, declaration);
-        } else if (node.kind == LinkedNodeKind.topLevelVariableDeclaration) {
-          var variableList = node.topLevelVariableDeclaration_variableList;
-          for (var variable in variableList.variableDeclarationList_variables) {
-            var name = unit.context.getVariableName(variable);
+          localScope.declare(name, reference);
+        } else if (node is ast.MixinDeclaration) {
+          var name = node.name.name;
+          var reference = mixinRef.getChild(name);
+          reference.node2 = node;
+          localScope.declare(name, reference);
+        } else if (node is ast.TopLevelVariableDeclaration) {
+          for (var variable in node.variables.variables) {
+            var name = variable.name.name;
 
             var reference = variableRef.getChild(name);
-            reference.node = node;
+            reference.node2 = node;
 
             var getter = getterRef.getChild(name);
-            scope.declare(name, Declaration(name, getter));
+            localScope.declare(name, getter);
 
-            if (!unit.context.isFinal(variable)) {
+            if (!variable.isConst && !variable.isFinal) {
               var setter = setterRef.getChild(name);
-              scope.declare('$name=', Declaration(name, setter));
+              localScope.declare('$name=', setter);
             }
           }
         } else {
           // TODO(scheglov) implement
-          throw UnimplementedError('${node.kind}');
+          throw UnimplementedError('${node.runtimeType}');
         }
       }
     }
+//    for (var unit in units) {
+//      var unitRef = reference.getChild('@unit').getChild('${unit.uri}');
+//      var classRef = unitRef.getChild('@class');
+//      var enumRef = unitRef.getChild('@enum');
+//      var functionRef = unitRef.getChild('@function');
+//      var typeAliasRef = unitRef.getChild('@typeAlias');
+//      var getterRef = unitRef.getChild('@getter');
+//      var setterRef = unitRef.getChild('@setter');
+//      var variableRef = unitRef.getChild('@variable');
+//      for (var node in unit.node.compilationUnit_declarations) {
+//        if (node.kind == LinkedNodeKind.classDeclaration ||
+//            node.kind == LinkedNodeKind.classTypeAlias ||
+//            node.kind == LinkedNodeKind.mixinDeclaration) {
+//          var name = unit.context.getUnitMemberName(node);
+//          var reference = classRef.getChild(name);
+//          reference.node = node;
+//          scope.declare(name, reference);
+//        } else if (node.kind == LinkedNodeKind.enumDeclaration) {
+//          var name = unit.context.getUnitMemberName(node);
+//          var reference = enumRef.getChild(name);
+//          reference.node = node;
+//          scope.declare(name, reference);
+//        } else if (node.kind == LinkedNodeKind.functionDeclaration) {
+//          var name = unit.context.getUnitMemberName(node);
+//
+//          Reference containerRef;
+//          if (unit.context.isGetterFunction(node)) {
+//            containerRef = getterRef;
+//          } else if (unit.context.isSetterFunction(node)) {
+//            containerRef = setterRef;
+//          } else {
+//            containerRef = functionRef;
+//          }
+//
+//          var reference = containerRef.getChild(name);
+//          reference.node = node;
+//
+//          scope.declare(name, reference);
+//        } else if (node.kind == LinkedNodeKind.functionTypeAlias) {
+//          var name = unit.context.getUnitMemberName(node);
+//          var reference = typeAliasRef.getChild(name);
+//          reference.node = node;
+//
+//          scope.declare(name, reference);
+//        } else if (node.kind == LinkedNodeKind.genericTypeAlias) {
+//          var name = unit.context.getUnitMemberName(node);
+//          var reference = typeAliasRef.getChild(name);
+//          reference.node = node;
+//
+//          scope.declare(name, reference);
+//        } else if (node.kind == LinkedNodeKind.topLevelVariableDeclaration) {
+//          var variableList = node.topLevelVariableDeclaration_variableList;
+//          for (var variable in variableList.variableDeclarationList_variables) {
+//            var name = unit.context.getVariableName(variable);
+//
+//            var reference = variableRef.getChild(name);
+//            reference.node = node;
+//
+//            var getter = getterRef.getChild(name);
+//            scope.declare(name, getter);
+//
+//            if (!unit.context.isConst(variable) &&
+//                !unit.context.isFinal(variable)) {
+//              var setter = setterRef.getChild(name);
+//              scope.declare('$name=', setter);
+//            }
+//          }
+//        } else {
+//          // TODO(scheglov) implement
+//          throw UnimplementedError('${node.kind}');
+//        }
+//      }
+//    }
+    if ('$uri' == 'dart:core') {
+      localScope.declare('dynamic', reference.getChild('dynamic'));
+      localScope.declare('Never', reference.getChild('Never'));
+    }
   }
 
   void addSyntheticConstructors() {
-    for (var declaration in scope.map.values) {
-      var reference = declaration.reference;
+    for (var reference in localScope.map.values) {
       var node = reference.node;
       if (node == null) continue;
       if (node.kind != LinkedNodeKind.classDeclaration) continue;
@@ -185,128 +264,139 @@
   }
 
   /// Return `true` if the export scope was modified.
-  bool addToExportScope(String name, Declaration declaration) {
+  bool addToExportScope(String name, Reference reference) {
     if (name.startsWith('_')) return false;
-    if (declaration is PrefixBuilder) return false;
+    if (reference.isPrefix) return false;
 
     var existing = exportScope.map[name];
-    if (existing == declaration) return false;
+    if (existing == reference) return false;
 
     // Ambiguous declaration detected.
     if (existing != null) return false;
 
-    exportScope.map[name] = declaration;
+    exportScope.map[name] = reference;
     return true;
   }
 
+  void buildElement() {
+    element = linker.elementFactory.libraryOfUri('$uri');
+    libraryScope = LibraryScope(element);
+  }
+
   void buildInitialExportScope() {
-    scope.forEach((name, declaration) {
-      addToExportScope(name, declaration);
+    localScope.forEach((name, reference) {
+      addToExportScope(name, reference);
     });
   }
 
-  void performTopLevelInference() {
-    for (var unit in units) {
-      TopLevelInference(linker, reference, unit).infer();
+  void collectMixinSuperInvokedNames() {
+    for (var unitContext in context.units) {
+      for (var declaration in unitContext.unit.declarations) {
+        if (declaration is ast.MixinDeclaration) {
+          var names = Set<String>();
+          var collector = MixinSuperInvokedNamesCollector(names);
+          for (var executable in declaration.members) {
+            if (executable is ast.MethodDeclaration) {
+              executable.body.accept(collector);
+            }
+          }
+          var lazy = LazyMixinDeclaration.get(declaration);
+          lazy.setSuperInvokedNames(names.toList());
+        }
+      }
     }
   }
 
+  void resolveConstructors() {
+    ConstructorInitializerResolver(linker, element).resolve();
+  }
+
+  void resolveDefaultValues() {
+    DefaultValueResolver(linker, element).resolve();
+  }
+
   void resolveMetadata() {
-    var metadataResolver = MetadataResolver(linker, reference);
-    for (var unit in units) {
-      metadataResolver.resolve(unit);
+    for (CompilationUnitElementImpl unit in element.units) {
+      var resolver = MetadataResolver(linker, element, unit);
+      unit.linkedNode.accept(resolver);
     }
   }
 
-  void resolveTypes() {
-    for (var unit in units) {
-      var unitReference = reference.getChild('@unit').getChild('${unit.uri}');
-      ReferenceResolver(
+  void resolveTypes(NodesToBuildType nodesToBuildType) {
+    for (var unitContext in context.units) {
+      var unitRef = reference.getChild('@unit');
+      var unitReference = unitRef.getChild(unitContext.uriStr);
+      var resolver = ReferenceResolver(
         linker.linkingBundleContext,
-        unit,
-        scope,
+        nodesToBuildType,
+        linker.elementFactory,
+        element,
         unitReference,
-      ).resolve();
+        linker.contextFeatures.isEnabled(Feature.non_nullable),
+        libraryScope,
+      );
+      unitContext.unit.accept(resolver);
+    }
+  }
+
+  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 declaration in exportScope.map.values) {
-      var reference = declaration.reference;
+    for (var reference in exportScope.map.values) {
       var index = linkingBundleContext.indexOfReference(reference);
       node.exports.add(index);
     }
   }
 
-  void _importExportedReferences(List<Reference> exportedReferences) {
-    for (var reference in exportedReferences) {
-      var name = reference.name;
-      importScope.declare(name, Declaration(name, reference));
+  Uri _selectAbsoluteUri(ast.NamespaceDirective directive) {
+    var relativeUriStr = _selectRelativeUri(
+      directive.configurations,
+      directive.uri.stringValue,
+    );
+    if (relativeUriStr == null || relativeUriStr.isEmpty) {
+      return null;
     }
+    var relativeUri = Uri.parse(relativeUriStr);
+    return resolveRelativeUri(this.uri, relativeUri);
   }
 
-  static void build(Linker linker, Source librarySource,
-      Map<Source, ast.CompilationUnit> libraryUnits) {
-    var libraryUriStr = librarySource.uri.toString();
+  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,
-    );
-
-    ast.CompilationUnit definingUnit;
-    for (var unitSource in libraryUnits.keys) {
-      var unit = libraryUnits[unitSource];
-      definingUnit ??= unit;
-
-      var tokensResult = TokensWriter().writeTokens(
-        unit.beginToken,
-        unit.endToken,
-      );
-      var tokensContext = tokensResult.toContext();
-
-      var unitContext = LinkedUnitContext(
-        linker.bundleContext,
-        tokensContext,
-      );
-
-      var writer = AstBinaryWriter(linker.linkingBundleContext, tokensContext);
-      var unitNode = writer.writeNode(unit);
-
-      builder.units.add(
-        UnitBuilder(unitSource.uri, unitContext, unitNode),
-      );
-
-      libraryNode.units.add(
-        LinkedNodeUnitBuilder(
-          uriStr: '${unitSource.uri}',
-          tokens: tokensResult.tokens,
-          node: unitNode,
-        ),
-      );
-
-      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;
@@ -317,8 +407,19 @@
       }
     }
 
-    linker.linkingLibraries.add(libraryNode);
+    var builder = SourceLibraryBuilder(
+      linker,
+      libraryUri,
+      libraryReference,
+      libraryNode,
+    );
     linker.builders[builder.uri] = builder;
+
+    builder.context = linker.bundleContext.addLinkingLibrary(
+      libraryUriStr,
+      libraryNode,
+      inputLibrary,
+    );
   }
 }
 
diff --git a/analyzer/lib/src/summary2/combinator.dart b/analyzer/lib/src/summary2/combinator.dart
new file mode 100644
index 0000000..5d7b20e
--- /dev/null
+++ b/analyzer/lib/src/summary2/combinator.dart
@@ -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.
+
+class Combinator {
+  final bool isShow;
+  final Set<String> names;
+
+  Combinator(this.isShow, this.names);
+
+  Combinator.show(Iterable<String> names) : this(true, names.toSet());
+
+  Combinator.hide(Iterable<String> names) : this(false, names.toSet());
+
+  bool get isHide => !isShow;
+}
diff --git a/analyzer/lib/src/summary2/constructor_initializer_resolver.dart b/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
new file mode 100644
index 0000000..fbb7919
--- /dev/null
+++ b/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
@@ -0,0 +1,81 @@
+// 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/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/resolver/scope.dart';
+import 'package:analyzer/src/summary2/ast_resolver.dart';
+import 'package:analyzer/src/summary2/link.dart';
+import 'package:analyzer/src/summary2/linking_node_scope.dart';
+
+class ConstructorInitializerResolver {
+  final Linker _linker;
+  final LibraryElementImpl _libraryElement;
+
+  ClassElement _classElement;
+  ConstructorElement _constructorElement;
+  ConstructorDeclarationImpl _constructorNode;
+  AstResolver _astResolver;
+
+  ConstructorInitializerResolver(this._linker, this._libraryElement);
+
+  void resolve() {
+    for (var unit in _libraryElement.units) {
+      for (var classElement in unit.types) {
+        _classElement = classElement;
+        for (var constructorElement in classElement.constructors) {
+          _constructor(constructorElement);
+        }
+      }
+    }
+  }
+
+  void _constructor(ConstructorElementImpl constructorElement) {
+    if (constructorElement.isSynthetic) return;
+
+    _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() {
+    var initializers = _constructorNode.initializers;
+
+    var isConst = _constructorNode.constKeyword != null;
+    if (!isConst) {
+      initializers.clear();
+      return;
+    }
+
+    for (var initializer in initializers) {
+      _astResolver.resolve(
+        initializer,
+        enclosingClassElement: _classElement,
+        enclosingExecutableElement: _constructorElement,
+      );
+    }
+  }
+
+  void _redirectedConstructor() {
+    var redirected = _constructorNode.redirectedConstructor;
+    if (redirected != null) {
+      _astResolver.resolve(
+        redirected,
+        enclosingClassElement: _classElement,
+        enclosingExecutableElement: _constructorElement,
+      );
+    }
+  }
+}
diff --git a/analyzer/lib/src/summary2/core_types.dart b/analyzer/lib/src/summary2/core_types.dart
new file mode 100644
index 0000000..289ea8e
--- /dev/null
+++ b/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/analyzer/lib/src/summary2/declaration.dart b/analyzer/lib/src/summary2/declaration.dart
deleted file mode 100644
index d717375..0000000
--- a/analyzer/lib/src/summary2/declaration.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.
-
-import 'package:analyzer/src/summary2/reference.dart';
-
-/// A declaration in a scope.
-///
-/// A declaration can be associated with a named node and have [reference] set;
-/// or can be an import prefix, then the [reference] is `null`.
-class Declaration {
-  final String name;
-  final Reference reference;
-
-  Declaration(this.name, this.reference);
-}
diff --git a/analyzer/lib/src/summary2/declaration_splicer.dart b/analyzer/lib/src/summary2/declaration_splicer.dart
new file mode 100644
index 0000000..deef9dc
--- /dev/null
+++ b/analyzer/lib/src/summary2/declaration_splicer.dart
@@ -0,0 +1,588 @@
+// 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/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/builder.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+/// This class takes a [CompilationUnitElement] lazily resynthesized from a
+/// fully resolved, but partial AST (contains only APIs), and full unresolved
+/// AST - and splices them into a single AST with all declaration nodes
+/// fully resolved, and function bodies and variable initializers unresolved.
+///
+class DeclarationSplicer {
+  final CompilationUnitElementImpl _unitElement;
+
+  _ElementWalker _walker;
+
+  DeclarationSplicer(this._unitElement);
+
+  void splice(CompilationUnit full) {
+    var partialNode = _unitElement.linkedContext.readUnitEagerly();
+    _directives(full, partialNode);
+    _declarations(full, partialNode);
+  }
+
+  FunctionBody _body(FunctionBody full) {
+    _buildLocalElements(full);
+    return full;
+  }
+
+  void _buildLocalElements(AstNode node) {
+    if (node == null) return;
+
+    var holder = ElementHolder();
+    var elementBuilder = LocalElementBuilder(holder, _unitElement);
+    node.accept(elementBuilder);
+
+    ElementImpl element = _walker.element;
+    element.encloseElements(holder.functions);
+    element.encloseElements(holder.labels);
+    element.encloseElements(holder.localVariables);
+  }
+
+  void _classDeclaration(ClassDeclaration full, ClassDeclaration partial) {
+    var element = _walker.getClass();
+    _match(partial.name, element);
+    _walk(_ElementWalker.forClass(element), () {
+      _node(full.typeParameters, partial.typeParameters);
+      var fullList = full.members;
+      var partialList = partial.members;
+      for (var i = 0; i < fullList.length; ++i) {
+        _node(fullList[i], partialList[i]);
+      }
+    });
+    _metadata(partial.metadata, element);
+  }
+
+  void _classTypeAlias(ClassTypeAlias full, ClassTypeAlias partial) {
+    var element = _walker.getClass();
+    _match(partial.name, element);
+    _walk(_ElementWalker.forClass(element), () {
+      _node(full.typeParameters, partial.typeParameters);
+    });
+    _metadata(partial.metadata, element);
+  }
+
+  void _constructorDeclaration(
+    ConstructorDeclaration full,
+    ConstructorDeclaration partial,
+  ) {
+    var element = _walker.getConstructor();
+    _match(partial.name, element);
+    (partial as ConstructorDeclarationImpl).declaredElement = element;
+    _walk(_ElementWalker.forExecutable(element), () {
+      _formalParameterList(full.parameters, partial.parameters);
+      _constructorInitializers(full.initializers, partial.initializers);
+      partial.body = _body(full.body);
+    });
+    _metadata(partial.metadata, element);
+  }
+
+  void _constructorInitializers(
+    List<ConstructorInitializer> full,
+    List<ConstructorInitializer> partial,
+  ) {
+    if (full.isNotEmpty && partial.isEmpty) {
+      partial.addAll(full);
+    }
+    partial.forEach(_buildLocalElements);
+  }
+
+  void _declarations(CompilationUnit full, CompilationUnit partial) {
+    _walk(_ElementWalker.forCompilationUnit(_unitElement), () {
+      var fullList = full.declarations;
+      var partialList = partial.declarations;
+      for (var i = 0; i < fullList.length; ++i) {
+        var partialNode = _node(fullList[i], partialList[i]);
+        fullList[i] = partialNode;
+      }
+    });
+  }
+
+  void _directives(CompilationUnit full, CompilationUnit partial) {
+    var libraryElement = _unitElement.library;
+    var exportIndex = 0;
+    var importIndex = 0;
+    var partIndex = 0;
+    for (var directive in full.directives) {
+      if (directive is ExportDirective) {
+        var element = libraryElement.exports[exportIndex++];
+        _metadata(directive.metadata, element);
+      } else if (directive is ImportDirective) {
+        var element = libraryElement.imports[importIndex++];
+        _metadata(directive.metadata, element);
+      } else if (directive is LibraryDirective) {
+        var element = libraryElement;
+        _metadata(directive.metadata, element);
+      } else if (directive is PartDirective) {
+        var element = libraryElement.parts[partIndex++];
+        _metadata(directive.metadata, element);
+      }
+    }
+  }
+
+  void _enumConstantDeclaration(
+      EnumConstantDeclaration full, EnumConstantDeclaration partial) {
+    var element = _walker.getVariable();
+    _match(partial.name, element);
+    _metadata(partial.metadata, element);
+  }
+
+  void _enumDeclaration(EnumDeclaration full, EnumDeclaration partial) {
+    var element = _walker.getEnum();
+    _match(partial.name, element);
+    _walk(_ElementWalker.forClass(element), () {
+      var fullList = full.constants;
+      var partialList = partial.constants;
+      for (var i = 0; i < fullList.length; ++i) {
+        _node(fullList[i], partialList[i]);
+      }
+    });
+    _metadata(partial.metadata, element);
+  }
+
+  void _fieldDeclaration(FieldDeclaration full, FieldDeclaration partial) {
+    _node(full.fields, partial.fields);
+
+    var first = partial.fields.variables[0];
+    _metadata(partial.metadata, first.declaredElement);
+  }
+
+  void _fieldFormalParameter(
+    FieldFormalParameter full,
+    FieldFormalParameter partial,
+  ) {
+    var element = _walker.getParameter();
+    _match(partial.identifier, element);
+    _walk(_ElementWalker.forParameter(element), () {
+      _node(full.typeParameters, partial.typeParameters);
+      _node(full.parameters, partial.parameters);
+    });
+    _metadata(partial.metadata, element);
+  }
+
+  void _formalParameterList(
+    FormalParameterList full,
+    FormalParameterList partial,
+  ) {
+    var fullList = full.parameters;
+    var partialList = partial.parameters;
+    for (var i = 0; i < fullList.length; ++i) {
+      _node(fullList[i], partialList[i]);
+    }
+  }
+
+  void _functionDeclaration(
+    FunctionDeclaration full,
+    FunctionDeclaration partial,
+  ) {
+    var element = partial.propertyKeyword == null
+        ? _walker.getFunction()
+        : _walker.getAccessor();
+    _match(partial.name, element);
+    _walk(_ElementWalker.forExecutable(element), () {
+      _node(full.functionExpression, partial.functionExpression);
+    });
+    (partial.functionExpression as FunctionExpressionImpl).declaredElement =
+        element;
+    _metadata(partial.metadata, element);
+    _node(full.returnType, partial.returnType);
+  }
+
+  void _functionExpression(
+    FunctionExpression full,
+    FunctionExpression partial,
+  ) {
+    _node(full.typeParameters, partial.typeParameters);
+    _node(full.parameters, partial.parameters);
+    partial.body = _body(full.body);
+  }
+
+  void _functionTypeAlias(FunctionTypeAlias full, FunctionTypeAlias partial) {
+    var element = _walker.getTypedef();
+    _match(partial.name, element);
+    _walk(_ElementWalker.forGenericTypeAlias(element), () {
+      _node(full.typeParameters, partial.typeParameters);
+      _node(full.parameters, partial.parameters);
+    });
+    _metadata(partial.metadata, element);
+  }
+
+  void _functionTypedFormalParameter(
+    FunctionTypedFormalParameter full,
+    FunctionTypedFormalParameter partial,
+  ) {
+    var element = _walker.getParameter();
+    _match(partial.identifier, element);
+    _walk(_ElementWalker.forParameter(element), () {
+      _node(full.typeParameters, partial.typeParameters);
+      _node(full.parameters, partial.parameters);
+    });
+    _metadata(partial.metadata, element);
+  }
+
+  void _genericFunctionType(
+    GenericFunctionType full,
+    GenericFunctionType partial,
+  ) {
+    var element = (partial as GenericFunctionTypeImpl).declaredElement;
+    _walk(_ElementWalker.forGenericFunctionType(element), () {
+      _node(full.returnType, partial.returnType);
+      _node(full.typeParameters, partial.typeParameters);
+      _node(full.parameters, partial.parameters);
+    });
+  }
+
+  void _genericTypeAlias(GenericTypeAlias full, GenericTypeAlias partial) {
+    var element = _walker.getTypedef();
+    _match(partial.name, element);
+    _walk(_ElementWalker.forGenericTypeAlias(element), () {
+      _node(full.typeParameters, partial.typeParameters);
+      _node(full.functionType, partial.functionType);
+    });
+    _metadata(partial.metadata, element);
+  }
+
+  /// Updates [node] to point to [element], after ensuring that the
+  /// element has the expected name.
+  E _match<E extends Element>(SimpleIdentifier node, E element) {
+    // TODO(scheglov) has troubles with getter/setter.
+//    if (element.name != node.name) {
+//      throw new StateError(
+//        'Expected an element matching `${node.name}`, got `${element.name}`',
+//      );
+//    }
+    if (node != null) {
+      node.staticElement = element;
+    }
+    return element;
+  }
+
+  void _methodDeclaration(MethodDeclaration full, MethodDeclaration partial) {
+    var element = partial.propertyKeyword == null
+        ? _walker.getFunction()
+        : _walker.getAccessor();
+    _match(partial.name, element);
+    _walk(_ElementWalker.forExecutable(element), () {
+      _node(full.typeParameters, partial.typeParameters);
+      _node(full.parameters, partial.parameters);
+      partial.body = _body(full.body);
+    });
+    _metadata(partial.metadata, element);
+    _node(full.returnType, partial.returnType);
+  }
+
+  void _mixinDeclaration(MixinDeclaration full, MixinDeclaration partial) {
+    var element = _walker.getMixin();
+    _match(partial.name, element);
+    _walk(_ElementWalker.forClass(element), () {
+      _node(full.typeParameters, partial.typeParameters);
+      var fullList = full.members;
+      var partialList = partial.members;
+      for (var i = 0; i < fullList.length; ++i) {
+        _node(fullList[i], partialList[i]);
+      }
+    });
+    _metadata(partial.metadata, element);
+  }
+
+  AstNode _node(AstNode full, AstNode partial) {
+    if (full == null && partial == null) {
+      return partial;
+    } else if (full is ClassDeclaration && partial is ClassDeclaration) {
+      _classDeclaration(full, partial);
+      return partial;
+    } else if (full is ClassTypeAlias && partial is ClassTypeAlias) {
+      _classTypeAlias(full, partial);
+      return partial;
+    } else if (full is ConstructorDeclaration &&
+        partial is ConstructorDeclaration) {
+      _constructorDeclaration(full, partial);
+      return partial;
+    } else if (full is DefaultFormalParameter &&
+        partial is DefaultFormalParameter) {
+      _node(full.parameter, partial.parameter);
+      return partial;
+    } else if (full is EnumConstantDeclaration &&
+        partial is EnumConstantDeclaration) {
+      _enumConstantDeclaration(full, partial);
+      return partial;
+    } else if (full is EnumDeclaration && partial is EnumDeclaration) {
+      _enumDeclaration(full, partial);
+      return partial;
+    } else if (full is FieldDeclaration && partial is FieldDeclaration) {
+      _fieldDeclaration(full, partial);
+      return partial;
+    } else if (full is FieldFormalParameter &&
+        partial is FieldFormalParameter) {
+      _fieldFormalParameter(full, partial);
+      return partial;
+    } else if (full is FormalParameterList && partial is FormalParameterList) {
+      _formalParameterList(full, partial);
+      return partial;
+    } else if (full is FunctionDeclaration && partial is FunctionDeclaration) {
+      _functionDeclaration(full, partial);
+      return partial;
+    } else if (full is FunctionExpression && partial is FunctionExpression) {
+      _functionExpression(full, partial);
+      return partial;
+    } else if (full is FunctionTypedFormalParameter &&
+        partial is FunctionTypedFormalParameter) {
+      _functionTypedFormalParameter(full, partial);
+      return partial;
+    } else if (full is FunctionTypeAlias && partial is FunctionTypeAlias) {
+      _functionTypeAlias(full, partial);
+      return partial;
+    } else if (full is GenericFunctionType && partial is GenericFunctionType) {
+      _genericFunctionType(full, partial);
+      return partial;
+    } else if (full is GenericTypeAlias && partial is GenericTypeAlias) {
+      _genericTypeAlias(full, partial);
+      return partial;
+    } else if (full is MethodDeclaration && partial is MethodDeclaration) {
+      _methodDeclaration(full, partial);
+      return partial;
+    } else if (full is MixinDeclaration && partial is MixinDeclaration) {
+      _mixinDeclaration(full, partial);
+      return partial;
+    } else if (full is SimpleFormalParameter &&
+        partial is SimpleFormalParameter) {
+      _simpleFormalParameter(full, partial);
+      return partial;
+    } else if (full is TopLevelVariableDeclaration &&
+        partial is TopLevelVariableDeclaration) {
+      _topLevelVariableDeclaration(full, partial);
+      return partial;
+    } else if (full is TypeName && partial is TypeName) {
+      _typeName(full, partial);
+      return partial;
+    } else if (full is TypeParameter && partial is TypeParameter) {
+      _typeParameter(full, partial);
+      return partial;
+    } else if (full is TypeParameterList && partial is TypeParameterList) {
+      _typeParameterList(full, partial);
+      return partial;
+    } else if (full is VariableDeclaration && partial is VariableDeclaration) {
+      _variableDeclaration(full, partial);
+      return partial;
+    } else if (full is VariableDeclarationList &&
+        partial is VariableDeclarationList) {
+      _variableDeclarationList(full, partial);
+      return partial;
+    } else {
+      throw UnimplementedError(
+        '${full.runtimeType} and ${partial.runtimeType}',
+      );
+    }
+  }
+
+  void _simpleFormalParameter(
+    SimpleFormalParameter full,
+    SimpleFormalParameter partial,
+  ) {
+    var element = _walker.getParameter();
+    _match(partial.identifier, element);
+    (partial as SimpleFormalParameterImpl).declaredElement = element;
+    _metadata(partial.metadata, element);
+    _node(full.type, partial.type);
+  }
+
+  void _topLevelVariableDeclaration(
+    TopLevelVariableDeclaration full,
+    TopLevelVariableDeclaration partial,
+  ) {
+    _node(full.variables, partial.variables);
+
+    var first = partial.variables.variables[0];
+    _metadata(partial.metadata, first.declaredElement);
+  }
+
+  void _typeName(TypeName full, TypeName partial) {
+    var fullList = full.typeArguments?.arguments;
+    var partialList = partial.typeArguments?.arguments;
+    if (fullList != null && partialList != null) {
+      for (var i = 0; i < fullList.length; ++i) {
+        _node(fullList[i], partialList[i]);
+      }
+    }
+  }
+
+  void _typeParameter(TypeParameter full, TypeParameter partial) {
+    var element = _walker.getTypeParameter();
+    _match(partial.name, element);
+    _node(full.bound, partial.bound);
+    _metadata(partial.metadata, element);
+  }
+
+  void _typeParameterList(TypeParameterList full, TypeParameterList partial) {
+    var fullList = full.typeParameters;
+    var partialList = partial.typeParameters;
+    for (var i = 0; i < fullList.length; ++i) {
+      _node(fullList[i], partialList[i]);
+    }
+  }
+
+  void _variableDeclaration(
+    VariableDeclaration full,
+    VariableDeclaration partial,
+  ) {
+    var element = _walker.getVariable();
+    _match(partial.name, element);
+
+    partial.initializer = full.initializer;
+    _buildLocalElements(partial.initializer);
+  }
+
+  void _variableDeclarationList(
+    VariableDeclarationList full,
+    VariableDeclarationList partial,
+  ) {
+    _node(full.type, partial.type);
+
+    var fullList = full.variables;
+    var partialList = partial.variables;
+    for (var i = 0; i < fullList.length; ++i) {
+      _node(fullList[i], partialList[i]);
+    }
+  }
+
+  void _walk(_ElementWalker walker, void f()) {
+    var outer = _walker;
+    _walker = walker;
+    f();
+    _walker = outer;
+  }
+
+  /// Associate [nodes] with the corresponding [ElementAnnotation]s.
+  static void _metadata(List<Annotation> nodes, Element element) {
+    var elements = element.metadata;
+    if (nodes.length != elements.length) {
+      throw StateError('Found ${nodes.length} annotation nodes and '
+          '${elements.length} element annotations');
+    }
+    for (var i = 0; i < nodes.length; i++) {
+      nodes[i].elementAnnotation = elements[i];
+    }
+  }
+}
+
+class _ElementWalker {
+  final Element element;
+
+  List<PropertyAccessorElement> _accessors;
+  int _accessorIndex = 0;
+
+  List<ClassElement> _classes;
+  int _classIndex = 0;
+
+  List<ConstructorElement> _constructors;
+  int _constructorIndex = 0;
+
+  List<ClassElement> _enums;
+  int _enumIndex = 0;
+
+  List<ExecutableElement> _functions;
+  int _functionIndex = 0;
+
+  List<ClassElement> _mixins;
+  int _mixinIndex = 0;
+
+  List<ParameterElement> _parameters;
+  int _parameterIndex = 0;
+
+  List<FunctionTypeAliasElement> _typedefs;
+  int _typedefIndex = 0;
+
+  List<TypeParameterElement> _typeParameters;
+  int _typeParameterIndex = 0;
+
+  List<VariableElement> _variables;
+  int _variableIndex = 0;
+
+  _ElementWalker.forClass(ClassElement element)
+      : element = element,
+        _accessors = element.accessors.where(_isNotSynthetic).toList(),
+        _constructors = element.isMixinApplication
+            ? null
+            : element.constructors.where(_isNotSynthetic).toList(),
+        _functions = element.methods,
+        _typeParameters = element.typeParameters,
+        _variables = element.fields.where(_isNotSynthetic).toList();
+
+  _ElementWalker.forCompilationUnit(CompilationUnitElement element)
+      : element = element,
+        _accessors = element.accessors.where(_isNotSynthetic).toList(),
+        _classes = element.types,
+        _enums = element.enums,
+        _functions = element.functions,
+        _mixins = element.mixins,
+        _typedefs = element.functionTypeAliases,
+        _variables = element.topLevelVariables.where(_isNotSynthetic).toList();
+
+  _ElementWalker.forExecutable(ExecutableElement element)
+      : element = element,
+        _parameters = element.parameters,
+        _typeParameters = element.typeParameters;
+
+  _ElementWalker.forGenericFunctionType(GenericFunctionTypeElement element)
+      : element = element,
+        _parameters = element.parameters,
+        _typeParameters = element.typeParameters;
+
+  _ElementWalker.forGenericTypeAlias(FunctionTypeAliasElement element)
+      : element = element,
+        _parameters = element.parameters,
+        _typeParameters = element.typeParameters;
+
+  _ElementWalker.forParameter(ParameterElement element)
+      : element = element,
+        _parameters = element.parameters,
+        _typeParameters = element.typeParameters;
+
+  PropertyAccessorElement getAccessor() {
+    return _accessors[_accessorIndex++];
+  }
+
+  ClassElement getClass() {
+    return _classes[_classIndex++];
+  }
+
+  ConstructorElement getConstructor() {
+    return _constructors[_constructorIndex++];
+  }
+
+  ClassElement getEnum() {
+    return _enums[_enumIndex++];
+  }
+
+  ExecutableElement getFunction() {
+    return _functions[_functionIndex++];
+  }
+
+  ClassElement getMixin() {
+    return _mixins[_mixinIndex++];
+  }
+
+  ParameterElement getParameter() {
+    return _parameters[_parameterIndex++];
+  }
+
+  FunctionTypeAliasElement getTypedef() {
+    return _typedefs[_typedefIndex++];
+  }
+
+  TypeParameterElement getTypeParameter() {
+    return _typeParameters[_typeParameterIndex++];
+  }
+
+  VariableElement getVariable() {
+    return _variables[_variableIndex++];
+  }
+
+  static bool _isNotSynthetic(Element e) => !e.isSynthetic;
+}
diff --git a/analyzer/lib/src/summary2/default_types_builder.dart b/analyzer/lib/src/summary2/default_types_builder.dart
new file mode 100644
index 0000000..18a4fcb
--- /dev/null
+++ b/analyzer/lib/src/summary2/default_types_builder.dart
@@ -0,0 +1,308 @@
+// 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/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/dart/element/type_algebra.dart';
+import 'package:analyzer/src/generated/type_system.dart';
+import 'package:analyzer/src/summary2/function_type_builder.dart';
+import 'package:analyzer/src/summary2/lazy_ast.dart';
+import 'package:analyzer/src/summary2/named_type_builder.dart';
+import 'package:analyzer/src/summary2/type_builder.dart';
+import 'package:kernel/util/graph.dart' show Graph, computeStrongComponents;
+
+class DefaultTypesBuilder {
+  final Dart2TypeSystem typeSystem;
+
+  DefaultTypesBuilder(this.typeSystem);
+
+  void build(List<AstNode> nodes) {
+    for (var node in nodes) {
+      if (node is ClassDeclaration) {
+        _breakRawTypeCycles(node.declaredElement, node.typeParameters);
+        _computeBounds(node.typeParameters);
+      } else if (node is ClassTypeAlias) {
+        _breakRawTypeCycles(node.declaredElement, node.typeParameters);
+        _computeBounds(node.typeParameters);
+      } else if (node is FunctionTypeAlias) {
+        _breakRawTypeCycles(node.declaredElement, node.typeParameters);
+        _computeBounds(node.typeParameters);
+      } else if (node is GenericTypeAlias) {
+        _breakRawTypeCycles(node.declaredElement, node.typeParameters);
+        _computeBounds(node.typeParameters);
+      } else if (node is MixinDeclaration) {
+        _breakRawTypeCycles(node.declaredElement, node.typeParameters);
+        _computeBounds(node.typeParameters);
+      }
+    }
+    for (var node in nodes) {
+      if (node is ClassDeclaration) {
+        _build(node.typeParameters);
+      } else if (node is ClassTypeAlias) {
+        _build(node.typeParameters);
+      } else if (node is FunctionTypeAlias) {
+        _build(node.typeParameters);
+      } else if (node is GenericTypeAlias) {
+        _build(node.typeParameters);
+      } else if (node is MixinDeclaration) {
+        _build(node.typeParameters);
+      }
+    }
+  }
+
+  void _breakRawTypeCycles(
+    Element declarationElement,
+    TypeParameterList parameterList,
+  ) {
+    if (parameterList == null) return;
+
+    var allCycles = <List<_CycleElement>>[];
+    for (var parameter in parameterList.typeParameters) {
+      var boundNode = parameter.bound;
+      if (boundNode == null) continue;
+
+      var cycles = _findRawTypePathsToDeclaration(
+        parameter,
+        boundNode.type,
+        declarationElement,
+        Set<Element>.identity(),
+      );
+      allCycles.addAll(cycles);
+    }
+
+    for (var cycle in allCycles) {
+      for (var element in cycle) {
+        var boundNode = element.parameter.bound;
+        if (boundNode is TypeName) {
+          boundNode.type = DynamicTypeImpl.instance;
+        } else {
+          throw UnimplementedError('(${boundNode.runtimeType}) $boundNode');
+        }
+      }
+    }
+  }
+
+  /// Build actual default type [DartType]s from computed [TypeBuilder]s.
+  void _build(TypeParameterList parameterList) {
+    if (parameterList == null) return;
+
+    for (var parameter in parameterList.typeParameters) {
+      var defaultType = LazyAst.getDefaultType(parameter);
+      if (defaultType is TypeBuilder) {
+        var builtType = defaultType.build();
+        LazyAst.setDefaultType(parameter, builtType);
+      }
+    }
+  }
+
+  /// Compute bounds to be provided as type arguments in place of missing type
+  /// arguments on raw types with the given type parameters.
+  void _computeBounds(TypeParameterList parameterList) {
+    if (parameterList == null) return;
+
+    var dynamicType = typeSystem.typeProvider.dynamicType;
+    var nullType = typeSystem.typeProvider.nullType;
+
+    var nodes = parameterList.typeParameters;
+    var length = nodes.length;
+    var elements = List<TypeParameterElement>(length);
+    var bounds = List<DartType>(length);
+    for (int i = 0; i < length; i++) {
+      var node = nodes[i];
+      elements[i] = node.declaredElement;
+      bounds[i] = node.bound?.type ?? dynamicType;
+    }
+
+    var graph = _TypeParametersGraph(elements, bounds);
+    var stronglyConnected = computeStrongComponents(graph);
+    for (var component in stronglyConnected) {
+      var dynamicSubstitution = <TypeParameterElement, DartType>{};
+      var nullSubstitution = <TypeParameterElement, DartType>{};
+      for (var i in component) {
+        var element = elements[i];
+        dynamicSubstitution[element] = dynamicType;
+        nullSubstitution[element] = nullType;
+      }
+
+      var substitution = Substitution.fromUpperAndLowerBounds(
+        dynamicSubstitution,
+        nullSubstitution,
+      );
+      for (var i in component) {
+        bounds[i] = substitution.substituteType(bounds[i]);
+      }
+    }
+
+    for (var i = 0; i < length; i++) {
+      var thisSubstitution = <TypeParameterElement, DartType>{};
+      var nullSubstitution = <TypeParameterElement, DartType>{};
+      var element = elements[i];
+      thisSubstitution[element] = bounds[i];
+      nullSubstitution[element] = nullType;
+
+      var substitution = Substitution.fromUpperAndLowerBounds(
+        thisSubstitution,
+        nullSubstitution,
+      );
+      for (var j = 0; j < length; j++) {
+        bounds[j] = substitution.substituteType(bounds[j]);
+      }
+    }
+
+    // Set computed TypeBuilder(s) as default types.
+    for (var i = 0; i < length; i++) {
+      LazyAst.setDefaultType(nodes[i], bounds[i]);
+    }
+  }
+
+  /// Finds raw type paths starting with the [startParameter] and a
+  /// [startType] that is used in its bound, and ending with [end].
+  List<List<_CycleElement>> _findRawTypePathsToDeclaration(
+    TypeParameter startParameter,
+    DartType startType,
+    Element end,
+    Set<Element> visited,
+  ) {
+    var paths = <List<_CycleElement>>[];
+    if (startType is NamedTypeBuilder) {
+      var declaration = startType.element;
+      if (startType.arguments.isEmpty) {
+        if (startType.element == end) {
+          paths.add([
+            _CycleElement(startParameter, startType),
+          ]);
+        } else if (visited.add(startType.element)) {
+          void recurseParameters(List<TypeParameterElement> parameters) {
+            for (TypeParameterElementImpl parameter in parameters) {
+              TypeParameter parameterNode = parameter.linkedNode;
+              var bound = parameterNode.bound;
+              if (bound != null) {
+                var tails = _findRawTypePathsToDeclaration(
+                  parameterNode,
+                  bound.type,
+                  end,
+                  visited,
+                );
+                for (var tail in tails) {
+                  paths.add(<_CycleElement>[
+                    _CycleElement(startParameter, startType),
+                  ]..addAll(tail));
+                }
+              }
+            }
+          }
+
+          if (declaration is ClassElement) {
+            recurseParameters(declaration.typeParameters);
+          } else if (declaration is GenericTypeAliasElement) {
+            recurseParameters(declaration.typeParameters);
+          }
+          visited.remove(startType.element);
+        }
+      } else {
+        for (var argument in startType.arguments) {
+          paths.addAll(
+            _findRawTypePathsToDeclaration(
+              startParameter,
+              argument,
+              end,
+              visited,
+            ),
+          );
+        }
+      }
+    } else if (startType is FunctionTypeBuilder) {
+      paths.addAll(
+        _findRawTypePathsToDeclaration(
+          startParameter,
+          startType.returnType,
+          end,
+          visited,
+        ),
+      );
+      for (var formalParameter in startType.parameters) {
+        paths.addAll(
+          _findRawTypePathsToDeclaration(
+            startParameter,
+            formalParameter.type,
+            end,
+            visited,
+          ),
+        );
+      }
+    }
+    return paths;
+  }
+}
+
+class _CycleElement {
+  final TypeParameter parameter;
+  final DartType type;
+
+  _CycleElement(this.parameter, this.type);
+}
+
+/// Graph of mutual dependencies of type parameters from the same declaration.
+/// Type parameters are represented by their indices in the corresponding
+/// declaration.
+class _TypeParametersGraph implements Graph<int> {
+  @override
+  List<int> vertices;
+
+  // Each `edges[i]` is the list of indices of type parameters that reference
+  // the type parameter with the index `i` in their bounds.
+  List<List<int>> _edges;
+
+  Map<TypeParameterElement, int> _parameterToIndex = Map.identity();
+
+  _TypeParametersGraph(
+    List<TypeParameterElement> parameters,
+    List<DartType> bounds,
+  ) {
+    assert(parameters.length == bounds.length);
+
+    vertices = List<int>(parameters.length);
+    _edges = List<List<int>>(parameters.length);
+    for (int i = 0; i < vertices.length; i++) {
+      vertices[i] = i;
+      _edges[i] = <int>[];
+      _parameterToIndex[parameters[i]] = i;
+    }
+
+    for (int i = 0; i < vertices.length; i++) {
+      _collectReferencesFrom(i, bounds[i]);
+    }
+  }
+
+  /// Return type parameters that depend on the [index]th type parameter.
+  @override
+  Iterable<int> neighborsOf(int index) {
+    return _edges[index];
+  }
+
+  /// Collect references to the [index]th type parameter from the [type].
+  void _collectReferencesFrom(int index, DartType type) {
+    if (type is FunctionTypeBuilder) {
+      for (var parameter in type.typeFormals) {
+        _collectReferencesFrom(index, parameter.bound);
+      }
+      for (var parameter in type.parameters) {
+        _collectReferencesFrom(index, parameter.type);
+      }
+      _collectReferencesFrom(index, type.returnType);
+    } else if (type is NamedTypeBuilder) {
+      for (var argument in type.arguments) {
+        _collectReferencesFrom(index, argument);
+      }
+    } else if (type is TypeParameterType) {
+      var typeIndex = _parameterToIndex[type.element];
+      if (typeIndex != null) {
+        _edges[typeIndex].add(index);
+      }
+    }
+  }
+}
diff --git a/analyzer/lib/src/summary2/default_value_resolver.dart b/analyzer/lib/src/summary2/default_value_resolver.dart
new file mode 100644
index 0000000..f531465
--- /dev/null
+++ b/analyzer/lib/src/summary2/default_value_resolver.dart
@@ -0,0 +1,117 @@
+// 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/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_algebra.dart';
+import 'package:analyzer/src/dart/resolver/scope.dart';
+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/linking_node_scope.dart';
+
+class DefaultValueResolver {
+  final Linker _linker;
+  final LibraryElementImpl _libraryElement;
+
+  ClassElement _classElement;
+  ExecutableElement _executableElement;
+  Scope _scope;
+
+  AstResolver _astResolver;
+
+  DefaultValueResolver(this._linker, this._libraryElement);
+
+  void resolve() {
+    for (CompilationUnitElementImpl unit in _libraryElement.units) {
+      for (var classElement in unit.types) {
+        _classElement = classElement;
+
+        for (var element in classElement.constructors) {
+          _constructor(element);
+        }
+
+        for (var element in classElement.methods) {
+          _setScopeFromElement(element);
+          _method(element);
+        }
+
+        _classElement = null;
+      }
+
+      for (var element in unit.functions) {
+        _function(element);
+      }
+    }
+  }
+
+  void _constructor(ConstructorElementImpl element) {
+    if (element.isSynthetic) return;
+
+    _astResolver = null;
+    _executableElement = element;
+    _setScopeFromElement(element);
+
+    _parameters(element.parameters);
+  }
+
+  void _function(FunctionElementImpl element) {
+    _astResolver = null;
+    _executableElement = element;
+    _setScopeFromElement(element);
+
+    _parameters(element.parameters);
+  }
+
+  void _method(MethodElementImpl element) {
+    _astResolver = null;
+    _executableElement = element;
+    _setScopeFromElement(element);
+
+    _parameters(element.parameters);
+  }
+
+  void _parameter(ParameterElementImpl parameter) {
+    Expression defaultValue;
+    var node = parameter.linkedNode;
+    if (node is DefaultFormalParameter) {
+      defaultValue = node.defaultValue;
+    }
+    if (defaultValue == null) return;
+
+    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) {
+    for (var parameter in parameters) {
+      _parameter(parameter);
+    }
+  }
+
+  void _setScopeFromElement(Element element) {
+    _scope = LinkingNodeContext.get((element as ElementImpl).linkedNode).scope;
+  }
+}
+
+class TypeVariableEliminator extends Substitution {
+  final TypeProvider _typeProvider;
+
+  TypeVariableEliminator(this._typeProvider);
+
+  @override
+  DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
+    return upperBound ? _typeProvider.nullType : _typeProvider.objectType;
+  }
+}
diff --git a/analyzer/lib/src/summary2/export.dart b/analyzer/lib/src/summary2/export.dart
new file mode 100644
index 0000000..63a1365
--- /dev/null
+++ b/analyzer/lib/src/summary2/export.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/src/summary2/builder/source_library_builder.dart';
+import 'package:analyzer/src/summary2/combinator.dart';
+import 'package:analyzer/src/summary2/reference.dart';
+
+class Export {
+  final SourceLibraryBuilder exporter;
+  final SourceLibraryBuilder exported;
+  final List<Combinator> combinators;
+
+  Export(this.exporter, this.exported, this.combinators);
+
+  bool addToExportScope(String name, Reference reference) {
+    if (combinators != null) {
+      for (Combinator combinator in combinators) {
+        if (combinator.isShow && !combinator.names.contains(name)) return false;
+        if (combinator.isHide && combinator.names.contains(name)) return false;
+      }
+    }
+    return exporter.addToExportScope(name, reference);
+  }
+}
diff --git a/analyzer/lib/src/summary2/function_type_builder.dart b/analyzer/lib/src/summary2/function_type_builder.dart
new file mode 100644
index 0000000..39425e6
--- /dev/null
+++ b/analyzer/lib/src/summary2/function_type_builder.dart
@@ -0,0 +1,145 @@
+// 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/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/summary2/lazy_ast.dart';
+import 'package:analyzer/src/summary2/type_builder.dart';
+
+/// The type builder for a [GenericFunctionType].
+class FunctionTypeBuilder extends TypeBuilder {
+  static DynamicTypeImpl get _dynamicType => DynamicTypeImpl.instance;
+
+  final List<TypeParameterElement> typeFormals;
+  final List<ParameterElement> parameters;
+  final DartType returnType;
+  final NullabilitySuffix nullabilitySuffix;
+
+  /// The node for which this builder is created, or `null` if the builder
+  /// was detached from its node, e.g. during computing default types for
+  /// type parameters.
+  final GenericFunctionTypeImpl node;
+
+  /// The actual built type, not a [TypeBuilder] anymore.
+  ///
+  /// When [build] is called, the type is built, stored into this field,
+  /// and set for the [node].
+  DartType _type;
+
+  FunctionTypeBuilder(
+    this.typeFormals,
+    this.parameters,
+    this.returnType,
+    this.nullabilitySuffix, {
+    this.node,
+  });
+
+  factory FunctionTypeBuilder.of(
+    GenericFunctionType node,
+    NullabilitySuffix nullabilitySuffix,
+  ) {
+    return FunctionTypeBuilder(
+      node.typeParameters?.typeParameters
+              ?.map((n) => n.declaredElement as TypeParameterElement)
+              ?.toList() ??
+          [],
+      node.parameters.parameters.map((n) {
+        return ParameterElementImpl.synthetic(
+          n.identifier?.name ?? '',
+          _getParameterType(n),
+          // ignore: deprecated_member_use_from_same_package
+          n.kind,
+        );
+      }).toList(),
+      _getNodeType(node.returnType),
+      nullabilitySuffix,
+      node: node,
+    );
+  }
+
+  @override
+  Element get element => null;
+
+  @override
+  DartType build() {
+    if (_type != null) {
+      return _type;
+    }
+
+    var builtReturnType = _buildType(returnType);
+    _type = FunctionTypeImpl.synthetic(
+      builtReturnType,
+      typeFormals,
+      parameters.map((e) {
+        return ParameterElementImpl.synthetic(
+          e.name,
+          _buildType(e.type),
+          // ignore: deprecated_member_use_from_same_package
+          e.parameterKind,
+        );
+      }).toList(),
+      nullabilitySuffix: nullabilitySuffix,
+    );
+
+    if (node != null) {
+      node.type = _type;
+      LazyAst.setReturnType(node, builtReturnType ?? _dynamicType);
+    }
+
+    return _type;
+  }
+
+  @override
+  String toString() {
+    var buffer = StringBuffer();
+
+    if (typeFormals.isNotEmpty) {
+      buffer.write('<');
+      buffer.write(typeFormals.join(', '));
+      buffer.write('>');
+    }
+
+    buffer.write('(');
+    buffer.write(parameters.join(', '));
+    buffer.write(')');
+
+    buffer.write(' → ');
+    buffer.write(returnType);
+
+    return buffer.toString();
+  }
+
+  /// If the [type] is a [TypeBuilder], build it; otherwise return as is.
+  static DartType _buildType(DartType type) {
+    if (type is TypeBuilder) {
+      return type.build();
+    } else {
+      return type;
+    }
+  }
+
+  /// Return the type of the [node] as is, possibly a [TypeBuilder].
+  static DartType _getNodeType(TypeAnnotation node) {
+    if (node == null) {
+      return _dynamicType;
+    } else {
+      return node.type;
+    }
+  }
+
+  /// Return the type of the [node] as is, possibly a [TypeBuilder].
+  static DartType _getParameterType(FormalParameter node) {
+    if (node is DefaultFormalParameter) {
+      return _getParameterType(node.parameter);
+    } else if (node is SimpleFormalParameter) {
+      return _getNodeType(node.type);
+    } else {
+      throw UnimplementedError('(${node.runtimeType}) $node');
+    }
+  }
+}
diff --git a/analyzer/lib/src/summary2/lazy_ast.dart b/analyzer/lib/src/summary2/lazy_ast.dart
new file mode 100644
index 0000000..9f7fd21
--- /dev/null
+++ b/analyzer/lib/src/summary2/lazy_ast.dart
@@ -0,0 +1,1496 @@
+// 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/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/summary/format.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/ast_binary_reader.dart';
+
+/// 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 _defaultTypedKey = 'lazyAst_defaultType';
+  static const _genericFunctionTypeIdKey = 'lazyAst_genericFunctionTypeId';
+  static const _hasOverrideInferenceKey = 'lazyAst_hasOverrideInference';
+  static const _inheritsCovariantKey = 'lazyAst_isCovariant';
+  static const _isSimplyBoundedKey = 'lazyAst_simplyBounded';
+  static const _returnTypeKey = 'lazyAst_returnType';
+  static const _typeInferenceErrorKey = 'lazyAst_typeInferenceError';
+  static const _typeKey = 'lazyAst_type';
+
+  final LinkedNode data;
+
+  LazyAst(this.data);
+
+  static DartType getDefaultType(TypeParameter node) {
+    return node.getProperty(_defaultTypedKey);
+  }
+
+  static int getGenericFunctionTypeId(GenericFunctionType node) {
+    return node.getProperty(_genericFunctionTypeIdKey);
+  }
+
+  static bool getInheritsCovariant(AstNode node) {
+    return node.getProperty(_inheritsCovariantKey) ?? false;
+  }
+
+  static DartType getReturnType(AstNode node) {
+    return node.getProperty(_returnTypeKey);
+  }
+
+  static DartType getType(AstNode node) {
+    return node.getProperty(_typeKey);
+  }
+
+  static TopLevelInferenceError getTypeInferenceError(AstNode node) {
+    return node.getProperty(_typeInferenceErrorKey);
+  }
+
+  static bool hasOverrideInferenceDone(AstNode node) {
+    return node.getProperty(_hasOverrideInferenceKey) ?? false;
+  }
+
+  static bool isSimplyBounded(AstNode node) {
+    return node.getProperty(_isSimplyBoundedKey);
+  }
+
+  static void setDefaultType(TypeParameter node, DartType type) {
+    node.setProperty(_defaultTypedKey, type);
+  }
+
+  static void setGenericFunctionTypeId(GenericFunctionType node, int id) {
+    node.setProperty(_genericFunctionTypeIdKey, id);
+  }
+
+  static void setInheritsCovariant(AstNode node, bool value) {
+    node.setProperty(_inheritsCovariantKey, value);
+  }
+
+  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);
+  }
+
+  static void setTypeInferenceError(
+      AstNode node, TopLevelInferenceError error) {
+    node.setProperty(_typeInferenceErrorKey, error);
+  }
+}
+
+class LazyClassDeclaration {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasDocumentationComment = false;
+  bool _hasExtendsClause = false;
+  bool _hasImplementsClause = false;
+  bool _hasMembers = false;
+  bool _hasMetadata = false;
+  bool _hasWithClause = false;
+
+  LazyClassDeclaration(this.data);
+
+  static LazyClassDeclaration get(ClassDeclaration node) {
+    return node.getProperty(_key);
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    ClassDeclaration node,
+  ) {
+    var lazy = LazyClassDeclaration.get(node);
+    if (lazy != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readExtendsClause(
+    AstBinaryReader reader,
+    ClassDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasExtendsClause) {
+      node.extendsClause = reader.readNode(
+        lazy.data.classDeclaration_extendsClause,
+      );
+      lazy._hasExtendsClause = true;
+    }
+  }
+
+  static void readImplementsClause(
+    AstBinaryReader reader,
+    ClassDeclaration node,
+  ) {
+    var lazy = LazyClassDeclaration.get(node);
+    if (lazy != null && !lazy._hasImplementsClause) {
+      node.implementsClause = reader.readNode(
+        lazy.data.classOrMixinDeclaration_implementsClause,
+      );
+      lazy._hasImplementsClause = true;
+    }
+  }
+
+  static void readMembers(
+    AstBinaryReader reader,
+    ClassDeclaration node,
+  ) {
+    var lazy = LazyClassDeclaration.get(node);
+    if (lazy != null && !lazy._hasMembers) {
+      var dataList = lazy.data.classOrMixinDeclaration_members;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.members[i] = reader.readNode(data);
+      }
+      lazy._hasMembers = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    ClassDeclaration node,
+  ) {
+    var lazy = LazyClassDeclaration.get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readWithClause(
+    AstBinaryReader reader,
+    ClassDeclaration node,
+  ) {
+    var lazy = LazyClassDeclaration.get(node);
+    if (lazy != null && !lazy._hasWithClause) {
+      node.withClause = reader.readNode(
+        lazy.data.classDeclaration_withClause,
+      );
+      lazy._hasWithClause = true;
+    }
+  }
+
+  static void setData(ClassDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyClassDeclaration(data));
+    LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
+  }
+}
+
+class LazyClassTypeAlias {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasDocumentationComment = false;
+  bool _hasImplementsClause = false;
+  bool _hasMetadata = false;
+  bool _hasSuperclass = false;
+  bool _hasWithClause = false;
+
+  LazyClassTypeAlias(this.data);
+
+  static LazyClassTypeAlias get(ClassTypeAlias node) {
+    return node.getProperty(_key);
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    ClassTypeAlias node,
+  ) {
+    var lazy = LazyClassTypeAlias.get(node);
+    if (lazy != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readImplementsClause(
+    AstBinaryReader reader,
+    ClassTypeAlias node,
+  ) {
+    var lazy = LazyClassTypeAlias.get(node);
+    if (lazy != null && !lazy._hasImplementsClause) {
+      node.implementsClause = reader.readNode(
+        lazy.data.classTypeAlias_implementsClause,
+      );
+      lazy._hasImplementsClause = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    ClassTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readSuperclass(
+    AstBinaryReader reader,
+    ClassTypeAlias node,
+  ) {
+    if (reader.isLazy) {
+      var lazy = get(node);
+      if (!lazy._hasSuperclass) {
+        node.superclass = reader.readNode(
+          lazy.data.classTypeAlias_superclass,
+        );
+        lazy._hasSuperclass = true;
+      }
+    }
+  }
+
+  static void readWithClause(
+    AstBinaryReader reader,
+    ClassTypeAlias node,
+  ) {
+    var lazy = LazyClassTypeAlias.get(node);
+    if (lazy != null && !lazy._hasWithClause) {
+      node.withClause = reader.readNode(
+        lazy.data.classTypeAlias_withClause,
+      );
+      lazy._hasWithClause = true;
+    }
+  }
+
+  static void setData(ClassTypeAlias node, LinkedNode data) {
+    node.setProperty(_key, LazyClassTypeAlias(data));
+    LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
+  }
+}
+
+class LazyConstructorDeclaration {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasBody = false;
+  bool _hasDocumentationComment = false;
+  bool _hasFormalParameters = false;
+  bool _hasInitializers = false;
+  bool _hasMetadata = false;
+  bool _hasRedirectedConstructor = false;
+
+  LazyConstructorDeclaration(this.data);
+
+  static LazyConstructorDeclaration get(ConstructorDeclaration node) {
+    return node.getProperty(_key);
+  }
+
+  static void readBody(
+    AstBinaryReader reader,
+    ConstructorDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasBody) {
+      node.body = reader.readNode(
+        lazy.data.constructorDeclaration_body,
+      );
+      lazy._hasBody = true;
+    }
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    ConstructorDeclaration node,
+  ) {
+    var lazy = LazyConstructorDeclaration.get(node);
+    if (lazy != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readFormalParameters(
+    AstBinaryReader reader,
+    ConstructorDeclaration node,
+  ) {
+    var lazy = LazyConstructorDeclaration.get(node);
+    if (lazy != null && !lazy._hasFormalParameters) {
+      node.parameters = reader.readNode(
+        lazy.data.constructorDeclaration_parameters,
+      );
+      lazy._hasFormalParameters = true;
+    }
+  }
+
+  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,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  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));
+  }
+}
+
+class LazyDirective {
+  static const _key = 'lazyAst';
+  static const _uriKey = 'lazyAst_selectedUri';
+
+  final LinkedNode data;
+
+  bool _hasMetadata = false;
+
+  LazyDirective(this.data);
+
+  static LazyDirective get(Directive node) {
+    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) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  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);
+  }
+}
+
+class LazyEnumConstantDeclaration {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasDocumentationComment = false;
+  bool _hasMetadata = false;
+
+  LazyEnumConstantDeclaration(this.data);
+
+  static LazyEnumConstantDeclaration get(EnumConstantDeclaration node) {
+    return node.getProperty(_key);
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    EnumConstantDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    EnumConstantDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void setData(EnumConstantDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyEnumConstantDeclaration(data));
+  }
+}
+
+class LazyEnumDeclaration {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasConstants = false;
+  bool _hasDocumentationComment = false;
+  bool _hasMetadata = false;
+
+  LazyEnumDeclaration(this.data);
+
+  static LazyEnumDeclaration get(EnumDeclaration node) {
+    return node.getProperty(_key);
+  }
+
+  static void readConstants(
+    AstBinaryReader reader,
+    EnumDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasConstants) {
+      var dataList = lazy.data.enumDeclaration_constants;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.constants[i] = reader.readNode(data);
+      }
+      lazy._hasConstants = true;
+    }
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    EnumDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    EnumDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void setData(EnumDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyEnumDeclaration(data));
+  }
+}
+
+class LazyFieldDeclaration {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasDocumentationComment = false;
+  bool _hasMetadata = false;
+
+  LazyFieldDeclaration(this.data);
+
+  static LazyFieldDeclaration get(FieldDeclaration node) {
+    return node.getProperty(_key);
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    FieldDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    FieldDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void setData(FieldDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyFieldDeclaration(data));
+  }
+}
+
+class LazyFormalParameter {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasDefaultValue = false;
+  bool _hasFormalParameters = false;
+  bool _hasMetadata = false;
+  bool _hasType = false;
+  bool _hasTypeInferenceError = false;
+  bool _hasTypeNode = false;
+
+  LazyFormalParameter(this.data);
+
+  static LazyFormalParameter get(FormalParameter node) {
+    return node.getProperty(_key);
+  }
+
+  static DartType getType(
+    AstBinaryReader reader,
+    FormalParameter node,
+  ) {
+    if (reader.isLazy) {
+      var lazy = get(node);
+      if (!lazy._hasType) {
+        var type = reader.readType(lazy.data.actualType);
+        LazyAst.setType(node, type);
+        lazy._hasType = true;
+      }
+    }
+    return LazyAst.getType(node);
+  }
+
+  static TopLevelInferenceError getTypeInferenceError(FormalParameter node) {
+    var lazy = get(node);
+    if (!lazy._hasTypeInferenceError) {
+      var error = lazy.data.topLevelTypeInferenceError;
+      LazyAst.setTypeInferenceError(node, error);
+      lazy._hasTypeInferenceError = true;
+    }
+    return LazyAst.getTypeInferenceError(node);
+  }
+
+  static void readDefaultValue(
+    AstBinaryReader reader,
+    DefaultFormalParameter node,
+  ) {
+    if (reader.isLazy) {
+      var lazy = LazyFormalParameter.get(node);
+      if (lazy != null && !lazy._hasDefaultValue) {
+        node.defaultValue = reader.readNode(
+          lazy.data.defaultFormalParameter_defaultValue,
+        );
+        lazy._hasDefaultValue = true;
+      }
+    }
+  }
+
+  static void readFormalParameters(
+    AstBinaryReader reader,
+    FormalParameter node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasFormalParameters) {
+      if (node is FunctionTypedFormalParameter) {
+        node.parameters = reader.readNode(
+          lazy.data.functionTypedFormalParameter_formalParameters,
+        );
+      } else if (node is FieldFormalParameter) {
+        node.parameters = reader.readNode(
+          lazy.data.fieldFormalParameter_formalParameters,
+        );
+      }
+      lazy._hasFormalParameters = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    FormalParameter node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.normalFormalParameter_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readTypeNode(
+    AstBinaryReader reader,
+    FormalParameter node,
+  ) {
+    if (reader.isLazy) {
+      var lazy = get(node);
+      if (lazy != null && !lazy._hasTypeNode) {
+        if (node is SimpleFormalParameter) {
+          node.type = reader.readNode(
+            lazy.data.simpleFormalParameter_type,
+          );
+        }
+        lazy._hasTypeNode = true;
+      }
+    }
+  }
+
+  static void setData(FormalParameter node, LinkedNode data) {
+    node.setProperty(_key, LazyFormalParameter(data));
+  }
+}
+
+class LazyFunctionDeclaration {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasDocumentationComment = false;
+  bool _hasMetadata = false;
+  bool _hasReturnType = false;
+  bool _hasReturnTypeNode = false;
+
+  LazyFunctionDeclaration(this.data);
+
+  static LazyFunctionDeclaration get(FunctionDeclaration node) {
+    return node.getProperty(_key);
+  }
+
+  static DartType getReturnType(
+    AstBinaryReader reader,
+    FunctionDeclaration node,
+  ) {
+    readFunctionExpression(reader, node);
+    if (reader.isLazy) {
+      var lazy = get(node);
+      if (!lazy._hasReturnType) {
+        var type = reader.readType(lazy.data.actualReturnType);
+        LazyAst.setReturnType(node, type);
+        lazy._hasReturnType = true;
+      }
+    }
+    return LazyAst.getReturnType(node);
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    FunctionDeclaration node,
+  ) {
+    var lazy = LazyFunctionDeclaration.get(node);
+    if (lazy != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readFunctionExpression(
+    AstBinaryReader reader,
+    FunctionDeclaration node,
+  ) {
+    if (node.functionExpression == null) {
+      var lazy = LazyFunctionDeclaration.get(node);
+      node.functionExpression = reader.readNode(
+        lazy.data.functionDeclaration_functionExpression,
+      );
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    FunctionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readReturnTypeNode(
+    AstBinaryReader reader,
+    FunctionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasReturnTypeNode) {
+      node.returnType = reader.readNode(
+        lazy.data.functionDeclaration_returnType,
+      );
+      lazy._hasReturnTypeNode = true;
+    }
+  }
+
+  static void setData(FunctionDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyFunctionDeclaration(data));
+  }
+}
+
+class LazyFunctionExpression {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasBody = false;
+  bool _hasFormalParameters = false;
+
+  LazyFunctionExpression(this.data);
+
+  static LazyFunctionExpression get(FunctionExpression node) {
+    return node.getProperty(_key);
+  }
+
+  static void readBody(
+    AstBinaryReader reader,
+    FunctionExpression node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasBody) {
+      node.body = reader.readNode(
+        lazy.data.functionExpression_body,
+      );
+      lazy._hasBody = true;
+    }
+  }
+
+  static void readFormalParameters(
+    AstBinaryReader reader,
+    FunctionExpression node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasFormalParameters) {
+      node.parameters = reader.readNode(
+        lazy.data.functionExpression_formalParameters,
+      );
+      lazy._hasFormalParameters = true;
+    }
+  }
+
+  static void setData(FunctionExpression node, LinkedNode data) {
+    node.setProperty(_key, LazyFunctionExpression(data));
+  }
+}
+
+class LazyFunctionTypeAlias {
+  static const _key = 'lazyAst';
+  static const _hasSelfReferenceKey = 'lazyAst_hasSelfReferenceKey';
+
+  final LinkedNode data;
+
+  bool _hasDocumentationComment = false;
+  bool _hasFormalParameters = false;
+  bool _hasMetadata = false;
+  bool _hasReturnType = false;
+  bool _hasReturnTypeNode = false;
+
+  LazyFunctionTypeAlias(this.data);
+
+  static LazyFunctionTypeAlias get(FunctionTypeAlias node) {
+    return node.getProperty(_key);
+  }
+
+  static bool getHasSelfReference(FunctionTypeAlias node) {
+    return node.getProperty(_hasSelfReferenceKey);
+  }
+
+  static DartType getReturnType(
+    AstBinaryReader reader,
+    FunctionTypeAlias node,
+  ) {
+    if (reader.isLazy) {
+      var lazy = get(node);
+      if (!lazy._hasReturnType) {
+        var type = reader.readType(lazy.data.actualReturnType);
+        LazyAst.setReturnType(node, type);
+        lazy._hasReturnType = true;
+      }
+    }
+    return LazyAst.getReturnType(node);
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    FunctionTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readFormalParameters(
+    AstBinaryReader reader,
+    FunctionTypeAlias node,
+  ) {
+    var lazy = LazyFunctionTypeAlias.get(node);
+    if (lazy != null && !lazy._hasFormalParameters) {
+      node.parameters = reader.readNode(
+        lazy.data.functionTypeAlias_formalParameters,
+      );
+      lazy._hasFormalParameters = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    FunctionTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readReturnTypeNode(
+    AstBinaryReader reader,
+    FunctionTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasReturnTypeNode) {
+      node.returnType = reader.readNode(
+        lazy.data.functionTypeAlias_returnType,
+      );
+      lazy._hasReturnTypeNode = true;
+    }
+  }
+
+  static void setData(FunctionTypeAlias node, LinkedNode data) {
+    node.setProperty(_key, LazyFunctionTypeAlias(data));
+    LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
+  }
+
+  static void setHasSelfReference(FunctionTypeAlias node, bool value) {
+    node.setProperty(_hasSelfReferenceKey, value);
+  }
+}
+
+class LazyGenericFunctionType {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasFormalParameters = false;
+  bool _hasReturnType = false;
+  bool _hasReturnTypeNode = false;
+
+  LazyGenericFunctionType(this.data);
+
+  static LazyGenericFunctionType get(GenericFunctionType node) {
+    return node.getProperty(_key);
+  }
+
+  static DartType getReturnType(
+    AstBinaryReader reader,
+    GenericFunctionType node,
+  ) {
+    if (reader.isLazy) {
+      var lazy = get(node);
+      if (!lazy._hasReturnType) {
+        var type = reader.readType(lazy.data.actualReturnType);
+        LazyAst.setReturnType(node, type);
+        lazy._hasReturnType = true;
+      }
+    }
+    return LazyAst.getReturnType(node);
+  }
+
+  static void readFormalParameters(
+    AstBinaryReader reader,
+    GenericFunctionType node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasFormalParameters) {
+      node.parameters = reader.readNode(
+        lazy.data.genericFunctionType_formalParameters,
+      );
+      lazy._hasFormalParameters = true;
+    }
+  }
+
+  static void readReturnTypeNode(
+    AstBinaryReader reader,
+    GenericFunctionType node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasReturnTypeNode) {
+      node.returnType = reader.readNode(
+        lazy.data.genericFunctionType_returnType,
+      );
+      lazy._hasReturnTypeNode = true;
+    }
+  }
+
+  static void setData(GenericFunctionType node, LinkedNode data) {
+    node.setProperty(_key, LazyGenericFunctionType(data));
+  }
+}
+
+class LazyGenericTypeAlias {
+  static const _key = 'lazyAst';
+  static const _hasSelfReferenceKey = 'lazyAst_hasSelfReferenceKey';
+
+  final LinkedNode data;
+
+  bool _hasDocumentationComment = false;
+  bool _hasFunction = false;
+  bool _hasMetadata = false;
+
+  LazyGenericTypeAlias(this.data);
+
+  static LazyGenericTypeAlias get(GenericTypeAlias node) {
+    return node.getProperty(_key);
+  }
+
+  static bool getHasSelfReference(GenericTypeAlias node) {
+    return node.getProperty(_hasSelfReferenceKey);
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    GenericTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readFunctionType(
+    AstBinaryReader reader,
+    GenericTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasFunction) {
+      node.functionType = reader.readNode(
+        lazy.data.genericTypeAlias_functionType,
+      );
+      lazy._hasFunction = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    GenericTypeAlias node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void setData(GenericTypeAlias node, LinkedNode data) {
+    node.setProperty(_key, LazyGenericTypeAlias(data));
+    LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
+  }
+
+  static void setHasSelfReference(GenericTypeAlias node, bool value) {
+    node.setProperty(_hasSelfReferenceKey, value);
+  }
+}
+
+class LazyMethodDeclaration {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasBody = false;
+  bool _hasDocumentationComment = false;
+  bool _hasFormalParameters = false;
+  bool _hasMetadata = false;
+  bool _hasReturnType = false;
+  bool _hasReturnTypeNode = false;
+
+  LazyMethodDeclaration(this.data);
+
+  static LazyMethodDeclaration get(MethodDeclaration node) {
+    return node.getProperty(_key);
+  }
+
+  static DartType getReturnType(
+    AstBinaryReader reader,
+    MethodDeclaration node,
+  ) {
+    if (reader.isLazy) {
+      var lazy = get(node);
+      if (!lazy._hasReturnType) {
+        var type = reader.readType(lazy.data.actualReturnType);
+        LazyAst.setReturnType(node, type);
+        lazy._hasReturnType = true;
+      }
+    }
+    return LazyAst.getReturnType(node);
+  }
+
+  static bool isAbstract(MethodDeclaration node) {
+    var lazy = get(node);
+    if (lazy != null) {
+      return lazy.data.methodDeclaration_body.kind ==
+          LinkedNodeKind.emptyFunctionBody;
+    } else {
+      return node.isAbstract;
+    }
+  }
+
+  static void readBody(
+    AstBinaryReader reader,
+    MethodDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasBody) {
+      node.body = reader.readNode(
+        lazy.data.methodDeclaration_body,
+      );
+      lazy._hasBody = true;
+    }
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    MethodDeclaration node,
+  ) {
+    var lazy = LazyMethodDeclaration.get(node);
+    if (lazy != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readFormalParameters(
+    AstBinaryReader reader,
+    MethodDeclaration node,
+  ) {
+    var lazy = LazyMethodDeclaration.get(node);
+    if (lazy != null && !lazy._hasFormalParameters) {
+      node.parameters = reader.readNode(
+        lazy.data.methodDeclaration_formalParameters,
+      );
+      lazy._hasFormalParameters = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    MethodDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readReturnTypeNode(
+    AstBinaryReader reader,
+    MethodDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasReturnTypeNode) {
+      node.returnType = reader.readNode(
+        lazy.data.methodDeclaration_returnType,
+      );
+      lazy._hasReturnTypeNode = true;
+    }
+  }
+
+  static void setData(MethodDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyMethodDeclaration(data));
+  }
+}
+
+class LazyMixinDeclaration {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasDocumentationComment = false;
+  bool _hasOnClause = false;
+  bool _hasImplementsClause = false;
+  bool _hasMembers = false;
+  bool _hasMetadata = false;
+
+  List<String> _superInvokedNames;
+
+  LazyMixinDeclaration(MixinDeclaration node, this.data) {
+    node.setProperty(_key, this);
+    if (data != null) {
+      LazyAst.setSimplyBounded(node, data.simplyBoundable_isSimplyBounded);
+    }
+  }
+
+  List<String> getSuperInvokedNames() {
+    return _superInvokedNames ??= data.mixinDeclaration_superInvokedNames;
+  }
+
+  void put(LinkedNodeBuilder builder) {
+    builder.mixinDeclaration_superInvokedNames = _superInvokedNames ?? [];
+  }
+
+  void setSuperInvokedNames(List<String> value) {
+    _superInvokedNames = value;
+  }
+
+  static LazyMixinDeclaration get(MixinDeclaration node) {
+    LazyMixinDeclaration lazy = node.getProperty(_key);
+    if (lazy == null) {
+      return LazyMixinDeclaration(node, null);
+    }
+    return lazy;
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    MixinDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy.data != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readImplementsClause(
+    AstBinaryReader reader,
+    MixinDeclarationImpl node,
+  ) {
+    var lazy = get(node);
+    if (lazy.data != null && !lazy._hasImplementsClause) {
+      node.implementsClause = reader.readNode(
+        lazy.data.classOrMixinDeclaration_implementsClause,
+      );
+      lazy._hasImplementsClause = true;
+    }
+  }
+
+  static void readMembers(
+    AstBinaryReader reader,
+    MixinDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy.data != null && !lazy._hasMembers) {
+      var dataList = lazy.data.classOrMixinDeclaration_members;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.members[i] = reader.readNode(data);
+      }
+      lazy._hasMembers = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    MixinDeclaration node,
+  ) {
+    var lazy = LazyMixinDeclaration.get(node);
+    if (lazy.data != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void readOnClause(
+    AstBinaryReader reader,
+    MixinDeclarationImpl node,
+  ) {
+    var lazy = get(node);
+    if (lazy.data != null && !lazy._hasOnClause) {
+      node.onClause = reader.readNode(
+        lazy.data.mixinDeclaration_onClause,
+      );
+      lazy._hasOnClause = true;
+    }
+  }
+}
+
+class LazyTopLevelVariableDeclaration {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasDocumentationComment = false;
+  bool _hasMetadata = false;
+
+  LazyTopLevelVariableDeclaration(this.data);
+
+  static LazyTopLevelVariableDeclaration get(TopLevelVariableDeclaration node) {
+    return node.getProperty(_key);
+  }
+
+  static void readDocumentationComment(
+    AstBinaryReader reader,
+    TopLevelVariableDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = reader.readNode(
+        lazy.data.annotatedNode_comment,
+      );
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    TopLevelVariableDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void setData(TopLevelVariableDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyTopLevelVariableDeclaration(data));
+  }
+}
+
+class LazyTypeParameter {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasBound = false;
+  bool _hasDefaultType = false;
+  bool _hasMetadata = false;
+
+  LazyTypeParameter(this.data);
+
+  static LazyTypeParameter get(TypeParameter node) {
+    return node.getProperty(_key);
+  }
+
+  static DartType getDefaultType(AstBinaryReader reader, TypeParameter node) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasDefaultType) {
+      lazy._hasDefaultType = true;
+      var type = reader.readType(lazy.data.typeParameter_defaultType);
+      LazyAst.setDefaultType(node, type);
+      return type;
+    }
+    return LazyAst.getDefaultType(node);
+  }
+
+  static void readBound(AstBinaryReader reader, TypeParameter node) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasBound) {
+      node.bound = reader.readNode(lazy.data.typeParameter_bound);
+      lazy._hasBound = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    TypeParameter node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+
+  static void setData(TypeParameter node, LinkedNode data) {
+    node.setProperty(_key, LazyTypeParameter(data));
+  }
+}
+
+class LazyVariableDeclaration {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasInitializer = false;
+  bool _hasType = false;
+  bool _hasTypeInferenceError = false;
+
+  LazyVariableDeclaration(this.data);
+
+  static LazyVariableDeclaration get(VariableDeclaration node) {
+    return node.getProperty(_key);
+  }
+
+  static DartType getType(
+    AstBinaryReader reader,
+    VariableDeclaration node,
+  ) {
+    if (reader.isLazy) {
+      var lazy = get(node);
+      if (!lazy._hasType) {
+        var type = reader.readType(lazy.data.actualType);
+        LazyAst.setType(node, type);
+        lazy._hasType = true;
+      }
+    }
+    return LazyAst.getType(node);
+  }
+
+  static TopLevelInferenceError getTypeInferenceError(
+      VariableDeclaration node) {
+    var lazy = get(node);
+    if (!lazy._hasTypeInferenceError) {
+      var error = lazy.data.topLevelTypeInferenceError;
+      LazyAst.setTypeInferenceError(node, error);
+      lazy._hasTypeInferenceError = true;
+    }
+    return LazyAst.getTypeInferenceError(node);
+  }
+
+  static void readInitializer(
+    AstBinaryReader reader,
+    VariableDeclaration node,
+  ) {
+    if (reader.isLazy) {
+      var lazy = get(node);
+      if (lazy != null && !lazy._hasInitializer) {
+        node.initializer = reader.readNode(
+          lazy.data.variableDeclaration_initializer,
+        );
+        lazy._hasInitializer = true;
+      }
+    }
+  }
+
+  static void setData(VariableDeclaration node, LinkedNode data) {
+    node.setProperty(_key, LazyVariableDeclaration(data));
+  }
+}
+
+class LazyVariableDeclarationList {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasTypeNode = false;
+
+  LazyVariableDeclarationList(this.data);
+
+  static LazyVariableDeclarationList get(VariableDeclarationList node) {
+    return node.getProperty(_key);
+  }
+
+  static void readTypeNode(
+    AstBinaryReader reader,
+    VariableDeclarationList node,
+  ) {
+    if (reader.isLazy) {
+      var lazy = get(node);
+      if (!lazy._hasTypeNode) {
+        node.type = reader.readNode(
+          lazy.data.variableDeclarationList_type,
+        );
+        lazy._hasTypeNode = true;
+      }
+    }
+  }
+
+  static void setData(VariableDeclarationList node, LinkedNode data) {
+    node.setProperty(_key, LazyVariableDeclarationList(data));
+  }
+}
diff --git a/analyzer/lib/src/summary2/link.dart b/analyzer/lib/src/summary2/link.dart
index aec825a..b3cd018 100644
--- a/analyzer/lib/src/summary2/link.dart
+++ b/analyzer/lib/src/summary2/link.dart
@@ -1,12 +1,14 @@
-// Copyright (c) 2019, 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.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart' show 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';
@@ -14,31 +16,38 @@
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
+import 'package:analyzer/src/summary2/ast_binary_writer.dart';
 import 'package:analyzer/src/summary2/builder/source_library_builder.dart';
 import 'package:analyzer/src/summary2/linked_bundle_context.dart';
 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/top_level_inference.dart';
+import 'package:analyzer/src/summary2/type_alias.dart';
+import 'package:analyzer/src/summary2/types_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;
 
-  LinkingBundleContext linkingBundleContext;
-  List<LinkedNodeLibraryBuilder> linkingLibraries = [];
   LinkedNodeBundleBuilder linkingBundle;
   LinkedBundleContext bundleContext;
+  LinkingBundleContext linkingBundleContext;
 
   /// Libraries that are being linked.
   final Map<Uri, SourceLibraryBuilder> builders = {};
@@ -48,9 +57,15 @@
   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;
+    var neverRef = rootReference.getChild('dart:core').getChild('Never');
+    neverRef.element = NeverElementImpl.instance;
 
     linkingBundleContext = LinkingBundleContext(dynamicRef);
 
@@ -65,31 +80,32 @@
       rootReference,
     );
 
-    linkingBundle = LinkedNodeBundleBuilder(
-      references: linkingBundleContext.referencesBuilder,
-      libraries: linkingLibraries,
-    );
-
-    bundleContext = LinkedBundleContext(
+    bundleContext = LinkedBundleContext.forAst(
       elementFactory,
-      linkingBundle.references,
+      linkingBundleContext.references,
     );
   }
 
-  void link(List<LinkedNodeBundle> inputs,
-      Map<Source, Map<Source, CompilationUnit>> unitMap) {
-    for (var input in inputs) {
-      elementFactory.addBundle(input);
+  FeatureSet get contextFeatures {
+    return analysisContext.analysisOptions.contextFeatures;
+  }
+
+  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);
     }
-
-    // Add libraries being linked, so we can ask for their elements as well.
-    elementFactory.addBundle(linkingBundle, context: bundleContext);
+    // TODO(scheglov) do in build() ?
+    elementFactory.addBundle(bundleContext);
 
     _buildOutlines();
+
+    _createLinkingBundle();
   }
 
   void _addSyntheticConstructors() {
@@ -99,12 +115,25 @@
   }
 
   void _buildOutlines() {
+    _resolveUriDirectives();
     _computeLibraryScopes();
     _addSyntheticConstructors();
     _createTypeSystem();
     _resolveTypes();
+    TypeAliasSelfReferenceFinder().perform(this);
+    _createLoadLibraryFunctions();
     _performTopLevelInference();
+    _resolveConstructors();
+    _resolveConstantInitializers();
+    _resolveDefaultValues();
     _resolveMetadata();
+    _collectMixinSuperInvokedNames();
+  }
+
+  void _collectMixinSuperInvokedNames() {
+    for (var library in builders.values) {
+      library.collectMixinSuperInvokedNames();
+    }
   }
 
   void _computeLibraryScopes() {
@@ -116,21 +145,98 @@
       library.buildInitialExportScope();
     }
 
+    var exporters = new Set<SourceLibraryBuilder>();
+    var exportees = new Set<SourceLibraryBuilder>();
+
     for (var library in builders.values) {
-      library.addImportsToScope();
+      library.addExporters();
+    }
+
+    for (var library in builders.values) {
+      if (library.exporters.isNotEmpty) {
+        exportees.add(library);
+        for (var exporter in library.exporters) {
+          exporters.add(exporter.exporter);
+        }
+      }
+    }
+
+    var both = new Set<SourceLibraryBuilder>();
+    for (var exported in exportees) {
+      if (exporters.contains(exported)) {
+        both.add(exported);
+      }
+      for (var export in exported.exporters) {
+        exported.exportScope.forEach(export.addToExportScope);
+      }
+    }
+
+    while (true) {
+      var hasChanges = false;
+      for (var exported in both) {
+        for (var export in exported.exporters) {
+          exported.exportScope.forEach((name, member) {
+            if (export.addToExportScope(name, member)) {
+              hasChanges = true;
+            }
+          });
+        }
+      }
+      if (!hasChanges) break;
     }
 
     for (var library in builders.values) {
       library.storeExportScope();
     }
 
-    // TODO(scheglov) process imports and exports
+    for (var library in builders.values) {
+      library.buildElement();
+    }
+  }
+
+  void _createLinkingBundle() {
+    var linkingLibraries = <LinkedNodeLibraryBuilder>[];
+    for (var builder in builders.values) {
+      linkingLibraries.add(builder.node);
+
+      for (var unitContext in builder.context.units) {
+        var unit = unitContext.unit;
+
+        var writer = AstBinaryWriter(linkingBundleContext);
+        var unitLinkedNode = writer.writeNode(unit);
+        builder.node.units.add(
+          LinkedNodeUnitBuilder(
+            isSynthetic: unitContext.isSynthetic,
+            uriStr: unitContext.uriStr,
+            lineStarts: unit.lineInfo.lineStarts,
+            tokens: writer.tokensBuilder,
+            node: unitLinkedNode,
+          ),
+        );
+      }
+    }
+    linkingBundle = LinkedNodeBundleBuilder(
+      references: linkingBundleContext.referencesBuilder,
+      libraries: linkingLibraries,
+    );
+  }
+
+  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);
-    typeProvider = SummaryTypeProvider()..initializeCore(coreLib);
+
+    var asyncRef = rootReference.getChild('dart:async');
+    var asyncLib = elementFactory.elementOfReference(asyncRef);
+
+    typeProvider = SummaryTypeProvider()
+      ..initializeCore(coreLib)
+      ..initializeAsync(asyncLib);
     analysisContext.typeProvider = typeProvider;
 
     typeSystem = Dart2TypeSystem(typeProvider);
@@ -140,8 +246,22 @@
   }
 
   void _performTopLevelInference() {
+    TopLevelInference(this).infer();
+  }
+
+  void _resolveConstantInitializers() {
+    ConstantInitializersResolver(this).perform();
+  }
+
+  void _resolveConstructors() {
     for (var library in builders.values) {
-      library.performTopLevelInference();
+      library.resolveConstructors();
+    }
+  }
+
+  void _resolveDefaultValues() {
+    for (var library in builders.values) {
+      library.resolveDefaultValues();
     }
   }
 
@@ -152,12 +272,36 @@
   }
 
   void _resolveTypes() {
+    var nodesToBuildType = NodesToBuildType();
     for (var library in builders.values) {
-      library.resolveTypes();
+      library.resolveTypes(nodesToBuildType);
+    }
+    computeSimplyBounded(bundleContext, builders.values);
+    TypesBuilder(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 bool isSynthetic;
+  final CompilationUnit unit;
+
+  LinkInputUnit(this.source, this.isSynthetic, this.unit);
+}
+
 class LinkResult {
   final LinkedNodeBundleBuilder bundle;
 
diff --git a/analyzer/lib/src/summary2/linked_bundle_context.dart b/analyzer/lib/src/summary2/linked_bundle_context.dart
index fbaf454..7688746 100644
--- a/analyzer/lib/src/summary2/linked_bundle_context.dart
+++ b/analyzer/lib/src/summary2/linked_bundle_context.dart
@@ -1,24 +1,92 @@
-// Copyright (c) 2019, 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.
 
 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/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';
 
 /// The context of a linked bundle, with shared references.
 class LinkedBundleContext {
   final LinkedElementFactory elementFactory;
-  final LinkedNodeReferences referencesData;
+  final LinkedNodeBundle _bundle;
   final List<Reference> _references;
+  final Map<String, LinkedLibraryContext> libraryMap = {};
 
-  LinkedBundleContext(this.elementFactory, this.referencesData)
-      : _references = List<Reference>.filled(referencesData.name.length, null,
-            growable: true);
+  LinkedBundleContext(this.elementFactory, this._bundle)
+      : _references = List<Reference>(_bundle.references.name.length) {
+    for (var library in _bundle.libraries) {
+      var uriStr = library.uriStr;
+      var reference = elementFactory.rootReference.getChild(uriStr);
+      var libraryContext = LinkedLibraryContext(
+        this,
+        uriStr,
+        reference,
+        library,
+      );
+      libraryMap[uriStr] = libraryContext;
+
+      var unitRef = reference.getChild('@unit');
+      var units = library.units;
+      for (var unitIndex = 0; unitIndex < units.length; ++unitIndex) {
+        var unit = units[unitIndex];
+        var uriStr = unit.uriStr;
+        var reference = unitRef.getChild(uriStr);
+        var unitContext = LinkedUnitContext(
+          this,
+          libraryContext,
+          unitIndex,
+          uriStr,
+          reference,
+          unit.isSynthetic,
+          unit,
+        );
+        libraryContext.units.add(unitContext);
+      }
+    }
+  }
+
+  LinkedBundleContext.forAst(this.elementFactory, this._references)
+      : _bundle = null;
+
+  /// Return `true` if this bundle is being linked.
+  bool get isLinking => _bundle == null;
+
+  LinkedLibraryContext addLinkingLibrary(
+    String uriStr,
+    LinkedNodeLibraryBuilder data,
+    LinkInputLibrary inputLibrary,
+  ) {
+    var uriStr = data.uriStr;
+    var reference = elementFactory.rootReference.getChild(uriStr);
+    var libraryContext = LinkedLibraryContext(this, uriStr, reference, data);
+    libraryMap[uriStr] = libraryContext;
+
+    var unitRef = reference.getChild('@unit');
+    var unitIndex = 0;
+    for (var inputUnit in inputLibrary.units) {
+      var source = inputUnit.source;
+      var uriStr = source != null ? '${source.uri}' : '';
+      var reference = unitRef.getChild(uriStr);
+      libraryContext.units.add(
+        LinkedUnitContext(
+          this,
+          libraryContext,
+          unitIndex++,
+          uriStr,
+          reference,
+          inputUnit.isSynthetic,
+          null,
+          unit: inputUnit.unit,
+        ),
+      );
+    }
+    return libraryContext;
+  }
 
   T elementOfIndex<T extends Element>(int index) {
     var reference = referenceOfIndex(index);
@@ -34,59 +102,7 @@
     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.function) {
-      var returnType = getType(linkedType.functionReturnType);
-      var typeParameters = linkedType.functionTypeParameters
-          .map(referenceOfIndex)
-          .map(elementFactory.elementOfReference)
-          .cast<TypeParameterElement>()
-          .toList();
-      var formalParameters = linkedType.functionFormalParameters
-          .map(referenceOfIndex)
-          .map(elementFactory.elementOfReference)
-          .cast<ParameterElement>()
-          .toList();
-      // TODO(scheglov) Rework this to purely synthetic types.
-      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) {
-    // When we are linking a bundle, we add new references.
-    // So, grow the list of references when we have data for them.
-    if (index >= _references.length) {
-      if (referencesData.name.length > _references.length) {
-        _references.length = referencesData.name.length;
-      }
-    }
-
     var reference = _references[index];
     if (reference != null) return reference;
 
@@ -96,13 +112,25 @@
       return reference;
     }
 
-    var parentIndex = referencesData.parent[index];
+    var parentIndex = _bundle.references.parent[index];
     var parent = referenceOfIndex(parentIndex);
 
-    var name = referencesData.name[index];
+    var name = _bundle.references.name[index];
     reference = parent.getChild(name);
     _references[index] = reference;
 
     return reference;
   }
 }
+
+class LinkedLibraryContext {
+  final LinkedBundleContext context;
+  final String uriStr;
+  final Reference reference;
+  final LinkedNodeLibrary node;
+  final List<LinkedUnitContext> units = [];
+
+  LinkedLibraryContext(this.context, this.uriStr, this.reference, this.node);
+
+  LinkedUnitContext get definingUnit => units.first;
+}
diff --git a/analyzer/lib/src/summary2/linked_element_factory.dart b/analyzer/lib/src/summary2/linked_element_factory.dart
index 7653ed6..f02b5e7 100644
--- a/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -3,29 +3,46 @@
 // 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';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+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';
-import 'package:analyzer/src/summary2/tokens_context.dart';
 
 class LinkedElementFactory {
   final AnalysisContext analysisContext;
   final AnalysisSession analysisSession;
   final Reference rootReference;
-  final Map<String, _Library> libraryMap = {};
+  final Map<String, LinkedLibraryContext> libraryMap = {};
+
+  CoreTypes _coreTypes;
 
   LinkedElementFactory(
       this.analysisContext, this.analysisSession, this.rootReference);
 
-  void addBundle(LinkedNodeBundle bundle, {LinkedBundleContext context}) {
-    context ??= LinkedBundleContext(this, bundle.references);
-    for (var library in bundle.libraries) {
-      libraryMap[library.uriStr] = _Library(context, library);
+  CoreTypes get coreTypes {
+    return _coreTypes ??= CoreTypes(this);
+  }
+
+  void addBundle(LinkedBundleContext context) {
+    libraryMap.addAll(context.libraryMap);
+  }
+
+  Namespace buildExportNamespace(Uri uri) {
+    var exportedNames = <String, Element>{};
+
+    var exportedReferences = exportsOfLibrary('$uri');
+    for (var exportedReference in exportedReferences) {
+      var element = elementOfReference(exportedReference);
+      exportedNames[element.name] = element;
     }
+
+    return Namespace(exportedNames);
   }
 
   Element elementOfReference(Reference reference) {
@@ -41,6 +58,8 @@
 
   List<Reference> exportsOfLibrary(String uriStr) {
     var library = libraryMap[uriStr];
+    if (library == null) return const [];
+
     var exportIndexList = library.node.exports;
     var exportReferences = List<Reference>(exportIndexList.length);
     for (var i = 0; i < exportIndexList.length; ++i) {
@@ -51,10 +70,42 @@
     return exportReferences;
   }
 
+  bool isLibraryUri(String uriStr) {
+    var libraryContext = libraryMap[uriStr];
+    return !libraryContext.definingUnit.hasPartOfDirective;
+  }
+
   LibraryElementImpl libraryOfUri(String uriStr) {
     var reference = rootReference.getChild(uriStr);
     return elementOfReference(reference);
   }
+
+  LinkedNode nodeOfReference(Reference reference) {
+//    if (reference.node != null) {
+//      return reference.node;
+//    }
+//
+//    var unitRef = reference.parent?.parent;
+//    var unitContainer = unitRef?.parent;
+//    if (unitContainer?.name == '@unit') {
+//      var libraryUriStr = unitContainer.parent.name;
+//      var libraryData = libraryMap[libraryUriStr];
+//      for (var unitData in libraryData.node.units) {
+//        var definingUnitContext = LinkedUnitContext(
+//          libraryData.context,
+//          TokensContext(unitData.tokens),
+//        );
+//        _ElementRequest._indexUnitDeclarations(
+//          definingUnitContext,
+//          unitRef,
+//          unitData.node,
+//        );
+//        return reference.node;
+//      }
+//    }
+
+    throw UnimplementedError('$reference');
+  }
 }
 
 class _ElementRequest {
@@ -85,14 +136,24 @@
       return _constructor(class_, reference);
     }
 
+    if (parentName == '@enum') {
+      var unit = elementOfReference(parent2);
+      return _enum(unit, reference);
+    }
+
+    if (parentName == '@field') {
+      var enclosing = elementOfReference(parent2);
+      return _field(enclosing, reference);
+    }
+
     if (parentName == '@function') {
       CompilationUnitElementImpl enclosing = elementOfReference(parent2);
       return _function(enclosing, reference);
     }
 
-    if (parentName == '@getter') {
+    if (parentName == '@getter' || parentName == '@setter') {
       var enclosing = elementOfReference(parent2);
-      return _getter(enclosing, reference);
+      return _accessor(enclosing, reference);
     }
 
     if (parentName == '@method') {
@@ -100,19 +161,35 @@
       return _method(enclosing, reference);
     }
 
+    if (parentName == '@mixin') {
+      var unit = elementOfReference(parent2);
+      return _mixin(unit, reference);
+    }
+
     if (parentName == '@parameter') {
       ExecutableElementImpl enclosing = elementOfReference(parent2);
       return _parameter(enclosing, reference);
     }
 
+    if (parentName == '@prefix') {
+      LibraryElementImpl enclosing = elementOfReference(parent2);
+      return _prefix(enclosing, reference);
+    }
+
     if (parentName == '@typeAlias') {
       var unit = elementOfReference(parent2);
       return _typeAlias(unit, reference);
     }
 
     if (parentName == '@typeParameter') {
-      var enclosing = elementOfReference(parent2) as TypeParameterizedElement;
-      return _typeParameter(enclosing, reference);
+      var enclosing = elementOfReference(parent2);
+      if (enclosing is ParameterElement) {
+        (enclosing as ParameterElement).typeParameters;
+      } else {
+        (enclosing as TypeParameterizedElement).typeParameters;
+      }
+      assert(reference.element != null);
+      return reference.element;
     }
 
     if (parentName == '@unit') {
@@ -126,84 +203,7 @@
     throw StateError('Not found: $input');
   }
 
-  ClassElementImpl _class(
-      CompilationUnitElementImpl unit, Reference reference) {
-    if (reference.node == null) {
-      _indexUnitDeclarations(unit);
-      assert(reference.node != 0, '$reference');
-    }
-    return reference.element = ClassElementImpl.forLinkedNode(
-      unit,
-      reference,
-      reference.node,
-    );
-  }
-
-  ConstructorElementImpl _constructor(
-      ClassElementImpl class_, Reference reference) {
-    return reference.element = ConstructorElementImpl.forLinkedNode(
-      reference,
-      reference.node,
-      class_,
-    );
-  }
-
-  LibraryElementImpl _createLibraryElement(Reference reference) {
-    var uriStr = reference.name;
-
-    var sourceFactory = elementFactory.analysisContext.sourceFactory;
-    var librarySource = sourceFactory.forUri(uriStr);
-
-    var libraryData = elementFactory.libraryMap[uriStr];
-    var node = libraryData.node;
-    var hasName = node.name.isNotEmpty;
-
-    var definingUnitData = node.units[0];
-    var definingUnitContext = LinkedUnitContext(
-      libraryData.context,
-      TokensContext(definingUnitData.tokens),
-    );
-
-    var libraryElement = LibraryElementImpl.forLinkedNode(
-      elementFactory.analysisContext,
-      elementFactory.analysisSession,
-      node.name,
-      hasName ? node.nameOffset : -1,
-      node.name.length,
-      definingUnitContext,
-      reference,
-      definingUnitData.node,
-    );
-
-    var units = <CompilationUnitElementImpl>[];
-    var unitContainerRef = reference.getChild('@unit');
-    for (var unitData in node.units) {
-      var unitSource = sourceFactory.forUri(unitData.uriStr);
-      var tokensContext = TokensContext(unitData.tokens);
-      var unitElement = CompilationUnitElementImpl.forLinkedNode(
-        libraryElement,
-        LinkedUnitContext(libraryData.context, tokensContext),
-        unitContainerRef.getChild(unitData.uriStr),
-        unitData.node,
-      );
-      unitElement.source = unitSource;
-      unitElement.librarySource = librarySource;
-      units.add(unitElement);
-      unitContainerRef.getChild(unitData.uriStr).element = unitElement;
-    }
-
-    libraryElement.definingCompilationUnit = units[0];
-    libraryElement.parts = units.skip(1).toList();
-    return reference.element = libraryElement;
-  }
-
-  Element _function(CompilationUnitElementImpl enclosing, Reference reference) {
-    enclosing.functions;
-    assert(reference.element != null);
-    return reference.element;
-  }
-
-  PropertyAccessorElementImpl _getter(
+  PropertyAccessorElementImpl _accessor(
       ElementImpl enclosing, Reference reference) {
     if (enclosing is ClassElementImpl) {
       enclosing.accessors;
@@ -217,43 +217,118 @@
       assert(reference.element != null);
       return reference.element;
     }
+    if (enclosing is EnumElementImpl) {
+      enclosing.accessors;
+      // Requesting accessors sets elements for accessors and variables.
+      assert(reference.element != null);
+      return reference.element;
+    }
     // Only classes and units have accessors.
     throw StateError('${enclosing.runtimeType}');
   }
 
-  void _indexUnitDeclarations(CompilationUnitElementImpl unit) {
-    var context = unit.linkedContext;
-    var unitRef = unit.reference;
-    var classRef = unitRef.getChild('@class');
-    var enumRef = unitRef.getChild('@class');
-    var functionRef = unitRef.getChild('@function');
-    var typeAliasRef = unitRef.getChild('@typeAlias');
-    var variableRef = unitRef.getChild('@variable');
-    for (var declaration in unit.linkedNode.compilationUnit_declarations) {
-      var kind = declaration.kind;
-      if (kind == LinkedNodeKind.classDeclaration ||
-          kind == LinkedNodeKind.classTypeAlias) {
-        var name = context.getUnitMemberName(declaration);
-        classRef.getChild(name).node = declaration;
-      } else if (kind == LinkedNodeKind.enumDeclaration) {
-        var name = context.getUnitMemberName(declaration);
-        enumRef.getChild(name).node = declaration;
-      } else if (kind == LinkedNodeKind.functionDeclaration) {
-        var name = context.getUnitMemberName(declaration);
-        functionRef.getChild(name).node = declaration;
-      } else if (kind == LinkedNodeKind.functionTypeAlias) {
-        var name = context.getUnitMemberName(declaration);
-        typeAliasRef.getChild(name).node = declaration;
-      } else if (kind == LinkedNodeKind.topLevelVariableDeclaration) {
-        var variables = declaration.topLevelVariableDeclaration_variableList;
-        for (var variable in variables.variableDeclarationList_variables) {
-          var name = context.getSimpleName(variable.variableDeclaration_name);
-          variableRef.getChild(name).node = variable;
-        }
-      } else {
-        throw UnimplementedError('$kind');
-      }
+  ClassElementImpl _class(
+      CompilationUnitElementImpl unit, Reference reference) {
+    if (reference.node2 == null) {
+      _indexUnitElementDeclarations(unit);
+      assert(reference.node2 != null, '$reference');
     }
+    ClassElementImpl.forLinkedNode(unit, reference, reference.node2);
+    return reference.element;
+  }
+
+  ConstructorElementImpl _constructor(
+      ClassElementImpl enclosing, Reference reference) {
+    enclosing.constructors;
+    // Requesting constructors sets elements for all of them.
+    assert(reference.element != null);
+    return reference.element;
+  }
+
+  LibraryElementImpl _createLibraryElement(Reference reference) {
+    var uriStr = reference.name;
+
+    var sourceFactory = elementFactory.analysisContext.sourceFactory;
+    var librarySource = sourceFactory.forUri(uriStr);
+
+    // The URI cannot be resolved, we don't know the library.
+    if (librarySource == null) return null;
+
+    var libraryContext = elementFactory.libraryMap[uriStr];
+    var libraryNode = libraryContext.node;
+    var hasName = libraryNode.name.isNotEmpty;
+
+    var definingUnitContext = libraryContext.definingUnit;
+
+    var libraryElement = LibraryElementImpl.forLinkedNode(
+      elementFactory.analysisContext,
+      elementFactory.analysisSession,
+      libraryNode.name,
+      hasName ? libraryNode.nameOffset : -1,
+      libraryNode.name.length,
+      definingUnitContext,
+      reference,
+      definingUnitContext.unit_withDeclarations,
+    );
+
+    var units = <CompilationUnitElementImpl>[];
+    var unitContainerRef = reference.getChild('@unit');
+    for (var unitContext in libraryContext.units) {
+      var unitNode = unitContext.unit_withDeclarations;
+
+      var unitSource = sourceFactory.forUri(unitContext.uriStr);
+      var unitElement = CompilationUnitElementImpl.forLinkedNode(
+        libraryElement,
+        unitContext,
+        unitContext.reference,
+        unitNode,
+      );
+      unitElement.lineInfo = unitNode.lineInfo;
+      unitElement.source = unitSource;
+      unitElement.librarySource = librarySource;
+      units.add(unitElement);
+      unitContainerRef.getChild(unitContext.uriStr).element = unitElement;
+    }
+
+    libraryElement.definingCompilationUnit = units[0];
+    libraryElement.parts = units.skip(1).toList();
+    reference.element = libraryElement;
+
+    var typeProvider = elementFactory.analysisContext.typeProvider;
+    if (typeProvider != null) {
+      libraryElement.createLoadLibraryFunction(typeProvider);
+    }
+
+    return libraryElement;
+  }
+
+  EnumElementImpl _enum(CompilationUnitElementImpl unit, Reference reference) {
+    if (reference.node2 == null) {
+      _indexUnitElementDeclarations(unit);
+      assert(reference.node2 != null, '$reference');
+    }
+    EnumElementImpl.forLinkedNode(unit, reference, reference.node2);
+    return reference.element;
+  }
+
+  FieldElementImpl _field(ClassElementImpl enclosing, Reference reference) {
+    enclosing.fields;
+    // Requesting fields sets elements for all fields.
+    assert(reference.element != null);
+    return reference.element;
+  }
+
+  Element _function(CompilationUnitElementImpl enclosing, Reference reference) {
+    enclosing.functions;
+    assert(reference.element != null);
+    return reference.element;
+  }
+
+  void _indexUnitElementDeclarations(CompilationUnitElementImpl unit) {
+    var unitContext = unit.linkedContext;
+    var unitRef = unit.reference;
+    var unitNode = unit.linkedNode;
+    _indexUnitDeclarations(unitContext, unitRef, unitNode);
   }
 
   MethodElementImpl _method(ClassElementImpl enclosing, Reference reference) {
@@ -263,37 +338,82 @@
     return reference.element;
   }
 
+  MixinElementImpl _mixin(
+      CompilationUnitElementImpl unit, Reference reference) {
+    if (reference.node2 == null) {
+      _indexUnitElementDeclarations(unit);
+      assert(reference.node2 != null, '$reference');
+    }
+    MixinElementImpl.forLinkedNode(unit, reference, reference.node2);
+    return reference.element;
+  }
+
   Element _parameter(ExecutableElementImpl enclosing, Reference reference) {
     enclosing.parameters;
     assert(reference.element != null);
     return reference.element;
   }
 
-  GenericTypeAliasElementImpl _typeAlias(
-      CompilationUnitElementImpl unit, Reference reference) {
-    if (reference.node == null) {
-      _indexUnitDeclarations(unit);
-      assert(reference.node != 0, '$reference');
+  PrefixElementImpl _prefix(LibraryElementImpl library, Reference reference) {
+    for (var import in library.imports) {
+      import.prefix;
     }
-    return reference.element = GenericTypeAliasElementImpl.forLinkedNode(
-      unit,
-      reference,
-      reference.node,
-    );
-  }
-
-  Element _typeParameter(
-      TypeParameterizedElement enclosing, Reference reference) {
-    enclosing.typeParameters;
-    // Requesting type parameters sets elements for all their references.
     assert(reference.element != null);
     return reference.element;
   }
-}
 
-class _Library {
-  final LinkedBundleContext context;
-  final LinkedNodeLibrary node;
+  GenericTypeAliasElementImpl _typeAlias(
+      CompilationUnitElementImpl unit, Reference reference) {
+    if (reference.node2 == null) {
+      _indexUnitElementDeclarations(unit);
+      assert(reference.node2 != null, '$reference');
+    }
+    GenericTypeAliasElementImpl.forLinkedNode(unit, reference, reference.node2);
+    return reference.element;
+  }
 
-  _Library(this.context, this.node);
+  /// 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.
+  static void _indexUnitDeclarations(
+    LinkedUnitContext unitContext,
+    Reference unitRef,
+    CompilationUnit unitNode,
+  ) {
+    var classRef = unitRef.getChild('@class');
+    var enumRef = unitRef.getChild('@enum');
+    var functionRef = unitRef.getChild('@function');
+    var mixinRef = unitRef.getChild('@mixin');
+    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 MixinDeclaration) {
+        var name = declaration.name.name;
+        mixinRef.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/analyzer/lib/src/summary2/linked_unit_context.dart b/analyzer/lib/src/summary2/linked_unit_context.dart
index b1bb1f4..6402f7d 100644
--- a/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -1,11 +1,19 @@
-// Copyright (c) 2019, 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.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/dart/element/visitor.dart';
+import 'package:analyzer/source/line_info.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/generated/utilities_dart.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';
 import 'package:analyzer/src/summary2/linked_bundle_context.dart';
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/summary2/tokens_context.dart';
@@ -13,25 +21,175 @@
 /// The context of a unit - the context of the bundle, and the unit tokens.
 class LinkedUnitContext {
   final LinkedBundleContext bundleContext;
+  final LinkedLibraryContext libraryContext;
+  final int indexInLibrary;
+  final String uriStr;
+  final Reference reference;
+  final bool isSynthetic;
+  final LinkedNodeUnit data;
   final TokensContext tokensContext;
 
-  LinkedUnitContext(this.bundleContext, this.tokensContext);
+  AstBinaryReader _astReader;
 
-  Iterable<LinkedNode> classFields(LinkedNode class_) sync* {
-    for (var declaration in class_.classOrMixinDeclaration_members) {
-      if (declaration.kind == LinkedNodeKind.fieldDeclaration) {
-        var variableList = declaration.fieldDeclaration_fields;
-        for (var field in variableList.variableDeclarationList_variables) {
-          yield field;
-        }
-      }
-    }
+  CompilationUnit _unit;
+  bool _hasDirectivesRead = false;
+
+  /// Mapping from identifiers to elements for generic function types.
+  final Map<int, GenericFunctionTypeElementImpl> _genericFunctionTypes = {};
+
+  /// Mapping from identifiers to synthetic type parameters.
+  ///
+  /// Synthetic type parameters are added when [readType] begins reading a
+  /// [FunctionType], and removed when reading is done.
+  final Map<int, TypeParameterElementImpl> _typeParameters = {};
+
+  int _nextSyntheticTypeParameterId = 0x10000;
+
+  LinkedUnitContext(
+      this.bundleContext,
+      this.libraryContext,
+      this.indexInLibrary,
+      this.uriStr,
+      this.reference,
+      this.isSynthetic,
+      this.data,
+      {CompilationUnit unit})
+      : tokensContext = data != null ? TokensContext(data.tokens) : null {
+    _astReader = AstBinaryReader(this);
+    _astReader.isLazy = unit == null;
+
+    _unit = unit;
+    _hasDirectivesRead = _unit != null;
   }
 
-  String getCommentText(LinkedNode comment) {
-    if (comment == null) return null;
+  LinkedUnitContext._(
+      this.bundleContext,
+      this.libraryContext,
+      this.indexInLibrary,
+      this.uriStr,
+      this.reference,
+      this.isSynthetic,
+      this.data,
+      this.tokensContext);
 
-    return comment.comment_tokens.map(getTokenLexeme).join('\n');
+  bool get hasPartOfDirective {
+    for (var directive in unit_withDirectives.directives) {
+      if (directive is PartOfDirective) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /// Return `true` if this unit is a part of a bundle that is being linked.
+  bool get isLinking => bundleContext.isLinking;
+
+  CompilationUnit get unit => _unit;
+
+  CompilationUnit get unit_withDeclarations {
+    if (_unit == null) {
+      _unit = _astReader.readNode(data.node);
+      _unit.lineInfo = LineInfo(data.lineStarts);
+    }
+    return _unit;
+  }
+
+  CompilationUnit get unit_withDirectives {
+    if (!_hasDirectivesRead) {
+      var directiveDataList = data.node.compilationUnit_directives;
+      for (var i = 0; i < directiveDataList.length; ++i) {
+        var directiveData = directiveDataList[i];
+        _unit.directives[i] = _astReader.readNode(directiveData);
+      }
+      _hasDirectivesRead = true;
+    }
+    return _unit;
+  }
+
+  /// Every [GenericFunctionType] node has [GenericFunctionTypeElement], which
+  /// is created during reading of this node.
+  void addGenericFunctionType(int id, GenericFunctionTypeImpl node) {
+    if (this.reference == null) return;
+
+    LazyAst.setGenericFunctionTypeId(node, id);
+
+    var element = _genericFunctionTypes[id];
+    if (element == null) {
+      element = GenericFunctionTypeElementImpl.forLinkedNode(
+        this.reference.element,
+        null,
+        node,
+      );
+      _genericFunctionTypes[id] = element;
+    }
+
+    node.declaredElement = element;
+
+    var containerRef = this.reference.getChild('@genericFunctionType');
+    var reference = containerRef.getChild('$id');
+    reference.element = element;
+    element.reference = reference;
+  }
+
+  /// 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) {
+    if (node is ClassDeclaration) {
+      return LazyClassDeclaration.get(node).data.codeLength;
+    } else if (node is ClassTypeAlias) {
+      return LazyClassTypeAlias.get(node).data.codeLength;
+    } else if (node is CompilationUnit) {
+      return data.node.codeLength;
+    } else if (node is ConstructorDeclaration) {
+      return LazyConstructorDeclaration.get(node).data.codeLength;
+    } else if (node is EnumDeclaration) {
+      return LazyEnumDeclaration.get(node).data.codeLength;
+    } else if (node is FormalParameter) {
+      return LazyFormalParameter.get(node).data.codeLength;
+    } else if (node is FunctionDeclaration) {
+      return LazyFunctionDeclaration.get(node).data.codeLength;
+    } else if (node is MethodDeclaration) {
+      return LazyMethodDeclaration.get(node).data.codeLength;
+    } else if (node is MixinDeclaration) {
+      return LazyMixinDeclaration.get(node).data.codeLength;
+    } else if (node is TypeParameter) {
+      return LazyTypeParameter.get(node).data.codeLength;
+    } else if (node is VariableDeclaration) {
+      return LazyVariableDeclaration.get(node).data.codeLength;
+    }
+    throw UnimplementedError('${node.runtimeType}');
+  }
+
+  int getCodeOffset(AstNode node) {
+    if (node is ClassDeclaration) {
+      return LazyClassDeclaration.get(node).data.codeOffset;
+    } else if (node is ClassTypeAlias) {
+      return LazyClassTypeAlias.get(node).data.codeOffset;
+    } else if (node is CompilationUnit) {
+      return data.node.codeOffset;
+    } else if (node is ConstructorDeclaration) {
+      return LazyConstructorDeclaration.get(node).data.codeOffset;
+    } else if (node is EnumDeclaration) {
+      return LazyEnumDeclaration.get(node).data.codeOffset;
+    } else if (node is FormalParameter) {
+      return LazyFormalParameter.get(node).data.codeOffset;
+    } else if (node is FunctionDeclaration) {
+      return LazyFunctionDeclaration.get(node).data.codeOffset;
+    } else if (node is MethodDeclaration) {
+      return LazyMethodDeclaration.get(node).data.codeOffset;
+    } else if (node is MixinDeclaration) {
+      return LazyMixinDeclaration.get(node).data.codeOffset;
+    } else if (node is TypeParameter) {
+      return LazyTypeParameter.get(node).data.codeOffset;
+    } else if (node is VariableDeclaration) {
+      return LazyVariableDeclaration.get(node).data.codeOffset;
+    }
+    throw UnimplementedError('${node.runtimeType}');
   }
 
   String getConstructorDeclarationName(LinkedNode node) {
@@ -42,110 +200,967 @@
     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);
+      for (var member in members) {
+        if (member is ConstructorDeclaration) {
+          yield member;
+        }
+      }
+    }
+  }
+
+  DartType getDefaultType(TypeParameter node) {
+    return LazyTypeParameter.getDefaultType(_astReader, node);
+  }
+
+  String getDefaultValueCode(AstNode node) {
+    if (node is DefaultFormalParameter) {
+      LazyFormalParameter.readDefaultValue(_astReader, node);
+      return node.defaultValue?.toString();
+    }
+    return null;
+  }
+
+  int getDirectiveOffset(AstNode node) {
+    LazyDirective.readMetadata(_astReader, node);
+    return node.offset;
+  }
+
+  Comment getDocumentationComment(AstNode node) {
+    if (node is ClassDeclaration) {
+      LazyClassDeclaration.readDocumentationComment(_astReader, node);
+      return node.documentationComment;
+    } else if (node is ClassTypeAlias) {
+      LazyClassTypeAlias.readDocumentationComment(_astReader, node);
+      return node.documentationComment;
+    } else if (node is ConstructorDeclaration) {
+      LazyConstructorDeclaration.readDocumentationComment(_astReader, node);
+      return node.documentationComment;
+    } else if (node is EnumConstantDeclaration) {
+      LazyEnumConstantDeclaration.readDocumentationComment(_astReader, node);
+      return node.documentationComment;
+    } else if (node is EnumDeclaration) {
+      LazyEnumDeclaration.readDocumentationComment(_astReader, node);
+      return node.documentationComment;
+    } else if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readDocumentationComment(_astReader, node);
+      return node.documentationComment;
+    } else if (node is FunctionTypeAlias) {
+      LazyFunctionTypeAlias.readDocumentationComment(_astReader, node);
+      return node.documentationComment;
+    } else if (node is GenericTypeAlias) {
+      LazyGenericTypeAlias.readDocumentationComment(_astReader, node);
+      return node.documentationComment;
+    } else if (node is MethodDeclaration) {
+      LazyMethodDeclaration.readDocumentationComment(_astReader, node);
+      return node.documentationComment;
+    } else if (node is MixinDeclaration) {
+      LazyMixinDeclaration.readDocumentationComment(_astReader, node);
+      return node.documentationComment;
+    } else if (node is VariableDeclaration) {
+      var parent2 = node.parent.parent;
+      if (parent2 is FieldDeclaration) {
+        LazyFieldDeclaration.readDocumentationComment(_astReader, parent2);
+        return parent2.documentationComment;
+      } else if (parent2 is TopLevelVariableDeclaration) {
+        LazyTopLevelVariableDeclaration.readDocumentationComment(
+          _astReader,
+          parent2,
+        );
+        return parent2.documentationComment;
+      } else {
+        throw UnimplementedError('${parent2.runtimeType}');
+      }
+    } else {
+      throw UnimplementedError('${node.runtimeType}');
+    }
+  }
+
+  List<EnumConstantDeclaration> getEnumConstants(EnumDeclaration node) {
+    LazyEnumDeclaration.readConstants(_astReader, node);
+    return node.constants;
+  }
+
+  String getFieldFormalParameterName(AstNode node) {
+    if (node is DefaultFormalParameter) {
+      return getFieldFormalParameterName(node.parameter);
+    } else if (node is FieldFormalParameter) {
+      return node.identifier.name;
+    } else {
+      throw StateError('${node.runtimeType}');
+    }
+  }
+
+  Iterable<VariableDeclaration> getFields(ClassOrMixinDeclaration node) sync* {
+    var members = _getClassOrMixinMembers(node);
+    for (var member in members) {
+      if (member is FieldDeclaration) {
+        for (var field in member.fields.variables) {
+          yield field;
+        }
+      }
+    }
+  }
+
   String getFormalParameterName(LinkedNode node) {
     return getSimpleName(node.normalFormalParameter_identifier);
   }
 
-  List<LinkedNode> getFormalParameters(LinkedNode node) {
-    LinkedNode parameterList;
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.constructorDeclaration) {
-      parameterList = node.constructorDeclaration_parameters;
-    } else if (kind == LinkedNodeKind.functionDeclaration) {
-      parameterList = node.functionDeclaration_functionExpression
-          .functionExpression_formalParameters;
-    } else if (kind == LinkedNodeKind.functionTypeAlias) {
-      parameterList = node.functionTypeAlias_formalParameters;
-    } else if (kind == LinkedNodeKind.methodDeclaration) {
-      parameterList = node.methodDeclaration_formalParameters;
+  List<FormalParameter> getFormalParameters(AstNode node) {
+    if (node is ConstructorDeclaration) {
+      LazyConstructorDeclaration.readFormalParameters(_astReader, node);
+      return node.parameters.parameters;
+    } else if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
+      return getFormalParameters(node.functionExpression);
+    } else if (node is FunctionExpression) {
+      LazyFunctionExpression.readFormalParameters(_astReader, node);
+      return node.parameters?.parameters;
+    } else if (node is FormalParameter) {
+      if (node is DefaultFormalParameter) {
+        return getFormalParameters(node.parameter);
+      } else if (node is FieldFormalParameter) {
+        LazyFormalParameter.readFormalParameters(_astReader, node);
+        return node.parameters?.parameters;
+      } else if (node is FunctionTypedFormalParameter) {
+        LazyFormalParameter.readFormalParameters(_astReader, node);
+        return node.parameters.parameters;
+      } else {
+        return null;
+      }
+    } else if (node is FunctionTypeAlias) {
+      LazyFunctionTypeAlias.readFormalParameters(_astReader, node);
+      return node.parameters.parameters;
+    } else if (node is GenericFunctionType) {
+      LazyGenericFunctionType.readFormalParameters(_astReader, node);
+      return node.parameters.parameters;
+    } else if (node is MethodDeclaration) {
+      LazyMethodDeclaration.readFormalParameters(_astReader, node);
+      return node.parameters?.parameters;
     } else {
-      throw UnimplementedError('$kind');
+      throw UnimplementedError('${node.runtimeType}');
     }
-    return parameterList?.formalParameterList_parameters;
+//    if (kind == LinkedNodeKind.constructorDeclaration) {
+//      parameterList = node.constructorDeclaration_parameters;
+//    } else if (kind == LinkedNodeKind.functionDeclaration) {
+//      return getFormalParameters(node.functionDeclaration_functionExpression);
+//    } else if (kind == LinkedNodeKind.functionExpression) {
+//      parameterList = node.functionExpression_formalParameters;
+//    } else if (kind == LinkedNodeKind.functionTypeAlias) {
+//      parameterList = node.functionTypeAlias_formalParameters;
+//    } else if (kind == LinkedNodeKind.genericFunctionType) {
+//      parameterList = node.genericFunctionType_formalParameters;
+//    } else if (kind == LinkedNodeKind.methodDeclaration) {
+//      parameterList = node.methodDeclaration_formalParameters;
+//    } else {
+//      throw UnimplementedError('$kind');
+//    }
   }
 
-  LinkedNode getImplementsClause(LinkedNode node) {
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.classDeclaration) {
-      return node.classOrMixinDeclaration_implementsClause;
-    } else if (kind == LinkedNodeKind.classTypeAlias) {
-      return node.classTypeAlias_implementsClause;
+  Reference getGenericFunctionTypeReference(GenericFunctionType node) {
+    var id = LazyAst.getGenericFunctionTypeId(node);
+    return reference.getChild('@genericFunctionType').getChild('$id');
+  }
+
+  GenericFunctionType getGeneticTypeAliasFunction(GenericTypeAlias node) {
+    LazyGenericTypeAlias.readFunctionType(_astReader, node);
+    return node.functionType;
+  }
+
+  bool getHasTypedefSelfReference(AstNode node) {
+    if (node is FunctionTypeAlias) {
+      return LazyFunctionTypeAlias.getHasSelfReference(node);
+    } else if (node is GenericTypeAlias) {
+      return LazyGenericTypeAlias.getHasSelfReference(node);
+    }
+    return false;
+  }
+
+  ImplementsClause getImplementsClause(AstNode node) {
+    if (node is ClassDeclaration) {
+      LazyClassDeclaration.readImplementsClause(_astReader, node);
+      return node.implementsClause;
+    } else if (node is ClassTypeAlias) {
+      LazyClassTypeAlias.readImplementsClause(_astReader, node);
+      return node.implementsClause;
+    } else if (node is MixinDeclaration) {
+      LazyMixinDeclaration.readImplementsClause(_astReader, node);
+      return node.implementsClause;
     } else {
-      throw UnimplementedError('$kind');
+      throw UnimplementedError('${node.runtimeType}');
+    }
+  }
+
+  bool getInheritsCovariant(AstNode node) {
+    if (node is DefaultFormalParameter) {
+      return getInheritsCovariant(node.parameter);
+    } else if (node is FormalParameter) {
+      return LazyAst.getInheritsCovariant(node);
+    } else if (node is VariableDeclaration) {
+      return LazyAst.getInheritsCovariant(node);
+    } else {
+      throw StateError('${node.runtimeType}');
     }
   }
 
   InterfaceType getInterfaceType(LinkedNodeType linkedType) {
-    return bundleContext.getInterfaceType(linkedType);
+    var type = readType(linkedType);
+    if (type is InterfaceType && !type.element.isEnum) {
+      return type;
+    }
+    return null;
   }
 
-  List<LinkedNode> getMetadataOrEmpty(LinkedNode node) {
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.classDeclaration ||
-        kind == LinkedNodeKind.classTypeAlias ||
-        kind == LinkedNodeKind.constructorDeclaration ||
-        kind == LinkedNodeKind.enumConstantDeclaration ||
-        kind == LinkedNodeKind.enumDeclaration ||
-        kind == LinkedNodeKind.functionDeclaration ||
-        kind == LinkedNodeKind.functionTypeAlias ||
-        kind == LinkedNodeKind.methodDeclaration ||
-        kind == LinkedNodeKind.mixinDeclaration ||
-        kind == LinkedNodeKind.variableDeclaration) {
-      return node.annotatedNode_metadata;
+  Comment getLibraryDocumentationComment(CompilationUnit unit) {
+    for (var directive in unit.directives) {
+      if (directive is LibraryDirective) {
+        return directive.documentationComment;
+      }
     }
-    if (kind == LinkedNodeKind.fieldFormalParameter ||
-        kind == LinkedNodeKind.functionTypedFormalParameter ||
-        kind == LinkedNodeKind.simpleFormalParameter) {
-      return node.normalFormalParameter_metadata;
+    return null;
+  }
+
+  List<Annotation> getLibraryMetadata(CompilationUnit unit) {
+    for (var directive in unit.directives) {
+      if (directive is LibraryDirective) {
+        return getMetadata(directive);
+      }
     }
-    return const <LinkedNode>[];
+    return const <Annotation>[];
+  }
+
+  List<Annotation> getMetadata(AstNode node) {
+    if (node is ClassDeclaration) {
+      LazyClassDeclaration.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is ClassTypeAlias) {
+      LazyClassTypeAlias.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is CompilationUnit) {
+      assert(node == _unit);
+      return _getPartDirectiveAnnotation();
+    } else if (node is ConstructorDeclaration) {
+      LazyConstructorDeclaration.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is DefaultFormalParameter) {
+      return getMetadata(node.parameter);
+    } else if (node is Directive) {
+      LazyDirective.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is EnumConstantDeclaration) {
+      LazyEnumConstantDeclaration.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is EnumDeclaration) {
+      LazyEnumDeclaration.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is FormalParameter) {
+      LazyFormalParameter.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is FunctionTypeAlias) {
+      LazyFunctionTypeAlias.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is GenericTypeAlias) {
+      LazyGenericTypeAlias.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is MethodDeclaration) {
+      LazyMethodDeclaration.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is MixinDeclaration) {
+      LazyMixinDeclaration.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is TypeParameter) {
+      LazyTypeParameter.readMetadata(_astReader, node);
+      return node.metadata;
+    } else if (node is VariableDeclaration) {
+      var parent2 = node.parent.parent;
+      if (parent2 is FieldDeclaration) {
+        LazyFieldDeclaration.readMetadata(_astReader, parent2);
+        return parent2.metadata;
+      } else if (parent2 is TopLevelVariableDeclaration) {
+        LazyTopLevelVariableDeclaration.readMetadata(_astReader, parent2);
+        return parent2.metadata;
+      }
+    }
+//    var kind = node.kind;
+//    if (kind == LinkedNodeKind.classDeclaration ||
+//        kind == LinkedNodeKind.classTypeAlias ||
+//        kind == LinkedNodeKind.constructorDeclaration ||
+//        kind == LinkedNodeKind.enumConstantDeclaration ||
+//        kind == LinkedNodeKind.enumDeclaration ||
+//        kind == LinkedNodeKind.exportDirective ||
+//        kind == LinkedNodeKind.functionDeclaration ||
+//        kind == LinkedNodeKind.functionTypeAlias ||
+//        kind == LinkedNodeKind.libraryDirective ||
+//        kind == LinkedNodeKind.importDirective ||
+//        kind == LinkedNodeKind.methodDeclaration ||
+//        kind == LinkedNodeKind.mixinDeclaration ||
+//        kind == LinkedNodeKind.partDirective ||
+//        kind == LinkedNodeKind.partOfDirective ||
+//        kind == LinkedNodeKind.variableDeclaration) {
+//      return node.annotatedNode_metadata;
+//    }
+//    if (kind == LinkedNodeKind.defaultFormalParameter) {
+//      return getMetadataOrEmpty(node.defaultFormalParameter_parameter);
+//    }
+//    if (kind == LinkedNodeKind.fieldFormalParameter ||
+//        kind == LinkedNodeKind.functionTypedFormalParameter ||
+//        kind == LinkedNodeKind.simpleFormalParameter) {
+//      return node.normalFormalParameter_metadata;
+//    }
+    return const <Annotation>[];
   }
 
   String getMethodName(LinkedNode node) {
     return getSimpleName(node.methodDeclaration_name);
   }
 
-  DartType getReturnType(LinkedNode node) {
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.functionDeclaration) {
-      return getType(node.functionDeclaration_returnType2);
-    } else if (kind == LinkedNodeKind.methodDeclaration) {
-      return getType(node.methodDeclaration_returnType2);
-    } else {
-      throw UnimplementedError('$kind');
+  Iterable<MethodDeclaration> getMethods(AstNode node) sync* {
+    if (node is ClassOrMixinDeclaration) {
+      var members = _getClassOrMixinMembers(node);
+      for (var member in members) {
+        if (member is MethodDeclaration) {
+          yield member;
+        }
+      }
     }
   }
 
+  List<String> getMixinSuperInvokedNames(MixinDeclaration node) {
+    return LazyMixinDeclaration.get(node).getSuperInvokedNames();
+  }
+
+  int getNameOffset(AstNode node) {
+    if (node is ConstructorDeclaration) {
+      if (node.name != null) {
+        return node.name.offset;
+      } else {
+        return node.returnType.offset;
+      }
+    } else if (node is EnumConstantDeclaration) {
+      return node.name.offset;
+    } else if (node is FormalParameter) {
+      return node.identifier?.offset ?? -1;
+    } else if (node is MethodDeclaration) {
+      return node.name.offset;
+    } else if (node is NamedCompilationUnitMember) {
+      return node.name.offset;
+    } else if (node is TypeParameter) {
+      return node.name.offset;
+    } else if (node is VariableDeclaration) {
+      return node.name.offset;
+    }
+    throw UnimplementedError('${node.runtimeType}');
+  }
+
+  OnClause getOnClause(MixinDeclaration node) {
+    LazyMixinDeclaration.readOnClause(_astReader, node);
+    return node.onClause;
+  }
+
+  /// Return the actual return type for the [node] - explicit or inferred.
+  DartType getReturnType(AstNode node) {
+    if (node is FunctionDeclaration) {
+      return LazyFunctionDeclaration.getReturnType(_astReader, node);
+    } else if (node is FunctionTypeAlias) {
+      return LazyFunctionTypeAlias.getReturnType(_astReader, node);
+    } else if (node is GenericFunctionType) {
+      return LazyGenericFunctionType.getReturnType(_astReader, node);
+    } else if (node is MethodDeclaration) {
+      return LazyMethodDeclaration.getReturnType(_astReader, node);
+    } else {
+      throw UnimplementedError('${node.runtimeType}');
+    }
+  }
+
+  TypeAnnotation getReturnTypeNode(AstNode node) {
+    if (node is FunctionTypeAlias) {
+      LazyFunctionTypeAlias.readReturnTypeNode(_astReader, node);
+      return node.returnType;
+    } else if (node is GenericFunctionType) {
+      LazyGenericFunctionType.readReturnTypeNode(_astReader, node);
+      return node.returnType;
+    } else if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readReturnTypeNode(_astReader, node);
+      return node.returnType;
+    } else if (node is MethodDeclaration) {
+      LazyMethodDeclaration.readReturnTypeNode(_astReader, node);
+      return node.returnType;
+    } else {
+      throw UnimplementedError('${node.runtimeType}');
+    }
+  }
+
+  String getSelectedUri(UriBasedDirective node) {
+    return LazyDirective.getSelectedUri(node);
+  }
+
   String getSimpleName(LinkedNode node) {
     return getTokenLexeme(node.simpleIdentifier_token);
   }
 
+  List<String> getSimpleNameList(List<LinkedNode> nodeList) {
+    return nodeList.map(getSimpleName).toList();
+  }
+
   int getSimpleOffset(LinkedNode node) {
-    return tokensContext.offset(node.simpleIdentifier_token);
+    return getTokenOffset(node.simpleIdentifier_token);
   }
 
   String getStringContent(LinkedNode node) {
     return node.simpleStringLiteral_value;
   }
 
+  TypeName getSuperclass(AstNode node) {
+    if (node is ClassDeclaration) {
+      LazyClassDeclaration.readExtendsClause(_astReader, node);
+      return node.extendsClause?.superclass;
+    } else if (node is ClassTypeAlias) {
+      LazyClassTypeAlias.readSuperclass(_astReader, node);
+      return node.superclass;
+    } else {
+      throw StateError('${node.runtimeType}');
+    }
+  }
+
   String getTokenLexeme(int token) {
     return tokensContext.lexeme(token);
   }
 
-  DartType getType(LinkedNodeType linkedType) {
-    return bundleContext.getType(linkedType);
+  int getTokenOffset(int token) {
+    return tokensContext.offset(token);
   }
 
-  DartType getTypeAnnotationType(LinkedNode node) {
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.typeName) {
-      return getType(node.typeName_type);
+  /// Return the actual type for the [node] - explicit or inferred.
+  DartType getType(AstNode node) {
+    if (node is DefaultFormalParameter) {
+      return getType(node.parameter);
+    } else if (node is FormalParameter) {
+      return LazyFormalParameter.getType(_astReader, node);
+    } else if (node is VariableDeclaration) {
+      return LazyVariableDeclaration.getType(_astReader, node);
+    } else {
+      throw UnimplementedError('${node.runtimeType}');
+    }
+  }
+
+  TopLevelInferenceError getTypeInferenceError(AstNode node) {
+    if (node is DefaultFormalParameter) {
+      return getTypeInferenceError(node.parameter);
+    } else if (node is SimpleFormalParameter) {
+      return LazyFormalParameter.getTypeInferenceError(node);
+    } else if (node is VariableDeclaration) {
+      return LazyVariableDeclaration.getTypeInferenceError(node);
+    } else {
+      return null;
+    }
+  }
+
+  TypeAnnotation getTypeParameterBound(TypeParameter node) {
+    LazyTypeParameter.readBound(_astReader, node);
+    return node.bound;
+  }
+
+  TypeParameterList getTypeParameters2(AstNode node) {
+    if (node is ClassDeclaration) {
+      return node.typeParameters;
+    } else if (node is ClassTypeAlias) {
+      return node.typeParameters;
+    } else if (node is ConstructorDeclaration) {
+      return null;
+    } else if (node is DefaultFormalParameter) {
+      return getTypeParameters2(node.parameter);
+    } else if (node is FieldFormalParameter) {
+      return null;
+    } else if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
+      return getTypeParameters2(node.functionExpression);
+    } else if (node is FunctionExpression) {
+      return node.typeParameters;
+    } else if (node is FunctionTypedFormalParameter) {
+      return node.typeParameters;
+    } else if (node is FunctionTypeAlias) {
+      return node.typeParameters;
+    } else if (node is GenericFunctionType) {
+      return node.typeParameters;
+    } else if (node is GenericTypeAlias) {
+      return node.typeParameters;
+    } else if (node is MethodDeclaration) {
+      return node.typeParameters;
+    } else if (node is MixinDeclaration) {
+      return node.typeParameters;
+    } else if (node is SimpleFormalParameter) {
+      return null;
+    } else {
+      throw UnimplementedError('${node.runtimeType}');
+    }
+  }
+
+  String getUnitMemberName(LinkedNode node) {
+    return getSimpleName(node.namedCompilationUnitMember_name);
+  }
+
+  String getVariableName(LinkedNode node) {
+    return getSimpleName(node.variableDeclaration_name);
+  }
+
+  WithClause getWithClause(AstNode node) {
+    if (node is ClassDeclaration) {
+      LazyClassDeclaration.readWithClause(_astReader, node);
+      return node.withClause;
+    } else if (node is ClassTypeAlias) {
+      LazyClassTypeAlias.readWithClause(_astReader, node);
+      return node.withClause;
+    } else {
+      throw UnimplementedError('${node.runtimeType}');
+    }
+  }
+
+  bool hasImplicitReturnType(AstNode node) {
+    if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
+      return node.returnType == null;
+    }
+    if (node is MethodDeclaration) {
+      LazyMethodDeclaration.readReturnTypeNode(_astReader, node);
+      return node.returnType == null;
+    }
+    return false;
+  }
+
+  bool hasImplicitType(AstNode node) {
+    if (node is DefaultFormalParameter) {
+      return hasImplicitType(node.parameter);
+    } else if (node is SimpleFormalParameter) {
+      return node.type == null;
+    } else if (node is VariableDeclaration) {
+      VariableDeclarationList parent = node.parent;
+      LazyVariableDeclarationList.readTypeNode(_astReader, parent);
+      return parent.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;
+    } else if (node is ClassTypeAlias) {
+      return node.abstractKeyword != null;
+    } else if (node is FunctionDeclaration) {
+      return false;
+    } else if (node is MethodDeclaration) {
+      return LazyMethodDeclaration.isAbstract(node);
+    }
+    throw UnimplementedError('${node.runtimeType}');
+  }
+
+  bool isAsynchronous(AstNode node) {
+    var body = _getFunctionBody(node);
+    return body.isAsynchronous;
+  }
+
+  bool isAsyncKeyword(int token) {
+    return tokensContext.type(token) == UnlinkedTokenType.ASYNC;
+  }
+
+  bool isConst(AstNode node) {
+    if (node is FormalParameter) {
+      return node.isConst;
+    }
+    if (node is VariableDeclaration) {
+      VariableDeclarationList parent = node.parent;
+      return parent.isConst;
+    }
+//    var kind = node.kind;
+//    if (kind == LinkedNodeKind.defaultFormalParameter) {
+//      return isConst(node.defaultFormalParameter_parameter);
+//    }
+//    if (kind == LinkedNodeKind.simpleFormalParameter) {
+//      return isConstKeyword(node.simpleFormalParameter_keyword);
+//    }
+//    if (kind == LinkedNodeKind.variableDeclaration) {
+//      return node.variableDeclaration_declaration.isConst;
+//    }
+    throw UnimplementedError('${node.runtimeType}');
+  }
+
+  bool isConstKeyword(int token) {
+    return tokensContext.type(token) == UnlinkedTokenType.CONST;
+  }
+
+  bool isConstVariableList(LinkedNode node) {
+    return isConstKeyword(node.variableDeclarationList_keyword);
+  }
+
+  bool isExplicitlyCovariant(AstNode node) {
+    if (node is EnumConstantDeclaration) {
+      return false;
+    } else 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;
+    } else {
+      throw StateError('${node.runtimeType}');
+    }
+  }
+
+  bool isExternal(AstNode node) {
+    if (node is ConstructorDeclaration) {
+      return node.externalKeyword != null;
+    } else if (node is FunctionDeclaration) {
+      return node.externalKeyword != null;
+    } else if (node is MethodDeclaration) {
+      return node.externalKeyword != null;
+    } else {
+      throw UnimplementedError('${node.runtimeType}');
+    }
+  }
+
+  bool isFinal(AstNode node) {
+    if (node is EnumConstantDeclaration) {
+      return false;
+    }
+    if (node is VariableDeclaration) {
+      VariableDeclarationList parent = node.parent;
+      return parent.isFinal;
+    }
+    throw UnimplementedError('${node.runtimeType}');
+  }
+
+  bool isFinalKeyword(int token) {
+    return tokensContext.type(token) == UnlinkedTokenType.FINAL;
+  }
+
+  bool isFinalVariableList(LinkedNode node) {
+    return isFinalKeyword(node.variableDeclarationList_keyword);
+  }
+
+  bool isFunction(LinkedNode node) {
+    return node.kind == LinkedNodeKind.functionDeclaration;
+  }
+
+  bool isGenerator(AstNode node) {
+    var body = _getFunctionBody(node);
+    return body.isGenerator;
+  }
+
+  bool isGetter(AstNode node) {
+    if (node is FunctionDeclaration) {
+      return node.isGetter;
+    } else if (node is MethodDeclaration) {
+      return node.isGetter;
+    } else {
+      throw StateError('${node.runtimeType}');
+    }
+  }
+
+  bool isLate(AstNode node) {
+    if (node is VariableDeclaration) {
+      return node.isLate;
+    }
+    if (node is VariableDeclarationList) {
+      return node.isLate;
+    }
+    if (node is EnumConstantDeclaration) {
+      return false;
+    }
+    throw UnimplementedError('${node.runtimeType}');
+  }
+
+  bool isLibraryKeyword(int token) {
+    return tokensContext.type(token) == UnlinkedTokenType.LIBRARY;
+  }
+
+  bool isMethod(LinkedNode node) {
+    return node.kind == LinkedNodeKind.methodDeclaration;
+  }
+
+  bool isSetter(AstNode node) {
+    if (node is FunctionDeclaration) {
+      return node.isSetter;
+    } else if (node is MethodDeclaration) {
+      return node.isSetter;
+    } else {
+      throw StateError('${node.runtimeType}');
+    }
+  }
+
+  bool isSimplyBounded(AstNode node) {
+    return LazyAst.isSimplyBounded(node);
+  }
+
+  bool isStatic(AstNode node) {
+    if (node is FunctionDeclaration) {
+      return true;
+    } else if (node is MethodDeclaration) {
+      return node.modifierKeyword != null;
+    } else if (node is VariableDeclaration) {
+      var parent2 = node.parent.parent;
+      return parent2 is FieldDeclaration && parent2.isStatic;
+    }
+    throw UnimplementedError('${node.runtimeType}');
+  }
+
+  bool isSyncKeyword(int token) {
+    return tokensContext.type(token) == UnlinkedTokenType.SYNC;
+  }
+
+  Expression readInitializer(AstNode node) {
+    if (node is DefaultFormalParameter) {
+      LazyFormalParameter.readDefaultValue(_astReader, node);
+      return node.defaultValue;
+    } else if (node is VariableDeclaration) {
+      LazyVariableDeclaration.readInitializer(_astReader, node);
+      return node.initializer;
+    } else {
+      throw StateError('${node.runtimeType}');
+    }
+  }
+
+  AstNode readNode(LinkedNode linkedNode) {
+    return _astReader.readNode(linkedNode);
+  }
+
+  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 typeParametersLength = typeParameterDataList.length;
+      var typeParameters = List<TypeParameterElement>(typeParametersLength);
+      for (var i = 0; i < typeParametersLength; ++i) {
+        var typeParameterData = typeParameterDataList[i];
+        var element = TypeParameterElementImpl(typeParameterData.name, -1);
+        typeParameters[i] = element;
+        _typeParameters[_nextSyntheticTypeParameterId++] = element;
+      }
+
+      // Type parameters might use each other in bounds, including forward
+      // references. So, we read bounds after reading all type parameters.
+      for (var i = 0; i < typeParametersLength; ++i) {
+        var typeParameterData = typeParameterDataList[i];
+        TypeParameterElementImpl element = typeParameters[i];
+        element.bound = readType(typeParameterData.bound);
+      }
+
+      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 < typeParametersLength; ++i) {
+        _typeParameters.remove(--_nextSyntheticTypeParameterId);
+      }
+
+      var nullabilitySuffix = _nullabilitySuffix(linkedType.nullabilitySuffix);
+
+      return FunctionTypeImpl.synthetic(
+        returnType,
+        typeParameters,
+        formalParameters,
+      ).withNullability(nullabilitySuffix);
+    } else if (kind == LinkedNodeTypeKind.interface) {
+      var element = bundleContext.elementOfIndex(linkedType.interfaceClass);
+      var nullabilitySuffix = _nullabilitySuffix(linkedType.nullabilitySuffix);
+      return InterfaceTypeImpl.explicit(
+        element,
+        linkedType.interfaceTypeArguments.map(readType).toList(),
+        nullabilitySuffix: nullabilitySuffix,
+      );
+    } else if (kind == LinkedNodeTypeKind.typeParameter) {
+      TypeParameterElement element;
+      var id = linkedType.typeParameterId;
+      if (id != 0) {
+        element = _typeParameters[id];
+        assert(element != null);
+      } else {
+        var index = linkedType.typeParameterElement;
+        element = bundleContext.elementOfIndex(index);
+      }
+      var nullabilitySuffix = _nullabilitySuffix(linkedType.nullabilitySuffix);
+      return TypeParameterTypeImpl(element).withNullability(nullabilitySuffix);
+    } else if (kind == LinkedNodeTypeKind.void_) {
+      return VoidTypeImpl.instance;
     } else {
       throw UnimplementedError('$kind');
     }
   }
 
-  List<LinkedNode> getTypeParameters(LinkedNode node) {
+  /// Read new resolved [CompilationUnit] from the [data], and in contrast to
+  /// reading AST for element model, read it eagerly. We can do this, because
+  /// the element model is fully accessible, so we don't need to worry about
+  /// potential forward references.
+  ///
+  /// The new instance of [CompilationUnit] is required because the client of
+  /// this method is going to modify the unit - merge parsed, not yet resolved
+  /// function bodies into it, and resolve them.
+  CompilationUnit readUnitEagerly() {
+    reference.element.accept(
+      _TypeParameterReader(),
+    );
+    _RecursiveTypeReader(this).read(unit);
+
+    var context = LinkedUnitContext._(
+      bundleContext,
+      libraryContext,
+      indexInLibrary,
+      uriStr,
+      reference,
+      isSynthetic,
+      data,
+      TokensContext(data.tokens),
+    );
+    context._genericFunctionTypes.addAll(_genericFunctionTypes);
+    var astReader = AstBinaryReader(context);
+    return astReader.readNode(data.node);
+  }
+
+  void setInheritsCovariant(AstNode node, bool value) {
+    if (node is FormalParameter) {
+      LazyAst.setInheritsCovariant(node, value);
+    } else if (node is VariableDeclaration) {
+      LazyAst.setInheritsCovariant(node, value);
+    } else {
+      throw StateError('${node.runtimeType}');
+    }
+  }
+
+  void setOverrideInferenceDone(AstNode node) {
+    // TODO(scheglov) This assert fails, check how to avoid this.
+//    assert(!_astReader.isLazy);
+    LazyAst.setOverrideInferenceDone(node);
+  }
+
+  void setReturnType(AstNode node, DartType type) {
+    LazyAst.setReturnType(node, type);
+  }
+
+  void setVariableType(AstNode node, DartType type) {
+    if (node is DefaultFormalParameter) {
+      setVariableType(node.parameter, type);
+    } else {
+      LazyAst.setType(node, type);
+    }
+  }
+
+  bool shouldBeConstFieldElement(AstNode node) {
+    if (node is VariableDeclaration) {
+      VariableDeclarationList variableList = node.parent;
+      if (variableList.isConst) return true;
+
+      if (variableList.isFinal) {
+        ClassOrMixinDeclaration class_ = variableList.parent.parent;
+        for (var member in class_.members) {
+          if (member is ConstructorDeclaration && member.constKeyword != null) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  Iterable<VariableDeclaration> topLevelVariables(CompilationUnit unit) sync* {
+    for (var declaration in unit.declarations) {
+      if (declaration is TopLevelVariableDeclaration) {
+        for (var variable in declaration.variables.variables) {
+          yield variable;
+        }
+      }
+    }
+  }
+
+  ParameterKind _formalParameterKind(LinkedNodeFormalParameterKind kind) {
+    if (kind == LinkedNodeFormalParameterKind.optionalNamed) {
+      return ParameterKind.NAMED;
+    } else if (kind == LinkedNodeFormalParameterKind.optionalPositional) {
+      return ParameterKind.POSITIONAL;
+    } else if (kind == LinkedNodeFormalParameterKind.requiredNamed) {
+      return ParameterKind.NAMED_REQUIRED;
+    }
+    return ParameterKind.REQUIRED;
+  }
+
+  List<ClassMember> _getClassOrMixinMembers(ClassOrMixinDeclaration node) {
+    if (node is ClassDeclaration) {
+      LazyClassDeclaration.readMembers(_astReader, node);
+    } else if (node is MixinDeclaration) {
+      LazyMixinDeclaration.readMembers(_astReader, node);
+    } else {
+      throw StateError('${node.runtimeType}');
+    }
+    return node.members;
+  }
+
+  FunctionBody _getFunctionBody(AstNode node) {
+    if (node is ConstructorDeclaration) {
+      LazyConstructorDeclaration.readBody(_astReader, node);
+      return node.body;
+    } else if (node is FunctionDeclaration) {
+      LazyFunctionDeclaration.readFunctionExpression(_astReader, node);
+      return _getFunctionBody(node.functionExpression);
+    } else if (node is FunctionExpression) {
+      LazyFunctionExpression.readBody(_astReader, node);
+      return node.body;
+    } else if (node is MethodDeclaration) {
+      LazyMethodDeclaration.readBody(_astReader, node);
+      return node.body;
+    } else {
+      throw UnimplementedError('${node.runtimeType}');
+    }
+  }
+
+  NodeList<Annotation> _getPartDirectiveAnnotation() {
+    if (indexInLibrary != 0) {
+      var definingContext = libraryContext.definingUnit;
+      var unit = definingContext.unit;
+      var partDirectiveIndex = 0;
+      for (var directive in unit.directives) {
+        if (directive is PartDirective) {
+          partDirectiveIndex++;
+          if (partDirectiveIndex == indexInLibrary) {
+            LazyDirective.readMetadata(definingContext._astReader, directive);
+            return directive.metadata;
+          }
+        }
+      }
+    }
+    throw StateError('Expected to find $indexInLibrary part directive.');
+  }
+
+  static List<LinkedNode> getTypeParameters(LinkedNode node) {
     LinkedNode typeParameterList;
     var kind = node.kind;
     if (kind == LinkedNodeKind.classTypeAlias) {
@@ -161,6 +1176,10 @@
       typeParameterList = node.functionExpression_typeParameters;
     } else if (kind == LinkedNodeKind.functionTypeAlias) {
       typeParameterList = node.functionTypeAlias_typeParameters;
+    } else if (kind == LinkedNodeKind.genericFunctionType) {
+      typeParameterList = node.genericFunctionType_typeParameters;
+    } else if (kind == LinkedNodeKind.genericTypeAlias) {
+      typeParameterList = node.genericTypeAlias_typeParameters;
     } else if (kind == LinkedNodeKind.methodDeclaration) {
       typeParameterList = node.methodDeclaration_typeParameters;
     } else {
@@ -169,216 +1188,108 @@
     return typeParameterList?.typeParameterList_typeParameters;
   }
 
-  String getUnitMemberName(LinkedNode node) {
-    return getSimpleName(node.namedCompilationUnitMember_name);
+  static NullabilitySuffix _nullabilitySuffix(EntityRefNullabilitySuffix data) {
+    switch (data) {
+      case EntityRefNullabilitySuffix.starOrIrrelevant:
+        return NullabilitySuffix.star;
+      case EntityRefNullabilitySuffix.question:
+        return NullabilitySuffix.question;
+      case EntityRefNullabilitySuffix.none:
+        return NullabilitySuffix.none;
+      default:
+        throw StateError('$data');
+    }
   }
+}
 
-  String getVariableName(LinkedNode node) {
-    return getSimpleName(node.variableDeclaration_name);
-  }
+/// Ensure that all [GenericFunctionType] and [TypeParameter] nodes are read,
+/// so their elements are created and set in [Reference]s.
+class _RecursiveTypeReader {
+  final LinkedUnitContext context;
 
-  bool isAbstract(LinkedNode node) {
-    return node.kind == LinkedNodeKind.methodDeclaration &&
-        node.methodDeclaration_body.kind == LinkedNodeKind.emptyFunctionBody;
-  }
+  _RecursiveTypeReader(this.context);
 
-  bool isAsynchronous(LinkedNode node) {
-    LinkedNode body = _getFunctionBody(node);
-    if (body.kind == LinkedNodeKind.blockFunctionBody) {
-      return body.blockFunctionBody_keyword != 0;
-    } else if (body.kind == LinkedNodeKind.emptyFunctionBody) {
-      return false;
+  void read(AstNode node) {
+    if (node == null) {
+    } else if (node is ClassDeclaration) {
+      _readTypeParameters(node);
+      node.members.forEach(read);
+    } else if (node is ClassTypeAlias) {
+      _readTypeParameters(node);
+    } else if (node is CompilationUnit) {
+      for (var declaration in node.declarations) {
+        read(declaration);
+      }
+    } else if (node is ConstructorDeclaration) {
+      _readFormalParameters(node);
+    } else if (node is EnumDeclaration) {
+    } else if (node is FieldDeclaration) {
+      read(node.fields);
+    } else if (node is FunctionDeclaration) {
+      _readTypeParameters(node);
+      _readFormalParameters(node);
+      _readReturnType(node);
+    } else if (node is FunctionTypeAlias) {
+      _readTypeParameters(node);
+      _readFormalParameters(node);
+      _readReturnType(node);
+    } else if (node is GenericFunctionType) {
+      _readTypeParameters(node);
+      _readFormalParameters(node);
+      _readReturnType(node);
+    } else if (node is GenericTypeAlias) {
+      _readTypeParameters(node);
+      LazyGenericTypeAlias.readFunctionType(context._astReader, node);
+      read(node.functionType);
+    } else if (node is MethodDeclaration) {
+      _readTypeParameters(node);
+      _readFormalParameters(node);
+      _readReturnType(node);
+    } else if (node is MixinDeclaration) {
+      _readTypeParameters(node);
+      node.members.forEach(read);
+    } else if (node is TopLevelVariableDeclaration) {
+      read(node.variables);
+    } else if (node is TypeName) {
+      node.typeArguments?.arguments?.forEach(read);
+    } else if (node is VariableDeclarationList) {
+      LazyVariableDeclarationList.readTypeNode(context._astReader, node);
+      read(node.type);
     } else {
-      return body.expressionFunctionBody_keyword != 0;
+      throw StateError('${node.runtimeType}');
     }
   }
 
-  bool isConst(LinkedNode node) {
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.variableDeclaration) {
-      return node.variableDeclaration_declaration.isConst;
-    }
-    throw UnimplementedError('$kind');
-  }
+  void _readFormalParameters(AstNode node) {
+    var formalParameters = context.getFormalParameters(node);
+    if (formalParameters == null) return;
 
-  bool isConstKeyword(int token) {
-    return tokensContext.type(token) == UnlinkedTokenType.CONST;
-  }
-
-  bool isConstVariableList(LinkedNode node) {
-    return isConstKeyword(node.variableDeclarationList_keyword);
-  }
-
-  bool isExternal(LinkedNode node) {
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.constructorDeclaration) {
-      return node.constructorDeclaration_externalKeyword != 0;
-    } else if (kind == LinkedNodeKind.functionDeclaration) {
-      return node.functionDeclaration_externalKeyword != 0;
-    } else if (kind == LinkedNodeKind.methodDeclaration) {
-      return node.methodDeclaration_externalKeyword != 0;
-    } else {
-      throw UnimplementedError('$kind');
-    }
-  }
-
-  bool isFinal(LinkedNode node) {
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.enumConstantDeclaration) {
-      return false;
-    }
-    if (kind == LinkedNodeKind.variableDeclaration) {
-      return node.variableDeclaration_declaration.isFinal;
-    }
-    throw UnimplementedError('$kind');
-  }
-
-  bool isFinalKeyword(int token) {
-    return tokensContext.type(token) == UnlinkedTokenType.FINAL;
-  }
-
-  bool isFinalVariableList(LinkedNode node) {
-    return isFinalKeyword(node.variableDeclarationList_keyword);
-  }
-
-  bool isFunction(LinkedNode node) {
-    return node.kind == LinkedNodeKind.functionDeclaration;
-  }
-
-  bool isGenerator(LinkedNode node) {
-    LinkedNode body = _getFunctionBody(node);
-    if (body.kind == LinkedNodeKind.blockFunctionBody) {
-      return body.blockFunctionBody_star != 0;
-    }
-    return false;
-  }
-
-  bool isGetter(LinkedNode node) {
-    return isGetterMethod(node) || isGetterFunction(node);
-  }
-
-  bool isGetterFunction(LinkedNode node) {
-    return isFunction(node) &&
-        _isGetToken(node.functionDeclaration_propertyKeyword);
-  }
-
-  bool isGetterMethod(LinkedNode node) {
-    return isMethod(node) &&
-        _isGetToken(node.methodDeclaration_propertyKeyword);
-  }
-
-  bool isLibraryKeyword(int token) {
-    return tokensContext.type(token) == UnlinkedTokenType.LIBRARY;
-  }
-
-  bool isMethod(LinkedNode node) {
-    return node.kind == LinkedNodeKind.methodDeclaration;
-  }
-
-  bool isSetter(LinkedNode node) {
-    return isSetterMethod(node) || isSetterFunction(node);
-  }
-
-  bool isSetterFunction(LinkedNode node) {
-    return isFunction(node) &&
-        _isSetToken(node.functionDeclaration_propertyKeyword);
-  }
-
-  bool isSetterMethod(LinkedNode node) {
-    return isMethod(node) &&
-        _isSetToken(node.methodDeclaration_propertyKeyword);
-  }
-
-  bool isStatic(LinkedNode node) {
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.functionDeclaration) {
-      return true;
-    } else if (kind == LinkedNodeKind.methodDeclaration) {
-      return node.methodDeclaration_modifierKeyword != 0;
-    } else if (kind == LinkedNodeKind.variableDeclaration) {
-      return node.variableDeclaration_declaration.isStatic;
-    }
-    throw UnimplementedError('$kind');
-  }
-
-  void loadClassMemberReferences(Reference reference) {
-    var node = reference.node;
-    if (node.kind != LinkedNodeKind.classDeclaration &&
-        node.kind != LinkedNodeKind.mixinDeclaration) {
-      return;
-    }
-
-    var constructorContainerRef = reference.getChild('@constructor');
-    var fieldContainerRef = reference.getChild('@field');
-    var methodContainerRef = reference.getChild('@method');
-    var getterContainerRef = reference.getChild('@getter');
-    var setterContainerRef = reference.getChild('@setter');
-    for (var member in node.classOrMixinDeclaration_members) {
-      if (member.kind == LinkedNodeKind.constructorDeclaration) {
-        var name = getConstructorDeclarationName(member);
-        constructorContainerRef.getChild(name).node = member;
-      } else if (member.kind == LinkedNodeKind.fieldDeclaration) {
-        var variableList = member.fieldDeclaration_fields;
-        for (var field in variableList.variableDeclarationList_variables) {
-          var name = getSimpleName(field.variableDeclaration_name);
-          fieldContainerRef.getChild(name).node = field;
-        }
-      } else if (member.kind == LinkedNodeKind.methodDeclaration) {
-        var name = getSimpleName(member.methodDeclaration_name);
-        var propertyKeyword = member.methodDeclaration_propertyKeyword;
-        if (_isGetToken(propertyKeyword)) {
-          getterContainerRef.getChild(name).node = member;
-        } else if (_isSetToken(propertyKeyword)) {
-          setterContainerRef.getChild(name).node = member;
-        } else {
-          methodContainerRef.getChild(name).node = member;
-        }
+    for (var formalParameter in formalParameters) {
+      if (formalParameter is SimpleFormalParameter) {
+        read(formalParameter.type);
       }
     }
   }
 
-  Expression readInitializer(LinkedNode linkedNode) {
-    if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
-      return readNode(linkedNode.defaultFormalParameter_defaultValue);
-    }
-    return readNode(linkedNode.variableDeclaration_initializer);
+  void _readReturnType(AstNode node) {
+    var returnType = context.getReturnTypeNode(node);
+    read(returnType);
   }
 
-  AstNode readNode(LinkedNode linkedNode) {
-    var reader = AstBinaryReader(this);
-    return reader.readNode(linkedNode);
-  }
+  void _readTypeParameters(AstNode node) {
+    var typeParameters = context.getTypeParameters2(node);
+    if (typeParameters == null) return;
 
-  Iterable<LinkedNode> topLevelVariables(LinkedNode unit) sync* {
-    for (var declaration in unit.compilationUnit_declarations) {
-      if (declaration.kind == LinkedNodeKind.topLevelVariableDeclaration) {
-        var variableList = declaration.topLevelVariableDeclaration_variableList;
-        for (var variable in variableList.variableDeclarationList_variables) {
-          yield variable;
-        }
-      }
+    for (var typeParameter in typeParameters.typeParameters) {
+      var bound = context.getTypeParameterBound(typeParameter);
+      read(bound);
     }
   }
+}
 
-  LinkedNode _getFunctionBody(LinkedNode node) {
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.constructorDeclaration) {
-      return node.constructorDeclaration_body;
-    } else if (kind == LinkedNodeKind.functionDeclaration) {
-      return node
-          .functionDeclaration_functionExpression.functionExpression_body;
-    } else if (kind == LinkedNodeKind.methodDeclaration) {
-      return node.methodDeclaration_body;
-    } else {
-      throw UnimplementedError('$kind');
-    }
-  }
-
-  bool _isGetToken(int token) {
-    return tokensContext.type(token) == UnlinkedTokenType.GET;
-  }
-
-  bool _isSetToken(int token) {
-    return tokensContext.type(token) == UnlinkedTokenType.SET;
+class _TypeParameterReader extends RecursiveElementVisitor<void> {
+  @override
+  void visitTypeParameterElement(TypeParameterElement element) {
+    super.visitTypeParameterElement(element);
   }
 }
diff --git a/analyzer/lib/src/summary2/linking_bundle_context.dart b/analyzer/lib/src/summary2/linking_bundle_context.dart
index 50b9b92..fd4148c 100644
--- a/analyzer/lib/src/summary2/linking_bundle_context.dart
+++ b/analyzer/lib/src/summary2/linking_bundle_context.dart
@@ -1,11 +1,13 @@
-// Copyright (c) 2019, 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.
 
 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/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary2/reference.dart';
@@ -27,9 +29,37 @@
     name: [''],
   );
 
+  final Map<TypeParameterElement, int> _typeParameters = Map.identity();
+  int _nextSyntheticTypeParameterId = 0x10000;
+
+  final Map<GenericFunctionTypeElement, int> _genericFunctionTypes =
+      Map.identity();
+  int _nextGenericFunctionTypeId = 1;
+
   LinkingBundleContext(this.dynamicReference);
 
+  int idOfGenericFunctionType(GenericFunctionTypeElement element) {
+    return _genericFunctionTypes[element];
+  }
+
+  int idOfTypeParameter(TypeParameterElement element) {
+    return _typeParameters[element];
+  }
+
+  int indexOfElement(Element element) {
+    if (element == null) return 0;
+    assert(element is! Member);
+
+    if (identical(element, DynamicElementImpl.instance)) {
+      return indexOfReference(dynamicReference);
+    }
+
+    var reference = (element as ElementImpl).reference;
+    return indexOfReference(reference);
+  }
+
   int indexOfReference(Reference reference) {
+    if (reference == null) return 0;
     if (reference.parent == null) return 0;
     if (reference.index != null) return reference.index;
 
@@ -42,6 +72,10 @@
     return reference.index;
   }
 
+  int nextGenericFunctionTypeId() {
+    return _nextGenericFunctionTypeId++;
+  }
+
   LinkedNodeTypeBuilder writeType(DartType type) {
     if (type == null) return null;
 
@@ -54,23 +88,31 @@
         kind: LinkedNodeTypeKind.dynamic_,
       );
     } else if (type is FunctionType) {
-      return LinkedNodeTypeBuilder(
-        kind: LinkedNodeTypeKind.function,
-        functionFormalParameters: _getReferences(type.parameters),
-        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(),
+        nullabilitySuffix: _nullabilitySuffix(type),
       );
     } else if (type is TypeParameterType) {
-      return LinkedNodeTypeBuilder(
-        kind: LinkedNodeTypeKind.typeParameter,
-        typeParameterParameter: _getReferenceIndex(type.element),
-      );
+      TypeParameterElementImpl element = type.element;
+      var id = _typeParameters[element];
+      if (id != null) {
+        return LinkedNodeTypeBuilder(
+          kind: LinkedNodeTypeKind.typeParameter,
+          nullabilitySuffix: _nullabilitySuffix(type),
+          typeParameterId: id,
+        );
+      } else {
+        var index = indexOfElement(element);
+        return LinkedNodeTypeBuilder(
+          kind: LinkedNodeTypeKind.typeParameter,
+          nullabilitySuffix: _nullabilitySuffix(type),
+          typeParameterElement: index,
+        );
+      }
     } else if (type is VoidType) {
       return LinkedNodeTypeBuilder(
         kind: LinkedNodeTypeKind.void_,
@@ -80,19 +122,86 @@
     }
   }
 
-  int _getReferenceIndex(Element element) {
-    if (element == null) return 0;
-
-    var reference = (element as ElementImpl).reference;
-    return indexOfReference(reference);
+  LinkedNodeFormalParameterKind _formalParameterKind(ParameterElement p) {
+    if (p.isRequiredPositional) {
+      return LinkedNodeFormalParameterKind.requiredPositional;
+    } else if (p.isRequiredNamed) {
+      return LinkedNodeFormalParameterKind.requiredNamed;
+    } else if (p.isOptionalPositional) {
+      return LinkedNodeFormalParameterKind.optionalPositional;
+    } else if (p.isOptionalNamed) {
+      return LinkedNodeFormalParameterKind.optionalNamed;
+    } else {
+      throw StateError('Unexpected parameter kind: $p');
+    }
   }
 
-  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);
+  FunctionType _toSyntheticFunctionType(FunctionType type) {
+    var typeParameters = type.typeFormals;
+
+    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);
+  }
+
+  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,
+      nullabilitySuffix: _nullabilitySuffix(type),
+    );
+
+    for (var typeParameter in typeParameters) {
+      _typeParameters.remove(typeParameter);
+      --_nextSyntheticTypeParameterId;
+    }
+
     return result;
   }
+
+  static EntityRefNullabilitySuffix _nullabilitySuffix(DartType type) {
+    var nullabilitySuffix = (type as TypeImpl).nullabilitySuffix;
+    switch (nullabilitySuffix) {
+      case NullabilitySuffix.question:
+        return EntityRefNullabilitySuffix.question;
+      case NullabilitySuffix.star:
+        return EntityRefNullabilitySuffix.starOrIrrelevant;
+      case NullabilitySuffix.none:
+        return EntityRefNullabilitySuffix.none;
+      default:
+        throw StateError('$nullabilitySuffix');
+    }
+  }
 }
diff --git a/analyzer/lib/src/summary2/linking_node_scope.dart b/analyzer/lib/src/summary2/linking_node_scope.dart
new file mode 100644
index 0000000..7617125
--- /dev/null
+++ b/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/analyzer/lib/src/summary2/metadata_resolver.dart b/analyzer/lib/src/summary2/metadata_resolver.dart
index 2030086..4705ec8 100644
--- a/analyzer/lib/src/summary2/metadata_resolver.dart
+++ b/analyzer/lib/src/summary2/metadata_resolver.dart
@@ -3,143 +3,182 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_ast_factory.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.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/generated/resolver.dart';
 import 'package:analyzer/src/summary2/ast_resolver.dart';
-import 'package:analyzer/src/summary2/builder/source_library_builder.dart';
 import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/reference.dart';
 
-class MetadataResolver {
-  AstResolver _astResolver;
+class MetadataResolver extends ThrowingAstVisitor<void> {
+  final Linker _linker;
+  final LibraryElement _libraryElement;
+  final CompilationUnitElement _unitElement;
 
-  MetadataResolver(Linker linker, Reference libraryRef) {
-    _astResolver = AstResolver(linker, libraryRef);
+  Scope scope;
+
+  MetadataResolver(this._linker, this._libraryElement, this._unitElement);
+
+  @override
+  void visitAnnotation(Annotation node) {
+    node.elementAnnotation = ElementAnnotationImpl(_unitElement);
+
+    var astResolver = AstResolver(_linker, _libraryElement, scope);
+    astResolver.resolve(node);
   }
 
-  void resolve(UnitBuilder unit) {
-    var unitDeclarations = unit.node.compilationUnit_declarations;
-    for (LinkedNodeBuilder unitDeclaration in unitDeclarations) {
-      var kind = unitDeclaration.kind;
-      if (_isAnnotatedNode(kind)) {
-        _annotatedNode(
-          unit,
-          unitDeclaration,
-        );
-      }
-      if (kind == LinkedNodeKind.classDeclaration) {
-        _class(unit, unitDeclaration);
-      } else if (kind == LinkedNodeKind.enumDeclaration) {
-        _enumDeclaration(unit, unitDeclaration);
-      } else if (kind == LinkedNodeKind.functionDeclaration) {
-        var function = unitDeclaration.functionDeclaration_functionExpression;
-        _formalParameterList(
-          unit,
-          function.functionExpression_formalParameters,
-        );
-      } else if (kind == LinkedNodeKind.topLevelVariableDeclaration) {
-        _variables(
-          unit,
-          unitDeclaration,
-          unitDeclaration.topLevelVariableDeclaration_variableList,
-        );
-      }
-    }
+  @override
+  void visitClassDeclaration(ClassDeclaration node) {
+    node.metadata.accept(this);
+    node.typeParameters?.accept(this);
+    node.members.accept(this);
   }
 
-  void _annotatedNode(UnitBuilder unit, LinkedNodeBuilder node) {
-    var unresolved = node.annotatedNode_metadata;
-    var resolved = _list(unit, unresolved);
-    node.annotatedNode_metadata = resolved;
+  @override
+  void visitClassTypeAlias(ClassTypeAlias node) {
+    node.metadata.accept(this);
+    node.typeParameters?.accept(this);
   }
 
-  void _class(UnitBuilder unit, LinkedNodeBuilder unitDeclaration) {
-    var members = unitDeclaration.classOrMixinDeclaration_members;
-    for (var classMember in members) {
-      var kind = classMember.kind;
-      if (_isAnnotatedNode(kind)) {
-        _annotatedNode(unit, classMember);
-      }
-      if (kind == LinkedNodeKind.fieldDeclaration) {
-        _variables(
-          unit,
-          classMember,
-          classMember.fieldDeclaration_fields,
-        );
-      } else if (kind == LinkedNodeKind.methodDeclaration) {
-        _formalParameterList(
-          unit,
-          classMember.methodDeclaration_formalParameters,
-        );
-      }
-    }
+  @override
+  void visitCompilationUnit(CompilationUnit node) {
+    node.directives.accept(this);
+    node.declarations.accept(this);
   }
 
-  void _enumDeclaration(UnitBuilder unit, LinkedNodeBuilder node) {
-    for (var constant in node.enumDeclaration_constants) {
-      var kind = constant.kind;
-      if (kind == LinkedNodeKind.enumConstantDeclaration) {
-        _annotatedNode(unit, constant);
-      }
-    }
+  @override
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
+    node.metadata.accept(this);
+    node.parameters.accept(this);
   }
 
-  void _formalParameterList(UnitBuilder unit, LinkedNodeBuilder node) {
-    if (node == null) return;
-
-    for (var parameter in node.formalParameterList_parameters) {
-      if (parameter.kind == LinkedNodeKind.defaultFormalParameter) {
-        var actual = parameter.defaultFormalParameter_parameter;
-        var unresolved = actual.normalFormalParameter_metadata;
-        var resolved = _list(unit, unresolved);
-        actual.normalFormalParameter_metadata = resolved;
-      } else {
-        var unresolved = parameter.normalFormalParameter_metadata;
-        var resolved = _list(unit, unresolved);
-        parameter.normalFormalParameter_metadata = resolved;
-      }
-    }
+  @override
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
+    node.parameter.accept(this);
   }
 
-  List<LinkedNodeBuilder> _list(UnitBuilder unit, List<LinkedNode> unresolved) {
-    var resolved = List<LinkedNodeBuilder>(unresolved.length);
-    for (var i = 0; i < unresolved.length; ++i) {
-      var unresolvedNode = unresolved[i];
-
-      var reader = AstBinaryReader(unit.context);
-      var ast = reader.readNode(unresolvedNode) as Annotation;
-      ast.elementAnnotation = ElementAnnotationImpl(null);
-
-      // Set some parent, so that resolver does not bail out.
-      astFactory.libraryDirective(null, [ast], null, null, null);
-
-      var resolvedNode = _astResolver.resolve(unit, ast);
-      resolved[i] = resolvedNode;
-    }
-    return resolved;
+  @override
+  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    node.metadata.accept(this);
   }
 
-  /// Resolve annotations of the [declaration] (field or top-level variable),
-  /// and set them as metadata for each variable in the [variableList].
-  void _variables(UnitBuilder unit, LinkedNodeBuilder declaration,
-      LinkedNodeBuilder variableList) {
-    for (var variable in variableList.variableDeclarationList_variables) {
-      var unresolved = declaration.annotatedNode_metadata;
-      var resolved = _list(unit, unresolved);
-      variable.annotatedNode_metadata = resolved;
-    }
+  @override
+  void visitEnumDeclaration(EnumDeclaration node) {
+    node.metadata.accept(this);
+    node.constants.accept(this);
   }
 
-  static bool _isAnnotatedNode(LinkedNodeKind kind) {
-    return kind == LinkedNodeKind.classDeclaration ||
-        kind == LinkedNodeKind.classTypeAlias ||
-        kind == LinkedNodeKind.constructorDeclaration ||
-        kind == LinkedNodeKind.enumDeclaration ||
-        kind == LinkedNodeKind.functionDeclaration ||
-        kind == LinkedNodeKind.functionTypeAlias ||
-        kind == LinkedNodeKind.methodDeclaration;
+  @override
+  void visitExportDirective(ExportDirective node) {
+    node.metadata.accept(this);
+  }
+
+  @override
+  void visitFieldDeclaration(FieldDeclaration node) {
+    node.metadata.accept(this);
+  }
+
+  @override
+  void visitFieldFormalParameter(FieldFormalParameter node) {
+    node.metadata.accept(this);
+    node.parameters?.accept(this);
+  }
+
+  @override
+  void visitFormalParameterList(FormalParameterList node) {
+    node.parameters.accept(this);
+  }
+
+  @override
+  void visitFunctionDeclaration(FunctionDeclaration node) {
+    node.metadata.accept(this);
+    node.functionExpression.accept(this);
+  }
+
+  @override
+  void visitFunctionExpression(FunctionExpression node) {
+    node.typeParameters?.accept(this);
+    node.parameters?.accept(this);
+  }
+
+  @override
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
+    node.metadata.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters.accept(this);
+  }
+
+  @override
+  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    node.metadata.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters.accept(this);
+  }
+
+  @override
+  void visitGenericFunctionType(GenericFunctionType node) {
+    node.typeParameters?.accept(this);
+    node.parameters.accept(this);
+  }
+
+  @override
+  void visitGenericTypeAlias(GenericTypeAlias node) {
+    node.metadata.accept(this);
+    node.typeParameters?.accept(this);
+    node.functionType?.accept(this);
+  }
+
+  @override
+  void visitImportDirective(ImportDirective node) {
+    node.metadata.accept(this);
+  }
+
+  @override
+  void visitLibraryDirective(LibraryDirective node) {
+    node.metadata.accept(this);
+  }
+
+  @override
+  void visitMethodDeclaration(MethodDeclaration node) {
+    node.metadata.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters?.accept(this);
+  }
+
+  @override
+  void visitMixinDeclaration(MixinDeclaration node) {
+    node.metadata.accept(this);
+    node.typeParameters?.accept(this);
+    node.members.accept(this);
+  }
+
+  @override
+  void visitPartDirective(PartDirective node) {
+    node.metadata.accept(this);
+  }
+
+  @override
+  void visitPartOfDirective(PartOfDirective node) {
+    node.metadata.accept(this);
+  }
+
+  @override
+  void visitSimpleFormalParameter(SimpleFormalParameter node) {
+    node.metadata.accept(this);
+  }
+
+  @override
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    node.metadata.accept(this);
+  }
+
+  @override
+  void visitTypeParameter(TypeParameter node) {
+    node.metadata.accept(this);
+  }
+
+  @override
+  void visitTypeParameterList(TypeParameterList node) {
+    node.typeParameters.accept(this);
   }
 }
diff --git a/analyzer/lib/src/summary2/named_type_builder.dart b/analyzer/lib/src/summary2/named_type_builder.dart
new file mode 100644
index 0000000..003f614
--- /dev/null
+++ b/analyzer/lib/src/summary2/named_type_builder.dart
@@ -0,0 +1,236 @@
+// 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/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/dart/element/type_algebra.dart';
+import 'package:analyzer/src/summary2/type_builder.dart';
+
+/// The type builder for a [TypeName].
+class NamedTypeBuilder extends TypeBuilder {
+  static DynamicTypeImpl get _dynamicType => DynamicTypeImpl.instance;
+
+  final Element element;
+  final List<DartType> arguments;
+  final NullabilitySuffix nullabilitySuffix;
+
+  /// The node for which this builder is created, or `null` if the builder
+  /// was detached from its node, e.g. during computing default types for
+  /// type parameters.
+  final TypeName node;
+
+  /// The actual built type, not a [TypeBuilder] anymore.
+  ///
+  /// When [build] is called, the type is built, stored into this field,
+  /// and set for the [node].
+  DartType _type;
+
+  NamedTypeBuilder(this.element, this.arguments, this.nullabilitySuffix,
+      {this.node});
+
+  factory NamedTypeBuilder.of(
+    TypeName node,
+    Element element,
+    NullabilitySuffix nullabilitySuffix,
+  ) {
+    List<DartType> arguments;
+    var argumentList = node.typeArguments;
+    if (argumentList != null) {
+      arguments = argumentList.arguments.map((n) => n.type).toList();
+    } else {
+      arguments = <DartType>[];
+    }
+
+    return NamedTypeBuilder(element, arguments, nullabilitySuffix, node: node);
+  }
+
+  @override
+  DartType build() {
+    if (_type != null) {
+      return _type;
+    }
+
+    var element = this.element;
+    if (element is ClassElement) {
+      var parameters = element.typeParameters;
+      if (parameters.isEmpty) {
+        var rawType = element.type;
+        _type = (rawType as TypeImpl).withNullability(nullabilitySuffix);
+      } else {
+        var arguments = _buildArguments(parameters);
+        _type = InterfaceTypeImpl.explicit(
+          element,
+          arguments,
+          nullabilitySuffix: nullabilitySuffix,
+        );
+      }
+    } else if (element is GenericTypeAliasElement) {
+      // Break a possible recursion.
+      _type = _dynamicType;
+
+      var rawType = _getRawFunctionType(element);
+
+      var parameters = element.typeParameters;
+      if (parameters.isEmpty) {
+        _type = rawType;
+      } else {
+        var arguments = _buildArguments(parameters);
+        var substitution = Substitution.fromPairs(parameters, arguments);
+        _type = substitution.substituteType(rawType);
+      }
+    } else if (element is TypeParameterElement) {
+      _type = TypeParameterTypeImpl(element);
+    } else {
+      _type = _dynamicType;
+    }
+
+    node?.type = _type;
+    return _type;
+  }
+
+  @override
+  String toString() {
+    var buffer = StringBuffer();
+    buffer.write(element.displayName);
+    if (arguments.isNotEmpty) {
+      buffer.write('<');
+      buffer.write(arguments.join(', '));
+      buffer.write('>');
+    }
+    return buffer.toString();
+  }
+
+  /// Build arguments that correspond to the type [parameters].
+  List<DartType> _buildArguments(List<TypeParameterElement> parameters) {
+    if (arguments.isNotEmpty) {
+      if (arguments.length == parameters.length) {
+        var result = List<DartType>(parameters.length);
+        for (int i = 0; i < result.length; ++i) {
+          var type = arguments[i];
+          result[i] = _buildType(type);
+        }
+        return result;
+      } else {
+        return _listOfDynamic(parameters.length);
+      }
+    } else {
+      var result = List<DartType>(parameters.length);
+      for (int i = 0; i < result.length; ++i) {
+        TypeParameterElementImpl parameter = parameters[i];
+        var defaultType = parameter.defaultType;
+        defaultType = _buildType(defaultType);
+        result[i] = defaultType;
+      }
+      return result;
+    }
+  }
+
+  DartType _buildFormalParameterType(FormalParameter node) {
+    if (node is DefaultFormalParameter) {
+      return _buildFormalParameterType(node.parameter);
+    } else if (node is FunctionTypedFormalParameter) {
+      return _buildFunctionType(
+        node.typeParameters,
+        node.returnType,
+        node.parameters,
+      );
+    } else if (node is SimpleFormalParameter) {
+      return _buildNodeType(node.type);
+    } else {
+      throw UnimplementedError('(${node.runtimeType}) $node');
+    }
+  }
+
+  FunctionType _buildFunctionType(
+    TypeParameterList typeParameterList,
+    TypeAnnotation returnTypeNode,
+    FormalParameterList parameterList,
+  ) {
+    var returnType = _buildNodeType(returnTypeNode);
+
+    List<TypeParameterElement> typeParameters;
+    if (typeParameterList != null) {
+      typeParameters = typeParameterList.typeParameters
+          .map<TypeParameterElement>((p) => p.declaredElement)
+          .toList();
+    } else {
+      typeParameters = const <TypeParameterElement>[];
+    }
+
+    var formalParameters = parameterList.parameters.map((parameter) {
+      return ParameterElementImpl.synthetic(
+        parameter.identifier?.name ?? '',
+        _buildFormalParameterType(parameter),
+        // ignore: deprecated_member_use_from_same_package
+        parameter.kind,
+      );
+    }).toList();
+
+    return FunctionTypeImpl.synthetic(
+      returnType,
+      typeParameters,
+      formalParameters,
+    );
+  }
+
+  DartType _buildNodeType(TypeAnnotation node) {
+    if (node == null) {
+      return _dynamicType;
+    } else {
+      return _buildType(node.type);
+    }
+  }
+
+  /// If the [type] is a [TypeBuilder], build it; otherwise return as is.
+  DartType _buildType(DartType type) {
+    if (type is TypeBuilder) {
+      return type.build();
+    } else {
+      return type;
+    }
+  }
+
+  DartType _getRawFunctionType(GenericTypeAliasElementImpl element) {
+    // If the element is not being linked, there is no reason (or a way,
+    // because the linked node might be read only partially) to go through
+    // its node - all its types have already been built.
+    if (!element.linkedContext.isLinking) {
+      var function = element.function;
+      if (function != null) {
+        return function.type;
+      } else {
+        return _dynamicType;
+      }
+    }
+
+    var typedefNode = element.linkedNode;
+    if (typedefNode is FunctionTypeAlias) {
+      return _buildFunctionType(
+        null,
+        typedefNode.returnType,
+        typedefNode.parameters,
+      );
+    } else if (typedefNode is GenericTypeAlias) {
+      var functionNode = typedefNode.functionType;
+      if (functionNode != null) {
+        return _buildFunctionType(
+          functionNode.typeParameters,
+          functionNode.returnType,
+          functionNode.parameters,
+        );
+      } else {
+        return _dynamicType;
+      }
+    } else {
+      throw StateError('(${element.runtimeType}) $element');
+    }
+  }
+
+  static List<DartType> _listOfDynamic(int length) {
+    return List<DartType>.filled(length, _dynamicType);
+  }
+}
diff --git a/analyzer/lib/src/summary2/reference.dart b/analyzer/lib/src/summary2/reference.dart
index c89239d..95c0ae7 100644
--- a/analyzer/lib/src/summary2/reference.dart
+++ b/analyzer/lib/src/summary2/reference.dart
@@ -1,9 +1,11 @@
-// Copyright (c) 2019, 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.
 
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary2/scope.dart';
 
 /// Indirection between a name and the corresponding [Element].
 ///
@@ -34,6 +36,9 @@
   /// The corresponding [LinkedNode], or `null` if a named container.
   LinkedNode node;
 
+  /// The corresponding [AstNode], or `null` if a named container.
+  AstNode node2;
+
   /// The corresponding [Element], or `null` if a named container.
   Element element;
 
@@ -42,19 +47,29 @@
 
   Map<String, Reference> _children;
 
+  /// If this reference is an import prefix, the scope of this prefix.
+  Scope prefixScope;
+
   Reference.root() : this._(null, '');
 
   Reference._(this.parent, this.name);
 
+  Iterable<Reference> get children {
+    if (_children != null) {
+      return _children.values;
+    }
+    return const [];
+  }
+
   bool get isClass => parent != null && parent.name == '@class';
 
+  bool get isDynamic => name == 'dynamic' && parent?.name == 'dart:core';
+
   bool get isEnum => parent != null && parent.name == '@enum';
 
-  bool get isGenericTypeAlias => parent != null && parent.name == '@typeAlias';
+  bool get isPrefix => parent != null && parent.name == '@prefix';
 
-  bool get isTypeParameter => parent != null && parent.name == '@typeParameter';
-
-  int get numOfChildren => _children != null ? _children.length : 0;
+  bool get isTypeAlias => parent != null && parent.name == '@typeAlias';
 
   /// Return the child with the given name, or `null` if does not exist.
   Reference operator [](String name) {
@@ -67,5 +82,20 @@
     return map[name] ??= new Reference._(this, name);
   }
 
+  /// If the reference has element, and it is for the [node], return `true`.
+  ///
+  /// The element might be not `null`, but the node is different in case of
+  /// duplicate declarations.
+  bool hasElementFor(AstNode node) {
+    if (element != null && node2 == node) {
+      return true;
+    } else {
+      if (node2 == null) {
+        node2 = node;
+      }
+      return false;
+    }
+  }
+
   String toString() => parent == null ? 'root' : '$parent::$name';
 }
diff --git a/analyzer/lib/src/summary2/reference_resolver.dart b/analyzer/lib/src/summary2/reference_resolver.dart
index f044c1b..74b8547 100644
--- a/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/analyzer/lib/src/summary2/reference_resolver.dart
@@ -2,13 +2,509 @@
 // for 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/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+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/element/type.dart';
+import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/summary2/builder/source_library_builder.dart';
-import 'package:analyzer/src/summary2/declaration.dart';
+import 'package:analyzer/src/summary2/function_type_builder.dart';
+import 'package:analyzer/src/summary2/lazy_ast.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/named_type_builder.dart';
 import 'package:analyzer/src/summary2/reference.dart';
-import 'package:analyzer/src/summary2/scope.dart';
+import 'package:analyzer/src/summary2/types_builder.dart';
+
+//class ReferenceResolver {
+//  final LinkingBundleContext linkingBundleContext;
+//  final TypesToBuild typesToBuild;
+//  final UnitBuilder unit;
+//
+//  /// TODO(scheglov) Update scope with local scopes (formal / type parameters).
+//  Scope scope;
+//
+//  Reference reference;
+//
+//  ReferenceResolver(
+//    this.linkingBundleContext,
+//    this.typesToBuild,
+//    this.unit,
+//    this.scope,
+//    this.reference,
+//  );
+//
+//  LinkedNodeTypeBuilder get _dynamicType {
+//    return LinkedNodeTypeBuilder(
+//      kind: LinkedNodeTypeKind.dynamic_,
+//    );
+//  }
+//
+//  void resolve() {
+//    _node(unit.node);
+//  }
+//
+//  void _classDeclaration(LinkedNodeBuilder node) {
+//    var name = unit.context.getUnitMemberName(node);
+//    reference = reference.getChild('@class').getChild(name);
+//
+//    var typeParameters = node.classOrMixinDeclaration_typeParameters;
+//    _withTypeParameters(typeParameters, () {
+//      _extendsClause(node.classDeclaration_extendsClause);
+//      _withClause(node.classDeclaration_withClause);
+//      _implementsClause(node.classOrMixinDeclaration_implementsClause);
+//
+//      for (var member in node.classOrMixinDeclaration_members) {
+//        if (member.kind != LinkedNodeKind.constructorDeclaration) {
+//          _node(member);
+//        }
+//      }
+//      for (var member in node.classOrMixinDeclaration_members) {
+//        if (member.kind == LinkedNodeKind.constructorDeclaration) {
+//          _node(member);
+//        }
+//      }
+//    });
+//
+//    reference = reference.parent.parent;
+//  }
+//
+//  void _classTypeAlias(LinkedNodeBuilder node) {
+//    var name = unit.context.getUnitMemberName(node);
+//    reference = reference.getChild('@class').getChild(name);
+//
+//    var typeParameters = node.classTypeAlias_typeParameters;
+//    _withTypeParameters(typeParameters, () {
+//      _typeName(node.classTypeAlias_superclass);
+//      _withClause(node.classTypeAlias_withClause);
+//      _implementsClause(node.classTypeAlias_implementsClause);
+//    });
+//
+//    reference = reference.parent.parent;
+//  }
+//
+//  void _compilationUnit(LinkedNodeBuilder node) {
+//    _nodeList(node.compilationUnit_directives);
+//    _nodeList(node.compilationUnit_declarations);
+//  }
+//
+//  void _constructorDeclaration(LinkedNodeBuilder node) {
+//    _node(node.constructorDeclaration_parameters);
+//  }
+//
+//  void _enumConstantDeclaration(LinkedNodeBuilder node) {}
+//
+//  void _enumDeclaration(LinkedNodeBuilder node) {
+//    _nodeList(node.enumDeclaration_constants);
+//  }
+//
+//  void _exportDirective(LinkedNodeBuilder node) {}
+//
+//  void _extendsClause(LinkedNodeBuilder node) {
+//    if (node == null) return;
+//
+//    _typeName(node.extendsClause_superclass);
+//  }
+//
+//  void _fieldDeclaration(LinkedNodeBuilder node) {
+//    _node(node.fieldDeclaration_fields);
+//  }
+//
+//  void _fieldFormalParameter(LinkedNodeBuilder node) {
+//    var typeNode = node.fieldFormalParameter_type;
+//    if (typeNode != null) {
+//      _node(typeNode);
+//    }
+//
+//    var formalParameters = node.fieldFormalParameter_formalParameters;
+//    if (formalParameters != null) {
+//      _formalParameters(formalParameters);
+//    }
+//
+//    if (typeNode != null || formalParameters != null) {
+//      typesToBuild.declarations.add(node);
+//    }
+//  }
+//
+//  void _formalParameters(LinkedNodeBuilder node) {
+//    for (var parameter in node.formalParameterList_parameters) {
+//      _node(parameter);
+//    }
+//  }
+//
+//  void _functionDeclaration(LinkedNodeBuilder node) {
+//    var name = unit.context.getUnitMemberName(node);
+//    reference = reference.getChild('@function').getChild(name);
+//
+//    var function = node.functionDeclaration_functionExpression;
+//    var typeParameters = function.functionExpression_typeParameters;
+//    _withTypeParameters(typeParameters, () {
+//      var returnType = node.functionDeclaration_returnType;
+//      if (returnType != null) {
+//        _node(returnType);
+//        typesToBuild.declarations.add(node);
+//      } else {
+//        node.functionDeclaration_returnType2 = _dynamicType;
+//      }
+//
+//      _node(function.functionExpression_formalParameters);
+//    });
+//
+//    reference = reference.parent.parent;
+//  }
+//
+//  void _functionExpression(LinkedNodeBuilder node) {
+//    var typeParameters = node.functionExpression_typeParameters;
+//    _withTypeParameters(typeParameters, () {
+//      _node(node.functionExpression_formalParameters);
+//    });
+//  }
+//
+//  void _functionTypeAlias(LinkedNodeBuilder node) {
+//    var name = unit.context.getUnitMemberName(node);
+//    reference = reference.getChild('@typeAlias').getChild(name);
+//
+//    var typeParameters = node.functionTypeAlias_typeParameters;
+//    _withTypeParameters(typeParameters, () {
+//      var returnType = node.functionTypeAlias_returnType;
+//      if (returnType != null) {
+//        _node(returnType);
+//        typesToBuild.declarations.add(node);
+//      } else {
+//        node.functionTypeAlias_returnType2 = _dynamicType;
+//      }
+//
+//      _node(node.functionTypeAlias_formalParameters);
+//    });
+//
+//    reference = reference.parent.parent;
+//  }
+//
+//  void _functionTypedFormalParameter(LinkedNodeBuilder node) {
+//    var typeParameters = node.functionTypedFormalParameter_typeParameters;
+//    _withTypeParameters(typeParameters, () {
+//      var typeNode = node.functionTypedFormalParameter_returnType;
+//      if (typeNode != null) {
+//        _node(typeNode);
+//      }
+//
+//      _formalParameters(node.functionTypedFormalParameter_formalParameters);
+//      typesToBuild.declarations.add(node);
+//    });
+//  }
+//
+//  void _genericFunctionType(LinkedNodeBuilder node) {
+//    reference = reference.getChild('@function');
+//
+//    var name = '${reference.numOfChildren}';
+//    reference = reference.getChild(name);
+//
+//    var typeParameters = node.genericFunctionType_typeParameters;
+//    _withTypeParameters(typeParameters, () {
+//      var returnType = node.genericFunctionType_returnType;
+//      if (returnType != null) {
+//        _node(returnType);
+//        typesToBuild.declarations.add(node);
+//      }
+//
+//      _formalParameters(node.genericFunctionType_formalParameters);
+//
+//      typesToBuild.typeAnnotations.add(node);
+//    });
+//
+//    reference = reference.parent.parent;
+//  }
+//
+//  void _genericTypeAlias(LinkedNodeBuilder node) {
+//    var name = unit.context.getSimpleName(
+//      node.namedCompilationUnitMember_name,
+//    );
+//    reference = reference.getChild('@typeAlias').getChild(name);
+//
+//    var typeParameters = node.genericTypeAlias_typeParameters;
+//    _withTypeParameters(typeParameters, () {
+//      _node(node.genericTypeAlias_functionType);
+//    });
+//
+//    reference = reference.parent.parent;
+//  }
+//
+//  void _implementsClause(LinkedNodeBuilder node) {
+//    if (node == null) return;
+//
+//    _typeNameList(node.implementsClause_interfaces);
+//  }
+//
+//  void _importDirective(LinkedNodeBuilder node) {}
+//
+//  void _libraryDirective(LinkedNodeBuilder node) {}
+//
+//  void _methodDeclaration(LinkedNodeBuilder node) {
+//    var name = unit.context.getMethodName(node);
+//    reference = reference.getChild('@method').getChild(name);
+//
+//    var typeParameters = node.methodDeclaration_typeParameters;
+//    _withTypeParameters(typeParameters, () {
+//      var returnType = node.methodDeclaration_returnType;
+//      if (returnType != null) {
+//        _node(returnType);
+//        typesToBuild.declarations.add(node);
+//      }
+//
+//      _node(node.methodDeclaration_formalParameters);
+//    });
+//
+//    reference = reference.parent.parent;
+//  }
+//
+//  void _mixinDeclaration(LinkedNodeBuilder node) {
+//    var name = unit.context.getUnitMemberName(node);
+//    reference = reference.getChild('@class').getChild(name);
+//
+//    var typeParameters = node.classOrMixinDeclaration_typeParameters;
+//    _withTypeParameters(typeParameters, () {
+//      _onClause(node.mixinDeclaration_onClause);
+//      _implementsClause(node.classOrMixinDeclaration_implementsClause);
+//      _nodeList(node.classOrMixinDeclaration_members);
+//    });
+//
+//    reference = reference.parent.parent;
+//  }
+//
+//  void _node(LinkedNodeBuilder node) {
+//    if (node == null) return;
+//
+//    if (node.kind == LinkedNodeKind.classDeclaration) {
+//      _classDeclaration(node);
+//    } else if (node.kind == LinkedNodeKind.classTypeAlias) {
+//      _classTypeAlias(node);
+//    } else if (node.kind == LinkedNodeKind.compilationUnit) {
+//      _compilationUnit(node);
+//    } else if (node.kind == LinkedNodeKind.constructorDeclaration) {
+//      _constructorDeclaration(node);
+//    } else if (node.kind == LinkedNodeKind.defaultFormalParameter) {
+//      _node(node.defaultFormalParameter_parameter);
+//    } else if (node.kind == LinkedNodeKind.enumDeclaration) {
+//      _enumDeclaration(node);
+//    } else if (node.kind == LinkedNodeKind.enumConstantDeclaration) {
+//      _enumConstantDeclaration(node);
+//    } else if (node.kind == LinkedNodeKind.exportDirective) {
+//      _exportDirective(node);
+//    } else if (node.kind == LinkedNodeKind.fieldDeclaration) {
+//      _fieldDeclaration(node);
+//    } else if (node.kind == LinkedNodeKind.fieldFormalParameter) {
+//      _fieldFormalParameter(node);
+//    } else if (node.kind == LinkedNodeKind.formalParameterList) {
+//      _formalParameters(node);
+//    } else if (node.kind == LinkedNodeKind.functionDeclaration) {
+//      _functionDeclaration(node);
+//    } else if (node.kind == LinkedNodeKind.functionExpression) {
+//      _functionExpression(node);
+//    } else if (node.kind == LinkedNodeKind.functionTypeAlias) {
+//      _functionTypeAlias(node);
+//    } else if (node.kind == LinkedNodeKind.functionTypedFormalParameter) {
+//      _functionTypedFormalParameter(node);
+//    } else if (node.kind == LinkedNodeKind.genericFunctionType) {
+//      _genericFunctionType(node);
+//    } else if (node.kind == LinkedNodeKind.genericTypeAlias) {
+//      _genericTypeAlias(node);
+//    } else if (node.kind == LinkedNodeKind.importDirective) {
+//      _importDirective(node);
+//    } else if (node.kind == LinkedNodeKind.libraryDirective) {
+//      _libraryDirective(node);
+//    } else if (node.kind == LinkedNodeKind.methodDeclaration) {
+//      _methodDeclaration(node);
+//    } else if (node.kind == LinkedNodeKind.mixinDeclaration) {
+//      _mixinDeclaration(node);
+//    } else if (node.kind == LinkedNodeKind.partDirective) {
+//      _partDirective(node);
+//    } else if (node.kind == LinkedNodeKind.partOfDirective) {
+//      _partOfDirective(node);
+//    } else if (node.kind == LinkedNodeKind.simpleFormalParameter) {
+//      _simpleFormalParameter(node);
+//    } else if (node.kind == LinkedNodeKind.topLevelVariableDeclaration) {
+//      _topLevelVariableDeclaration(node);
+//    } else if (node.kind == LinkedNodeKind.typeArgumentList) {
+//      _typeArgumentList(node);
+//    } else if (node.kind == LinkedNodeKind.typeName) {
+//      _typeName(node);
+//    } else if (node.kind == LinkedNodeKind.typeParameter) {
+//      _typeParameter(node);
+//    } else if (node.kind == LinkedNodeKind.typeParameterList) {
+//      _typeParameterList(node);
+//    } else if (node.kind == LinkedNodeKind.variableDeclarationList) {
+//      _variableDeclarationList(node);
+//    } else {
+//      // TODO(scheglov) implement
+//      throw UnimplementedError('${node.kind}');
+//    }
+//  }
+//
+//  void _nodeList(List<LinkedNode> nodeList) {
+//    if (nodeList == null) return;
+//
+//    for (var i = 0; i < nodeList.length; ++i) {
+//      var node = nodeList[i];
+//      _node(node);
+//    }
+//  }
+//
+//  void _onClause(LinkedNodeBuilder node) {
+//    if (node == null) return;
+//
+//    _typeNameList(node.onClause_superclassConstraints);
+//  }
+//
+//  void _partDirective(LinkedNodeBuilder node) {}
+//
+//  void _partOfDirective(LinkedNodeBuilder node) {}
+//
+//  void _setSimpleElement(LinkedNodeBuilder identifier, Reference reference) {
+//    var referenceIndex = linkingBundleContext.indexOfReference(reference);
+//    identifier.simpleIdentifier_element = referenceIndex;
+//  }
+//
+//  void _simpleFormalParameter(LinkedNodeBuilder node) {
+//    var typeNode = node.simpleFormalParameter_type;
+//    if (typeNode != null) {
+//      _node(typeNode);
+//      typesToBuild.declarations.add(node);
+//    } else {
+//      // TODO(scheglov) might be inferred
+//      node.simpleFormalParameter_type2 = _dynamicType;
+//    }
+//
+//    if (node.normalFormalParameter_covariantKeyword != 0) {
+//      node.normalFormalParameter_isCovariant = true;
+//    } else {
+//      // TODO(scheglov) might be inferred
+//    }
+//  }
+//
+//  void _topLevelVariableDeclaration(LinkedNodeBuilder node) {
+//    _node(node.topLevelVariableDeclaration_variableList);
+//  }
+//
+//  void _typeArgumentList(LinkedNodeBuilder node) {
+//    for (var typeArgument in node.typeArgumentList_arguments) {
+//      _typeName(typeArgument);
+//    }
+//  }
+//
+//  void _typeName(LinkedNodeBuilder node) {
+//    if (node == null) return;
+//
+//    var identifier = node.typeName_name;
+//    Reference reference;
+//
+//    if (identifier.kind == LinkedNodeKind.simpleIdentifier) {
+//      var name = unit.context.getSimpleName(identifier);
+//
+//      if (name == 'void') {
+//        node.typeName_type = LinkedNodeTypeBuilder(
+//          kind: LinkedNodeTypeKind.void_,
+//        );
+//        return;
+//      }
+//
+//      reference = scope.lookup(name);
+//    } else {
+//      var prefixNode = identifier.prefixedIdentifier_prefix;
+//      var prefixName = unit.context.getSimpleName(prefixNode);
+//      var prefixReference = scope.lookup(prefixName);
+//      _setSimpleElement(prefixNode, prefixReference);
+//
+//      identifier = identifier.prefixedIdentifier_identifier;
+//      var name = unit.context.getSimpleName(identifier);
+//
+//      if (prefixReference != null && prefixReference.isPrefix) {
+//        var prefixScope = prefixReference.prefixScope;
+//        reference = prefixScope.lookup(name);
+//      } else {
+//        identifier.simpleIdentifier_element = 0;
+//        node.typeName_type = _dynamicType;
+//        return;
+//      }
+//    }
+//
+//    if (reference == null) {
+//      identifier.simpleIdentifier_element = 0;
+//      node.typeName_type = _dynamicType;
+//      return;
+//    }
+//
+//    _setSimpleElement(identifier, reference);
+//
+//    var typeArgumentList = node.typeName_typeArguments;
+//    if (typeArgumentList != null) {
+//      _node(typeArgumentList);
+//    }
+//
+//    typesToBuild.typeAnnotations.add(node);
+//  }
+//
+//  void _typeNameList(List<LinkedNode> nodeList) {
+//    for (var i = 0; i < nodeList.length; ++i) {
+//      var node = nodeList[i];
+//      _typeName(node);
+//    }
+//  }
+//
+//  void _typeParameter(LinkedNodeBuilder node) {
+//    _node(node.typeParameter_bound);
+//    // TODO(scheglov) set Object bound if no explicit?
+//  }
+//
+//  void _typeParameterList(LinkedNodeBuilder node) {
+//    for (var typeParameter in node.typeParameterList_typeParameters) {
+//      _node(typeParameter);
+//    }
+//  }
+//
+//  void _variableDeclarationList(LinkedNodeBuilder node) {
+//    var typeNode = node.variableDeclarationList_type;
+//    if (typeNode != null) {
+//      _node(typeNode);
+//      typesToBuild.declarations.add(node);
+//    }
+//  }
+//
+//  void _withClause(LinkedNodeBuilder node) {
+//    if (node == null) return;
+//
+//    _typeNameList(node.withClause_mixinTypes);
+//  }
+//
+//  /// Enter the type parameters scope, visit them, and run [f].
+//  void _withTypeParameters(LinkedNode typeParameterList, void f()) {
+//    if (typeParameterList == null) {
+//      f();
+//      return;
+//    }
+//
+//    scope = Scope(this.scope, {});
+//
+//    var containerRef = this.reference.getChild('@typeParameter');
+//    var typeParameters = typeParameterList.typeParameterList_typeParameters;
+//    for (var typeParameter in typeParameters) {
+//      var name = unit.context.getSimpleName(typeParameter.typeParameter_name);
+//      var reference = containerRef.getChild(name);
+//      reference.node = typeParameter;
+//      scope.declare(name, reference);
+//    }
+//
+//    _node(typeParameterList);
+//    f();
+//
+//    if (typeParameterList != null) {
+//      scope = scope.parent;
+//    }
+//  }
+//}
 
 /// Recursive visitor of [LinkedNode]s that resolves explicit type annotations
 /// in outlines.  This includes resolving element references in identifiers
@@ -19,445 +515,461 @@
 /// the corresponding type set (so, if there is an explicit type annotation,
 /// the type is set, otherwise we keep it empty, so we will attempt to infer
 /// it later).
-class ReferenceResolver {
-  final LinkingBundleContext linkingBundleContext;
-  final UnitBuilder unit;
-
-  /// TODO(scheglov) Update scope with local scopes (formal / type parameters).
-  Scope scope;
+class ReferenceResolver extends ThrowingAstVisitor<void> {
+  final LinkingBundleContext linkingContext;
+  final NodesToBuildType nodesToBuildType;
+  final LinkedElementFactory elementFactory;
+  final LibraryElement _libraryElement;
+  final Reference unitReference;
+  final bool nnbd;
 
   Reference reference;
+  Scope scope;
 
   ReferenceResolver(
-    this.linkingBundleContext,
-    this.unit,
+    this.linkingContext,
+    this.nodesToBuildType,
+    this.elementFactory,
+    this._libraryElement,
+    this.unitReference,
+    this.nnbd,
     this.scope,
-    this.reference,
-  );
+  ) : reference = unitReference;
 
-  LinkedNodeTypeBuilder get _dynamicType {
-    return LinkedNodeTypeBuilder(
-      kind: LinkedNodeTypeKind.dynamic_,
-    );
-  }
+  @override
+  void visitBlockFunctionBody(BlockFunctionBody node) {}
 
-  void resolve() {
-    _node(unit.node);
-  }
+  @override
+  void visitClassDeclaration(ClassDeclaration node) {
+    var outerScope = scope;
+    var outerReference = reference;
 
-  void _classDeclaration(LinkedNodeBuilder node) {
-    var name = unit.context.getUnitMemberName(node);
+    var name = node.name.name;
     reference = reference.getChild('@class').getChild(name);
 
-    var typeParameters = node.classOrMixinDeclaration_typeParameters;
-    _withTypeParameters(typeParameters, () {
-      var extendsClause = node.classDeclaration_extendsClause;
-      if (extendsClause != null) {
-        _typeName(extendsClause.extendsClause_superclass);
-      }
+    ClassElementImpl element = reference.element;
+    node.name.staticElement = element;
+    _createTypeParameterElements(node.typeParameters);
+    scope = new TypeParameterScope(scope, element);
+    scope = new ClassScope(scope, element);
+    LinkingNodeContext(node, scope);
 
-      _nodeList(
-        node.classDeclaration_withClause?.withClause_mixinTypes,
-      );
+    node.typeParameters?.accept(this);
+    node.extendsClause?.accept(this);
+    node.implementsClause?.accept(this);
+    node.withClause?.accept(this);
+    node.members.accept(this);
+    nodesToBuildType.addDeclaration(node);
 
-      _nodeList(
-        node.classOrMixinDeclaration_implementsClause
-            ?.implementsClause_interfaces,
-      );
-
-      for (var field in node.classOrMixinDeclaration_members) {
-        if (field.kind != LinkedNodeKind.constructorDeclaration) {
-          _node(field);
-        }
-      }
-      for (var field in node.classOrMixinDeclaration_members) {
-        if (field.kind == LinkedNodeKind.constructorDeclaration) {
-          _node(field);
-        }
-      }
-    });
-
-    reference = reference.parent.parent;
+    scope = outerScope;
+    reference = outerReference;
   }
 
-  void _classTypeAlias(LinkedNodeBuilder node) {
-    var name = unit.context.getUnitMemberName(node);
+  @override
+  void visitClassTypeAlias(ClassTypeAlias node) {
+    var outerScope = scope;
+    var outerReference = reference;
+
+    var name = node.name.name;
     reference = reference.getChild('@class').getChild(name);
 
-    var typeParameters = node.classTypeAlias_typeParameters;
-    _withTypeParameters(typeParameters, () {
-      var superclass = node.classTypeAlias_superclass;
-      if (superclass != null) {
-        _typeName(superclass);
-      }
+    ClassElementImpl element = reference.element;
+    node.name.staticElement = element;
+    _createTypeParameterElements(node.typeParameters);
+    scope = new TypeParameterScope(scope, element);
+    scope = new ClassScope(scope, element);
+    LinkingNodeContext(node, scope);
 
-      _nodeList(
-        node.classTypeAlias_withClause?.withClause_mixinTypes,
-      );
+    node.typeParameters?.accept(this);
+    node.superclass?.accept(this);
+    node.withClause?.accept(this);
+    node.implementsClause?.accept(this);
+    nodesToBuildType.addDeclaration(node);
 
-      _nodeList(
-        node.classTypeAlias_implementsClause?.implementsClause_interfaces,
-      );
-    });
-
-    reference = reference.parent.parent;
+    scope = outerScope;
+    reference = outerReference;
   }
 
-  void _compilationUnit(LinkedNodeBuilder node) {
-    _nodeList(node.compilationUnit_directives);
-    _nodeList(node.compilationUnit_declarations);
+  @override
+  void visitCompilationUnit(CompilationUnit node) {
+    LinkingNodeContext(node, scope);
+    node.declarations.accept(this);
   }
 
-  void _constructorDeclaration(LinkedNodeBuilder node) {
-    _node(node.constructorDeclaration_parameters);
-  }
+  @override
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
+    var outerScope = scope;
+    var outerReference = reference;
 
-  void _enumConstantDeclaration(LinkedNodeBuilder node) {}
+    var name = node.name?.name ?? '';
+    reference = reference.getChild('@constructor').getChild(name);
 
-  void _enumDeclaration(LinkedNodeBuilder node) {
-    _nodeList(node.enumDeclaration_constants);
-  }
-
-  void _fieldDeclaration(LinkedNodeBuilder node) {
-    _node(node.fieldDeclaration_fields);
-  }
-
-  void _fieldFormalParameter(LinkedNodeBuilder node) {
-    var typeNode = node.fieldFormalParameter_type;
-    if (typeNode != null) {
-      _node(typeNode);
-      node.fieldFormalParameter_type2 = _getTypeAnnotationType(typeNode);
-    }
-
-    var formalParameters = node.fieldFormalParameter_formalParameters;
-    if (formalParameters != null) {
-      _node(formalParameters);
-      throw 'incomplete';
-    }
-  }
-
-  void _formalParameters(LinkedNodeBuilder node) {
-    for (var parameter in node.formalParameterList_parameters) {
-      _node(parameter);
-    }
-  }
-
-  void _functionDeclaration(LinkedNodeBuilder node) {
-    var name = unit.context.getUnitMemberName(node);
-    reference = reference.getChild('@function').getChild(name);
-
-    var function = node.functionDeclaration_functionExpression;
-    var typeParameters = function.functionExpression_typeParameters;
-    _withTypeParameters(typeParameters, () {
-      var returnType = node.functionDeclaration_returnType;
-      if (returnType != null) {
-        _node(returnType);
-        node.functionDeclaration_returnType2 =
-            _getTypeAnnotationType(returnType);
-      } else {
-        node.functionDeclaration_returnType2 = _dynamicType;
-      }
-
-      _node(function.functionExpression_formalParameters);
-    });
-
-    reference = reference.parent.parent;
-  }
-
-  void _functionExpression(LinkedNodeBuilder node) {
-    var typeParameters = node.functionExpression_typeParameters;
-    _withTypeParameters(typeParameters, () {
-      _node(node.functionExpression_formalParameters);
-    });
-  }
-
-  void _functionTypeAlias(LinkedNodeBuilder node) {
-    var name = unit.context.getUnitMemberName(node);
-    reference = reference.getChild('@typeAlias').getChild(name);
-
-    var typeParameters = node.functionTypeAlias_typeParameters;
-    _withTypeParameters(typeParameters, () {
-      var returnType = node.functionTypeAlias_returnType;
-      if (returnType != null) {
-        _node(returnType);
-        node.functionTypeAlias_returnType2 = _getTypeAnnotationType(returnType);
-      } else {
-        node.functionTypeAlias_returnType2 = _dynamicType;
-      }
-
-      _node(node.functionTypeAlias_formalParameters);
-    });
-
-    reference = reference.parent.parent;
-  }
-
-  void _genericFunctionType(LinkedNodeBuilder node) {
-    reference = reference.getChild('@function');
-
-    var name = '${reference.numOfChildren}';
-    reference = reference.getChild(name);
-
-    var typeParameters = node.genericFunctionType_typeParameters;
-    _withTypeParameters(typeParameters, () {
-      var returnType = node.genericFunctionType_returnType;
-      if (returnType != null) {
-        _node(returnType);
-        node.genericFunctionType_returnType2 =
-            _getTypeAnnotationType(returnType);
-      } else {
-        node.genericFunctionType_returnType2 = _dynamicType;
-      }
-
-      _node(node.genericFunctionType_formalParameters);
-    });
-
-    reference = reference.parent.parent;
-  }
-
-  void _genericTypeAlias(LinkedNodeBuilder node) {
-    var name = unit.context.getSimpleName(
-      node.namedCompilationUnitMember_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
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
+    node.parameter.accept(this);
+  }
+
+  @override
+  void visitEnumDeclaration(EnumDeclaration node) {}
+
+  @override
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {}
+
+  @override
+  void visitExtendsClause(ExtendsClause node) {
+    node.superclass.accept(this);
+  }
+
+  @override
+  void visitFieldDeclaration(FieldDeclaration node) {
+    node.fields.accept(this);
+  }
+
+  @override
+  void visitFieldFormalParameter(FieldFormalParameter node) {
+    node.type?.accept(this);
+    node.parameters?.accept(this);
+    nodesToBuildType.addDeclaration(node);
+  }
+
+  @override
+  void visitFormalParameterList(FormalParameterList node) {
+    node.parameters.accept(this);
+  }
+
+  @override
+  void visitFunctionDeclaration(FunctionDeclaration node) {
+    var outerScope = scope;
+    var outerReference = reference;
+
+    var container = '@function';
+    var propertyKeyword = node.propertyKeyword?.keyword;
+    if (propertyKeyword == Keyword.GET) {
+      container = '@getter';
+    } else if (propertyKeyword == Keyword.SET) {
+      container = '@setter';
+    }
+
+    var name = node.name.name;
+    reference = reference.getChild(container).getChild(name);
+
+    ExecutableElementImpl element = reference.element;
+    node.name.staticElement = element;
+    _createTypeParameterElements(node.functionExpression.typeParameters);
+    scope = new FunctionScope(scope, element);
+    LinkingNodeContext(node, scope);
+
+    node.returnType?.accept(this);
+    node.functionExpression.accept(this);
+    nodesToBuildType.addDeclaration(node);
+
+    scope = outerScope;
+    reference = outerReference;
+  }
+
+  @override
+  void visitFunctionExpression(FunctionExpression node) {
+    node.typeParameters?.accept(this);
+    node.parameters?.accept(this);
+  }
+
+  @override
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
+    var outerScope = scope;
+    var outerReference = reference;
+
+    var name = node.name.name;
     reference = reference.getChild('@typeAlias').getChild(name);
 
-    var typeParameters = node.genericTypeAlias_typeParameters;
-    _withTypeParameters(typeParameters, () {
-      _node(node.genericTypeAlias_functionType);
-    });
+    GenericTypeAliasElementImpl element = reference.element;
+    node.name.staticElement = element;
+    _createTypeParameterElements(node.typeParameters);
+    scope = FunctionTypeScope(outerScope, element);
 
-    reference = reference.parent.parent;
+    node.returnType?.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters.accept(this);
+    nodesToBuildType.addDeclaration(node);
+
+    scope = outerScope;
+    reference = outerReference;
   }
 
-  LinkedNodeTypeBuilder _getTypeAnnotationType(LinkedNodeBuilder node) {
-    var kind = node.kind;
-    if (kind == LinkedNodeKind.typeName) {
-      return node.typeName_type;
-    } else {
-      throw UnimplementedError('$kind');
-    }
-  }
+  @override
+  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    var outerScope = scope;
+    var outerReference = reference;
 
-  void _importDirective(LinkedNodeBuilder node) {}
+    var name = node.identifier.name;
+    reference = reference.getChild('@parameter').getChild(name);
+    reference.node2 = node;
 
-  void _libraryDirective(LinkedNodeBuilder node) {}
+    var element = ParameterElementImpl.forLinkedNode(
+      outerReference.element,
+      reference,
+      node,
+    );
+    node.identifier.staticElement = element;
+    _createTypeParameterElements(node.typeParameters);
 
-  void _methodDeclaration(LinkedNodeBuilder node) {
-    var name = unit.context.getMethodName(node);
-    reference = reference.getChild('@method').getChild(name);
-
-    var typeParameters = node.methodDeclaration_typeParameters;
-    _withTypeParameters(typeParameters, () {
-      var returnType = node.methodDeclaration_returnType;
-      if (returnType != null) {
-        _node(returnType);
-        node.methodDeclaration_returnType2 = _getTypeAnnotationType(returnType);
-      }
-
-      _node(node.methodDeclaration_formalParameters);
-    });
-
-    reference = reference.parent.parent;
-  }
-
-  void _node(LinkedNodeBuilder node) {
-    if (node == null) return;
-
-    if (node.kind == LinkedNodeKind.classDeclaration) {
-      _classDeclaration(node);
-    } else if (node.kind == LinkedNodeKind.classTypeAlias) {
-      _classTypeAlias(node);
-    } else if (node.kind == LinkedNodeKind.compilationUnit) {
-      _compilationUnit(node);
-    } else if (node.kind == LinkedNodeKind.constructorDeclaration) {
-      _constructorDeclaration(node);
-    } else if (node.kind == LinkedNodeKind.defaultFormalParameter) {
-      _node(node.defaultFormalParameter_parameter);
-    } else if (node.kind == LinkedNodeKind.enumDeclaration) {
-      _enumDeclaration(node);
-    } else if (node.kind == LinkedNodeKind.enumConstantDeclaration) {
-      _enumConstantDeclaration(node);
-    } else if (node.kind == LinkedNodeKind.fieldDeclaration) {
-      _fieldDeclaration(node);
-    } else if (node.kind == LinkedNodeKind.fieldFormalParameter) {
-      _fieldFormalParameter(node);
-    } else if (node.kind == LinkedNodeKind.formalParameterList) {
-      _formalParameters(node);
-    } else if (node.kind == LinkedNodeKind.functionDeclaration) {
-      _functionDeclaration(node);
-    } else if (node.kind == LinkedNodeKind.functionExpression) {
-      _functionExpression(node);
-    } else if (node.kind == LinkedNodeKind.functionTypeAlias) {
-      _functionTypeAlias(node);
-    } else if (node.kind == LinkedNodeKind.genericFunctionType) {
-      _genericFunctionType(node);
-    } else if (node.kind == LinkedNodeKind.genericTypeAlias) {
-      _genericTypeAlias(node);
-    } else if (node.kind == LinkedNodeKind.importDirective) {
-      _importDirective(node);
-    } else if (node.kind == LinkedNodeKind.libraryDirective) {
-      _libraryDirective(node);
-    } else if (node.kind == LinkedNodeKind.methodDeclaration) {
-      _methodDeclaration(node);
-    } else if (node.kind == LinkedNodeKind.simpleFormalParameter) {
-      _simpleFormalParameter(node);
-    } else if (node.kind == LinkedNodeKind.topLevelVariableDeclaration) {
-      _topLevelVariableDeclaration(node);
-    } else if (node.kind == LinkedNodeKind.typeArgumentList) {
-      _typeArgumentList(node);
-    } else if (node.kind == LinkedNodeKind.typeName) {
-      _typeName(node);
-    } else if (node.kind == LinkedNodeKind.typeParameter) {
-      _typeParameter(node);
-    } else if (node.kind == LinkedNodeKind.typeParameterList) {
-      _typeParameterList(node);
-    } else if (node.kind == LinkedNodeKind.variableDeclarationList) {
-      _variableDeclarationList(node);
-    } else {
-      // TODO(scheglov) implement
-      throw UnimplementedError('${node.kind}');
-    }
-  }
-
-  void _nodeList(List<LinkedNode> nodeList) {
-    if (nodeList == null) return;
-
-    for (var i = 0; i < nodeList.length; ++i) {
-      var node = nodeList[i];
-      _node(node);
-    }
-  }
-
-  void _simpleFormalParameter(LinkedNodeBuilder node) {
-    var typeNode = node.simpleFormalParameter_type;
-    if (typeNode != null) {
-      _node(typeNode);
-      node.simpleFormalParameter_type2 = _getTypeAnnotationType(typeNode);
-    } else {
-      // TODO(scheglov) might be inferred
-      node.simpleFormalParameter_type2 = _dynamicType;
+    scope = new EnclosedScope(scope);
+    for (var typeParameter in element.typeParameters) {
+      scope.define(typeParameter);
     }
 
-    if (node.normalFormalParameter_covariantKeyword != 0) {
-      node.normalFormalParameter_isCovariant = true;
-    } else {
-      // TODO(scheglov) might be inferred
+    node.returnType?.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters.accept(this);
+    nodesToBuildType.addDeclaration(node);
+
+    scope = outerScope;
+    reference = outerReference;
+  }
+
+  @override
+  void visitGenericFunctionType(GenericFunctionType node) {
+    var outerScope = scope;
+    var outerReference = reference;
+
+    var id = linkingContext.nextGenericFunctionTypeId();
+    LazyAst.setGenericFunctionTypeId(node, id);
+
+    var containerRef = unitReference.getChild('@genericFunctionType');
+    reference = containerRef.getChild('$id');
+
+    var element = GenericFunctionTypeElementImpl.forLinkedNode(
+      unitReference.element,
+      reference,
+      node,
+    );
+    (node as GenericFunctionTypeImpl).declaredElement = element;
+    _createTypeParameterElements(node.typeParameters);
+    scope = TypeParameterScope(outerScope, element);
+
+    node.returnType?.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters.accept(this);
+
+    var nullabilitySuffix = _getNullabilitySuffix(node.question != null);
+    var builder = FunctionTypeBuilder.of(node, nullabilitySuffix);
+    (node as GenericFunctionTypeImpl).type = builder;
+    nodesToBuildType.addTypeBuilder(builder);
+
+    scope = outerScope;
+    reference = outerReference;
+  }
+
+  @override
+  void visitGenericTypeAlias(GenericTypeAlias node) {
+    var outerScope = scope;
+    var outerReference = reference;
+
+    var name = node.name.name;
+    reference = reference.getChild('@typeAlias').getChild(name);
+
+    GenericTypeAliasElementImpl element = reference.element;
+    node.name.staticElement = element;
+    _createTypeParameterElements(node.typeParameters);
+    scope = TypeParameterScope(outerScope, element);
+
+    node.typeParameters?.accept(this);
+    node.functionType?.accept(this);
+    nodesToBuildType.addDeclaration(node);
+
+    scope = outerScope;
+    reference = outerReference;
+  }
+
+  @override
+  void visitImplementsClause(ImplementsClause node) {
+    node.interfaces.accept(this);
+  }
+
+  @override
+  void visitMethodDeclaration(MethodDeclaration node) {
+    var outerScope = scope;
+    var outerReference = reference;
+
+    var container = '@method';
+    var propertyKeyword = node.propertyKeyword?.keyword;
+    if (propertyKeyword == Keyword.GET) {
+      container = '@getter';
+    } else if (propertyKeyword == Keyword.SET) {
+      container = '@setter';
     }
+
+    var name = node.name.name;
+    reference = reference.getChild(container).getChild(name);
+
+    var element = MethodElementImpl.forLinkedNode(
+      outerReference.element,
+      reference,
+      node,
+    );
+    node.name.staticElement = element;
+    _createTypeParameterElements(node.typeParameters);
+    scope = new FunctionScope(scope, element);
+    LinkingNodeContext(node, scope);
+
+    node.returnType?.accept(this);
+    node.parameters?.accept(this);
+    node.typeParameters?.accept(this);
+    nodesToBuildType.addDeclaration(node);
+
+    scope = outerScope;
+    reference = outerReference;
   }
 
-  void _topLevelVariableDeclaration(LinkedNodeBuilder node) {
-    _node(node.topLevelVariableDeclaration_variableList);
+  @override
+  void visitMixinDeclaration(MixinDeclaration node) {
+    var outerScope = scope;
+    var outerReference = reference;
+
+    var name = node.name.name;
+    reference = reference.getChild('@mixin').getChild(name);
+
+    MixinElementImpl element = reference.element;
+    node.name.staticElement = element;
+    _createTypeParameterElements(node.typeParameters);
+    scope = new TypeParameterScope(scope, element);
+    scope = new ClassScope(scope, element);
+    LinkingNodeContext(node, scope);
+
+    node.typeParameters?.accept(this);
+    node.onClause?.accept(this);
+    node.implementsClause?.accept(this);
+    node.members.accept(this);
+    nodesToBuildType.addDeclaration(node);
+
+    scope = outerScope;
+    reference = outerReference;
   }
 
-  void _typeArgumentList(LinkedNodeBuilder node) {
-    for (var typeArgument in node.typeArgumentList_arguments) {
-      _typeName(typeArgument);
-    }
+  @override
+  void visitOnClause(OnClause node) {
+    node.superclassConstraints.accept(this);
   }
 
-  void _typeName(LinkedNodeBuilder node) {
-    if (node == null) return;
-
-    var identifier = node.typeName_name;
-    if (identifier.kind == LinkedNodeKind.simpleIdentifier) {
-      var name = unit.context.getSimpleName(identifier);
-
-      if (name == 'void') {
-        node.typeName_type = LinkedNodeTypeBuilder(
-          kind: LinkedNodeTypeKind.void_,
-        );
-        return;
-      }
-
-      var declaration = scope.lookup(name);
-      if (declaration == null) {
-        identifier.simpleIdentifier_element = 0;
-        node.typeName_type = _dynamicType;
-        return;
-      }
-
-      var reference = declaration.reference;
-      var referenceIndex = linkingBundleContext.indexOfReference(reference);
-      identifier.simpleIdentifier_element = referenceIndex;
-
-      var typeArguments = const <LinkedNodeTypeBuilder>[];
-      var typeArgumentList = node.typeName_typeArguments;
-      if (typeArgumentList != null) {
-        _node(typeArgumentList);
-        typeArguments = typeArgumentList.typeArgumentList_arguments
-            .map((node) => _getTypeAnnotationType(node))
-            .toList();
-      }
-
-      if (reference.isClass) {
-        node.typeName_type = LinkedNodeTypeBuilder(
-          kind: LinkedNodeTypeKind.interface,
-          interfaceClass: referenceIndex,
-          interfaceTypeArguments: 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 {
-        // TODO(scheglov) set Object? keep unresolved?
-        throw UnimplementedError();
-      }
-    } else {
-      // TODO(scheglov) implement
-      throw UnimplementedError();
-    }
+  @override
+  void visitSimpleFormalParameter(SimpleFormalParameter node) {
+    node.type?.accept(this);
+    nodesToBuildType.addDeclaration(node);
   }
 
-  void _typeParameter(LinkedNodeBuilder node) {
-    _node(node.typeParameter_bound);
-    // TODO(scheglov) set Object bound if no explicit?
+  @override
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    node.variables.accept(this);
   }
 
-  void _typeParameterList(LinkedNodeBuilder node) {
-    for (var typeParameter in node.typeParameterList_typeParameters) {
-      _node(typeParameter);
-    }
+  @override
+  void visitTypeArgumentList(TypeArgumentList node) {
+    node.arguments.accept(this);
   }
 
-  void _variableDeclarationList(LinkedNodeBuilder node) {
-    var typeNode = node.variableDeclarationList_type;
-    if (typeNode != null) {
-      _node(typeNode);
-      for (var field in node.variableDeclarationList_variables) {
-        field.variableDeclaration_type2 = _getTypeAnnotationType(typeNode);
-      }
-    }
-  }
-
-  /// Enter the type parameters scope, visit them, and run [f].
-  void _withTypeParameters(LinkedNode typeParameterList, void f()) {
-    if (typeParameterList == null) {
-      f();
+  @override
+  void visitTypeName(TypeName node) {
+    var typeName = node.name;
+    if (typeName is SimpleIdentifier && typeName.name == 'void') {
+      node.type = VoidTypeImpl.instance;
       return;
     }
 
-    scope = Scope(this.scope, {});
-
-    var containerRef = this.reference.getChild('@typeParameter');
-    var typeParameters = typeParameterList.typeParameterList_typeParameters;
-    for (var typeParameter in typeParameters) {
-      var name = unit.context.getSimpleName(typeParameter.typeParameter_name);
-      var reference = containerRef.getChild(name);
-      reference.node = typeParameter;
-      scope.declare(name, Declaration(name, reference));
+    var element = scope.lookup(typeName, _libraryElement);
+    if (typeName is SimpleIdentifier) {
+      typeName.staticElement = element;
+    } else if (typeName is PrefixedIdentifier) {
+      typeName.identifier.staticElement = element;
+      SimpleIdentifier prefix = typeName.prefix;
+      prefix.staticElement = scope.lookup(prefix, _libraryElement);
     }
 
-    _node(typeParameterList);
-    f();
+    node.typeArguments?.accept(this);
 
-    if (typeParameterList != null) {
-      scope = scope.parent;
+    var nullabilitySuffix = _getNullabilitySuffix(node.question != null);
+    if (element is TypeParameterElement) {
+      node.type = TypeParameterTypeImpl(
+        element,
+        nullabilitySuffix: nullabilitySuffix,
+      );
+    } else {
+      var builder = NamedTypeBuilder.of(
+        node,
+        element,
+        nullabilitySuffix,
+      );
+      node.type = builder;
+      nodesToBuildType.addTypeBuilder(builder);
+    }
+  }
+
+  @override
+  void visitTypeParameter(TypeParameter node) {
+    node.bound?.accept(this);
+  }
+
+  @override
+  void visitTypeParameterList(TypeParameterList node) {
+    node.typeParameters.accept(this);
+  }
+
+  @override
+  void visitVariableDeclarationList(VariableDeclarationList node) {
+    node.type?.accept(this);
+    nodesToBuildType.addDeclaration(node);
+  }
+
+  @override
+  void visitWithClause(WithClause node) {
+    node.mixinTypes.accept(this);
+  }
+
+  void _createTypeParameterElement(TypeParameter node) {
+    var outerReference = this.reference;
+    var containerRef = outerReference.getChild('@typeParameter');
+    var reference = containerRef.getChild(node.name.name);
+    reference.node2 = node;
+
+    var element = TypeParameterElementImpl.forLinkedNode(
+      outerReference.element,
+      reference,
+      node,
+    );
+    node.name.staticElement = element;
+  }
+
+  void _createTypeParameterElements(TypeParameterList typeParameterList) {
+    if (typeParameterList == null) return;
+
+    for (var typeParameter in typeParameterList.typeParameters) {
+      _createTypeParameterElement(typeParameter);
+    }
+  }
+
+  NullabilitySuffix _getNullabilitySuffix(bool hasQuestion) {
+    if (nnbd) {
+      if (hasQuestion) {
+        return NullabilitySuffix.question;
+      } else {
+        return NullabilitySuffix.none;
+      }
+    } else {
+      return NullabilitySuffix.star;
     }
   }
 }
diff --git a/analyzer/lib/src/summary2/scope.dart b/analyzer/lib/src/summary2/scope.dart
index 30f7419..2af6ace 100644
--- a/analyzer/lib/src/summary2/scope.dart
+++ b/analyzer/lib/src/summary2/scope.dart
@@ -2,27 +2,27 @@
 // for 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/summary2/declaration.dart';
+import 'package:analyzer/src/summary2/reference.dart';
 
 class Scope {
   final Scope parent;
-  final Map<String, Declaration> map;
+  final Map<String, Reference> map;
 
   Scope(this.parent, this.map);
 
-  Scope.top() : this(null, <String, Declaration>{});
+  Scope.top() : this(null, <String, Reference>{});
 
-  void declare(String name, Declaration declaration) {
-    map[name] = declaration;
+  void declare(String name, Reference reference) {
+    map[name] = reference;
   }
 
-  void forEach(f(String name, Declaration declaration)) {
+  void forEach(f(String name, Reference reference)) {
     map.forEach(f);
   }
 
-  Declaration lookup(String name) {
-    var declaration = map[name];
-    if (declaration != null) return declaration;
+  Reference lookup(String name) {
+    var reference = map[name];
+    if (reference != null) return reference;
 
     if (parent == null) return null;
     return parent.lookup(name);
diff --git a/analyzer/lib/src/summary2/simply_bounded.dart b/analyzer/lib/src/summary2/simply_bounded.dart
new file mode 100644
index 0000000..e1bbe8a
--- /dev/null
+++ b/analyzer/lib/src/summary2/simply_bounded.dart
@@ -0,0 +1,320 @@
+// 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/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';
+
+/// Compute simple-boundedness for all classes and generic types aliases in
+/// the source [libraryBuilders].  There might be dependencies between them,
+/// so they all should be processed simultaneously.
+void computeSimplyBounded(
+  LinkedBundleContext bundleContext,
+  Iterable<SourceLibraryBuilder> libraryBuilders,
+) {
+  var walker = SimplyBoundedDependencyWalker(bundleContext);
+  var nodes = <SimplyBoundedNode>[];
+  for (var libraryBuilder in libraryBuilders) {
+    for (var unit in libraryBuilder.element.units) {
+      for (var element in unit.functionTypeAliases) {
+        var node = walker.getNode(element);
+        nodes.add(node);
+      }
+      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);
+      }
+    }
+  }
+
+  for (var node in nodes) {
+    if (!node.isEvaluated) {
+      walker.walk(node);
+    }
+    LazyAst.setSimplyBounded(node._node, node.isSimplyBounded);
+  }
+}
+
+/// The graph walker for evaluating whether types are simply bounded.
+class SimplyBoundedDependencyWalker
+    extends graph.DependencyWalker<SimplyBoundedNode> {
+  final LinkedBundleContext bundleContext;
+  final Map<Element, SimplyBoundedNode> nodeMap = Map.identity();
+
+  SimplyBoundedDependencyWalker(this.bundleContext);
+
+  @override
+  void evaluate(SimplyBoundedNode v) {
+    v._evaluate();
+  }
+
+  @override
+  void evaluateScc(List<SimplyBoundedNode> scc) {
+    for (var node in scc) {
+      node._markCircular();
+    }
+  }
+
+  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,
+          node,
+          parameters ?? const <TypeParameter>[],
+          const <TypeAnnotation>[],
+        );
+      } else if (node is ClassTypeAlias) {
+        var parameters = node.typeParameters?.typeParameters;
+        graphNode = SimplyBoundedNode(
+          this,
+          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('(${node.runtimeType}) $node');
+      }
+      nodeMap[element] = graphNode;
+    }
+    return graphNode;
+  }
+
+  /// Collects all the type references appearing on the "right hand side" of a
+  /// typedef.
+  ///
+  /// The "right hand side" of a typedef is the type appearing after the "="
+  /// in a new style typedef declaration, or for an old style typedef
+  /// 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<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 functionType = node.functionType;
+      if (functionType != null) {
+        var collector = _TypeCollector();
+        collector.addType(functionType.returnType);
+        collector.visitParameters(functionType.parameters);
+        return collector.types;
+      } else {
+        return const <TypeAnnotation>[];
+      }
+    } else {
+      throw StateError('(${node.runtimeType}) $node');
+    }
+  }
+}
+
+/// The graph node used to construct the dependency graph for evaluating
+/// whether types are simply bounded.
+class SimplyBoundedNode extends graph.Node<SimplyBoundedNode> {
+  final SimplyBoundedDependencyWalker _walker;
+  final AstNode _node;
+
+  /// The type parameters of the type whose simple-boundedness we check.
+  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<TypeAnnotation> _rhsTypes;
+
+  @override
+  bool isEvaluated = false;
+
+  /// After execution of [_evaluate], indicates whether the type is
+  /// simply bounded.
+  ///
+  /// Prior to execution of [computeDependencies], `true`.
+  ///
+  /// Between execution of [computeDependencies] and [_evaluate], `true`
+  /// indicates that the type is simply bounded only if all of its dependencies
+  /// are simply bounded; `false` indicates that the type is not simply bounded.
+  bool isSimplyBounded = true;
+
+  SimplyBoundedNode(
+    this._walker,
+    this._node,
+    this._typeParameters,
+    this._rhsTypes,
+  );
+
+  @override
+  List<SimplyBoundedNode> computeDependencies() {
+    var dependencies = <SimplyBoundedNode>[];
+    for (var typeParameter in _typeParameters) {
+      var bound = typeParameter.bound;
+      if (bound != null) {
+        if (!_visitType(dependencies, bound, false)) {
+          // Note: we might consider setting isEvaluated=true here to prevent an
+          // unnecessary call to SimplyBoundedDependencyWalker.evaluate.
+          // However, we'd have to be careful to make sure this doesn't violate
+          // an invariant of the DependencyWalker algorithm, since normally it
+          // only expects isEvaluated to change during a call to .evaluate or
+          // .evaluateScc.
+          isSimplyBounded = false;
+          return const [];
+        }
+      }
+    }
+    for (var type in _rhsTypes) {
+      if (!_visitType(dependencies, type, true)) {
+        // Note: we might consider setting isEvaluated=true here to prevent an
+        // unnecessary call to SimplyBoundedDependencyWalker.evaluate.
+        // However, we'd have to be careful to make sure this doesn't violate
+        // an invariant of the DependencyWalker algorithm, since normally it
+        // only expects isEvaluated to change during a call to .evaluate or
+        // .evaluateScc.
+        isSimplyBounded = false;
+        return const [];
+      }
+    }
+    return dependencies;
+  }
+
+  void _evaluate() {
+    for (var dependency in graph.Node.getDependencies(this)) {
+      if (!dependency.isSimplyBounded) {
+        isSimplyBounded = false;
+        break;
+      }
+    }
+    isEvaluated = true;
+  }
+
+  void _markCircular() {
+    isSimplyBounded = false;
+    isEvaluated = true;
+  }
+
+  /// Visits the type specified by [type], storing the [SimplyBoundedNode] for
+  /// any types it references in [dependencies].
+  ///
+  /// Return `false` if a type that is known to be not simply bound is found.
+  ///
+  /// Return `false` if a reference to a type parameter is found, and
+  /// [allowTypeParameters] is `false`.
+  ///
+  /// If `false` is returned, further visiting is short-circuited.
+  ///
+  /// Otherwise `true` is returned.
+  bool _visitType(List<SimplyBoundedNode> dependencies, TypeAnnotation type,
+      bool allowTypeParameters) {
+    if (type == null) return true;
+
+    if (type is TypeName) {
+      var element = type.name.staticElement;
+
+      if (element is TypeParameterElement) {
+        return allowTypeParameters;
+      }
+
+      var arguments = type.typeArguments;
+      if (arguments == null) {
+        var graphNode = _walker.nodeMap[element];
+
+        // If not a node being linked, then the flag is already set.
+        if (graphNode == null) {
+          if (element is TypeParameterizedElement) {
+            return element.isSimplyBounded;
+          }
+          return true;
+        }
+
+        dependencies.add(graphNode);
+      } else {
+        for (var argument in arguments.arguments) {
+          if (!_visitType(dependencies, argument, allowTypeParameters)) {
+            return false;
+          }
+        }
+      }
+      return true;
+    }
+
+    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;
+        }
+      }
+      return true;
+    }
+
+    throw UnimplementedError('(${type.runtimeType}) $type');
+  }
+}
+
+/// Helper for collecting type annotations.
+class _TypeCollector {
+  final List<TypeAnnotation> types = [];
+
+  void addType(TypeAnnotation type) {
+    if (type != null) {
+      types.add(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('(${node.runtimeType}) $node');
+    }
+  }
+
+  void visitParameters(FormalParameterList parameterList) {
+    for (var parameter in parameterList.parameters) {
+      visitParameter(parameter);
+    }
+  }
+}
diff --git a/analyzer/lib/src/summary2/tokens_context.dart b/analyzer/lib/src/summary2/tokens_context.dart
index 36b9d5a..eb8f654 100644
--- a/analyzer/lib/src/summary2/tokens_context.dart
+++ b/analyzer/lib/src/summary2/tokens_context.dart
@@ -4,15 +4,9 @@
 
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
-import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/summary2/tokens_writer.dart';
 
-/// The context for reading or writing tokens.
-///
-/// Tokens cannot be compared, so tokens for [indexOfToken] must be previously
-/// received from [tokenOfIndex], or the context must be created from a
-/// [TokensResult] (the result of writing previously parsed tokens).
+/// The context for reading tokens.
 class TokensContext {
   final UnlinkedTokens _tokens;
   final List<Token> _indexToToken;
@@ -22,40 +16,25 @@
       : _indexToToken = List<Token>(_tokens.type.length),
         _tokenToIndex = Map.identity();
 
-  TokensContext.fromResult(
-      this._tokens, this._indexToToken, this._tokenToIndex);
-
-  /// TODO(scheglov) Not used yet, maybe remove.
-  int addSyntheticToken(
-      UnlinkedTokenKind kind, UnlinkedTokenType type, String lexeme) {
-    var index = _tokens.kind.length;
-    UnlinkedTokensBuilder tokens = _tokens;
-    tokens.kind.add(kind);
-    tokens.lexeme.add(lexeme);
-    tokens.offset.add(0);
-    tokens.length.add(0);
-    tokens.type.add(type);
-    tokens.next.add(0);
-    tokens.endGroup.add(0);
-    tokens.precedingComment.add(0);
-    tokens.isSynthetic.add(true);
-    return index;
-  }
-
-  int indexOfToken(Token token) {
-    if (token == null) return 0;
-
-    var index = _tokenToIndex[token];
-    if (index == null) {
-      throw StateError('Unexpected token: $token');
-    }
-    return index;
-  }
-
   String lexeme(int index) {
     return _tokens.lexeme[index];
   }
 
+  void linkTokens(Token from, Token to) {
+    var fromIndex = _tokenToIndex[from];
+    var toIndex = _tokenToIndex[to];
+    Token prevToken = null;
+    for (var index = fromIndex; index <= toIndex && index != 0;) {
+      var token = _indexToToken[index];
+      token ??= tokenOfIndex(index);
+
+      prevToken?.next = token;
+
+      prevToken = token;
+      index = _tokens.next[index];
+    }
+  }
+
   int offset(int index) {
     return _tokens.offset[index];
   }
@@ -70,33 +49,39 @@
         case UnlinkedTokenKind.nothing:
           return null;
         case UnlinkedTokenKind.comment:
-          return CommentToken(
+          token = CommentToken(
             _binaryToAstTokenType(_tokens.type[index]),
             _tokens.lexeme[index],
             _tokens.offset[index],
           );
+          break;
         case UnlinkedTokenKind.keyword:
-          return KeywordToken(
+          token = KeywordToken(
             _binaryToAstTokenType(_tokens.type[index]),
             _tokens.offset[index],
             _getCommentToken(_tokens.precedingComment[index]),
           );
+          break;
         case UnlinkedTokenKind.simple:
-          return SimpleToken(
+          token = SimpleToken(
             _binaryToAstTokenType(_tokens.type[index]),
             _tokens.offset[index],
             _getCommentToken(_tokens.precedingComment[index]),
           );
+          break;
         case UnlinkedTokenKind.string:
-          return StringToken(
+          token = StringToken(
             _binaryToAstTokenType(_tokens.type[index]),
             _tokens.lexeme[index],
             _tokens.offset[index],
             _getCommentToken(_tokens.precedingComment[index]),
           );
+          break;
         default:
           throw UnimplementedError('Token kind: $kind');
       }
+      _indexToToken[index] = token;
+      _tokenToIndex[token] = index;
     }
     return token;
   }
@@ -146,6 +131,8 @@
         return TokenType.BANG;
       case UnlinkedTokenType.BANG_EQ:
         return TokenType.BANG_EQ;
+      case UnlinkedTokenType.BANG_EQ_EQ:
+        return TokenType.BANG_EQ_EQ;
       case UnlinkedTokenType.BAR:
         return TokenType.BAR;
       case UnlinkedTokenType.BAR_BAR:
@@ -200,6 +187,8 @@
         return TokenType.EQ;
       case UnlinkedTokenType.EQ_EQ:
         return TokenType.EQ_EQ;
+      case UnlinkedTokenType.EQ_EQ_EQ:
+        return TokenType.EQ_EQ_EQ;
       case UnlinkedTokenType.EXPORT:
         return Keyword.EXPORT;
       case UnlinkedTokenType.EXTENDS:
@@ -230,6 +219,10 @@
         return TokenType.GT_GT;
       case UnlinkedTokenType.GT_GT_EQ:
         return TokenType.GT_GT_EQ;
+      case UnlinkedTokenType.GT_GT_GT:
+        return TokenType.GT_GT_GT;
+      case UnlinkedTokenType.GT_GT_GT_EQ:
+        return TokenType.GT_GT_GT_EQ;
       case UnlinkedTokenType.HASH:
         return TokenType.HASH;
       case UnlinkedTokenType.HEXADECIMAL:
@@ -256,6 +249,8 @@
         return Keyword.INTERFACE;
       case UnlinkedTokenType.IS:
         return TokenType.IS;
+      case UnlinkedTokenType.LATE:
+        return Keyword.LATE;
       case UnlinkedTokenType.LIBRARY:
         return Keyword.LIBRARY;
       case UnlinkedTokenType.LT:
@@ -324,6 +319,8 @@
         return TokenType.QUESTION_QUESTION;
       case UnlinkedTokenType.QUESTION_QUESTION_EQ:
         return TokenType.QUESTION_QUESTION_EQ;
+      case UnlinkedTokenType.REQUIRED:
+        return Keyword.REQUIRED;
       case UnlinkedTokenType.RETHROW:
         return Keyword.RETHROW;
       case UnlinkedTokenType.RETURN:
diff --git a/analyzer/lib/src/summary2/tokens_writer.dart b/analyzer/lib/src/summary2/tokens_writer.dart
index 3a9e989..6668845 100644
--- a/analyzer/lib/src/summary2/tokens_writer.dart
+++ b/analyzer/lib/src/summary2/tokens_writer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2019, 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.
 
@@ -6,25 +6,10 @@
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/summary2/tokens_context.dart';
 import 'package:meta/meta.dart';
 
-/// The result of writing a sequence of tokens.
-class TokensResult {
-  final UnlinkedTokensBuilder tokens;
-  final List<Token> _indexToToken;
-  final Map<Token, int> _tokenToIndex;
-
-  TokensResult(this.tokens, this._indexToToken, this._tokenToIndex);
-
-  TokensContext toContext() {
-    return TokensContext.fromResult(tokens, _indexToToken, _tokenToIndex);
-  }
-}
-
 class TokensWriter {
   final UnlinkedTokensBuilder _tokens = UnlinkedTokensBuilder();
-  final List<Token> _indexToToken = [];
   final Map<Token, int> _tokenToIndex = Map.identity();
 
   TokensWriter() {
@@ -40,8 +25,20 @@
     );
   }
 
+  UnlinkedTokensBuilder get tokensBuilder => _tokens;
+
+  int indexOfToken(Token token) {
+    if (token == null) return 0;
+
+    var index = _tokenToIndex[token];
+    if (index == null) {
+      throw StateError('Unexpected token: $token');
+    }
+    return index;
+  }
+
   /// Write all the tokens from the [first] to the [last] inclusively.
-  TokensResult writeTokens(Token first, Token last) {
+  void writeTokens(Token first, Token last) {
     if (first is CommentToken) {
       first = (first as CommentToken).parent;
     }
@@ -67,8 +64,6 @@
 
       if (token == last) break;
     }
-
-    return TokensResult(_tokens, _indexToToken, _tokenToIndex);
   }
 
   int _addToken(
@@ -91,8 +86,7 @@
     _tokens.precedingComment.add(precedingComment);
     _tokens.type.add(type);
 
-    var index = _indexToToken.length;
-    _indexToToken.add(token);
+    var index = _tokenToIndex.length;
     _tokenToIndex[token] = index;
     return index;
   }
@@ -196,6 +190,8 @@
       return UnlinkedTokenType.BANG;
     } else if (type == TokenType.BANG_EQ) {
       return UnlinkedTokenType.BANG_EQ;
+    } else if (type == TokenType.BANG_EQ_EQ) {
+      return UnlinkedTokenType.BANG_EQ_EQ;
     } else if (type == TokenType.BAR) {
       return UnlinkedTokenType.BAR;
     } else if (type == TokenType.BAR_BAR) {
@@ -250,6 +246,8 @@
       return UnlinkedTokenType.EQ;
     } else if (type == TokenType.EQ_EQ) {
       return UnlinkedTokenType.EQ_EQ;
+    } else if (type == TokenType.EQ_EQ_EQ) {
+      return UnlinkedTokenType.EQ_EQ_EQ;
     } else if (type == Keyword.EXPORT) {
       return UnlinkedTokenType.EXPORT;
     } else if (type == Keyword.EXTENDS) {
@@ -280,6 +278,10 @@
       return UnlinkedTokenType.GT_GT;
     } else if (type == TokenType.GT_GT_EQ) {
       return UnlinkedTokenType.GT_GT_EQ;
+    } else if (type == TokenType.GT_GT_GT) {
+      return UnlinkedTokenType.GT_GT_GT;
+    } else if (type == TokenType.GT_GT_GT_EQ) {
+      return UnlinkedTokenType.GT_GT_GT_EQ;
     } else if (type == TokenType.HASH) {
       return UnlinkedTokenType.HASH;
     } else if (type == TokenType.HEXADECIMAL) {
@@ -306,6 +308,8 @@
       return UnlinkedTokenType.INTERFACE;
     } else if (type == TokenType.IS) {
       return UnlinkedTokenType.IS;
+    } else if (type == Keyword.LATE) {
+      return UnlinkedTokenType.LATE;
     } else if (type == Keyword.LIBRARY) {
       return UnlinkedTokenType.LIBRARY;
     } else if (type == TokenType.LT) {
@@ -374,6 +378,8 @@
       return UnlinkedTokenType.QUESTION_QUESTION;
     } else if (type == TokenType.QUESTION_QUESTION_EQ) {
       return UnlinkedTokenType.QUESTION_QUESTION_EQ;
+    } else if (type == Keyword.REQUIRED) {
+      return UnlinkedTokenType.REQUIRED;
     } else if (type == Keyword.RETHROW) {
       return UnlinkedTokenType.RETHROW;
     } else if (type == Keyword.RETURN) {
diff --git a/analyzer/lib/src/summary2/top_level_inference.dart b/analyzer/lib/src/summary2/top_level_inference.dart
index def0f8d..52b911f 100644
--- a/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/analyzer/lib/src/summary2/top_level_inference.dart
@@ -2,15 +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.
 
-import 'package:analyzer/dart/ast/standard_ast_factory.dart';
+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/format.dart';
 import 'package:analyzer/src/summary/idl.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/builder/source_library_builder.dart';
+import 'package:analyzer/src/summary2/lazy_ast.dart';
 import 'package:analyzer/src/summary2/link.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) {
@@ -19,158 +28,341 @@
   return type;
 }
 
+AstNode _getLinkedNode(Element element) {
+  return (element as ElementImpl).linkedNode;
+}
+
+/// Resolver for typed constant top-level variables and fields initializers.
+///
+/// Initializers of untyped variables are resolved during [TopLevelInference].
+class ConstantInitializersResolver {
+  final Linker linker;
+
+  LibraryElement _library;
+  Scope _scope;
+
+  ConstantInitializersResolver(this.linker);
+
+  DynamicTypeImpl get _dynamicType => DynamicTypeImpl.instance;
+
+  void perform() {
+    for (var builder in linker.builders.values) {
+      _library = builder.element;
+      for (var unitContext in builder.context.units) {
+        for (var unitMember in unitContext.unit.declarations) {
+          _scope = builder.libraryScope;
+          if (unitMember is TopLevelVariableDeclaration) {
+            _variableDeclarationList(unitMember.variables);
+          } else if (unitMember is ClassOrMixinDeclaration) {
+            _scope = LinkingNodeContext.get(unitMember).scope;
+            for (var classMember in unitMember.members) {
+              if (classMember is FieldDeclaration) {
+                _variableDeclarationList(classMember.fields);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  void _variableDeclarationList(VariableDeclarationList node) {
+    if (node.isConst && node.type != null) {
+      for (var variable in node.variables) {
+        var initializer = variable.initializer;
+        if (initializer != null) {
+          var astResolver = AstResolver(linker, _library, _scope);
+          astResolver.resolve(initializer, doAstRewrite: true);
+        }
+      }
+    }
+  }
+}
+
 class TopLevelInference {
   final Linker linker;
-  final Reference libraryRef;
-  final UnitBuilder unit;
 
-  TopLevelInference(this.linker, this.libraryRef, this.unit);
+  TopLevelInference(this.linker);
+
+  DynamicTypeImpl get _dynamicType => DynamicTypeImpl.instance;
 
   void infer() {
-    _inferFieldsTemporary();
+    var initializerInference = _InitializerInference(linker);
+    initializerInference.createNodes();
+
+    _performOverrideInference();
+    initializerInference.perform();
     _inferConstructorFieldFormals();
   }
 
   void _inferConstructorFieldFormals() {
-    _visitClassList((unitDeclaration) {
-      var members = unitDeclaration.classOrMixinDeclaration_members;
+    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;
 
-      var fields = <String, LinkedNodeType>{};
-      _visitClassFields(unitDeclaration, (field) {
-        var name = unit.context.getVariableName(field);
-        var type = field.variableDeclaration_type2;
-        if (type == null) {
-          throw StateError('Field $name should have a type.');
-        }
-        fields[name] = type;
-      });
-
-      for (var member in members) {
-        if (member.kind == LinkedNodeKind.constructorDeclaration) {
-          for (var parameter in member.constructorDeclaration_parameters
-              .formalParameterList_parameters) {
-            if (parameter.kind == LinkedNodeKind.fieldFormalParameter &&
-                parameter.fieldFormalParameter_type2 == null) {
-              var name = unit.context.getSimpleName(
-                parameter.normalFormalParameter_identifier,
-              );
-              var type = fields[name];
-              if (type == null) {
-                type = LinkedNodeTypeBuilder(
-                  kind: LinkedNodeTypeKind.dynamic_,
-                );
-              }
-              parameter.fieldFormalParameter_type2 = type;
+            var name = field.name;
+            var type = field.type;
+            if (type == null) {
+              throw StateError('Field $name should have a type.');
             }
+            fields[name] ??= type;
           }
-        }
-      }
-    });
-  }
 
-  void _inferFieldsTemporary() {
-    var unitDeclarations = unit.node.compilationUnit_declarations;
-    for (LinkedNodeBuilder unitDeclaration in unitDeclarations) {
-      if (unitDeclaration.kind == LinkedNodeKind.classDeclaration) {
-        _visitClassFields(unitDeclaration, (field) {
-          var name = unit.context.getVariableName(field);
-          // TODO(scheglov) Use inheritance
-          if (field.variableDeclaration_type2 == null) {
-            field.variableDeclaration_type2 = LinkedNodeTypeBuilder(
-              kind: LinkedNodeTypeKind.dynamic_,
-            );
-          }
-        });
+          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;
+                }
 
-        var members = unitDeclaration.classOrMixinDeclaration_members;
-        for (var member in members) {
-          if (member.kind == LinkedNodeKind.methodDeclaration) {
-            // TODO(scheglov) Use inheritance
-            if (member.methodDeclaration_returnType2 == null) {
-              if (unit.context.isSetter(member)) {
-                member.methodDeclaration_returnType2 = LinkedNodeTypeBuilder(
-                  kind: LinkedNodeTypeKind.void_,
-                );
-              } else {
-                member.methodDeclaration_returnType2 = LinkedNodeTypeBuilder(
-                  kind: LinkedNodeTypeKind.dynamic_,
-                );
+                if (node is FieldFormalParameter &&
+                    node.type == null &&
+                    node.parameters == null) {
+                  var name = parameter.name;
+                  var type = fields[name] ?? _dynamicType;
+                  LazyAst.setType(node, type);
+                }
               }
             }
           }
         }
-      } else if (unitDeclaration.kind == LinkedNodeKind.functionDeclaration) {
-        if (unit.context.isSetter(unitDeclaration)) {
-          unitDeclaration.functionDeclaration_returnType2 =
-              LinkedNodeTypeBuilder(
-            kind: LinkedNodeTypeKind.void_,
-          );
-        }
-      } else if (unitDeclaration.kind ==
-          LinkedNodeKind.topLevelVariableDeclaration) {
-        var variableList =
-            unitDeclaration.topLevelVariableDeclaration_variableList;
-        for (var variable in variableList.variableDeclarationList_variables) {
-          // TODO(scheglov) infer in the correct order
-          if (variable.variableDeclaration_type2 == null ||
-              unit.context.isConst(variable)) {
-            _inferVariableTypeFromInitializerTemporary(variable);
-          }
-        }
       }
     }
   }
 
-  void _inferVariableTypeFromInitializerTemporary(LinkedNodeBuilder node) {
-    var unresolvedNode = node.variableDeclaration_initializer;
+  void _performOverrideInference() {
+    var inferrer = new InstanceMemberInferrer(
+      linker.typeProvider,
+      linker.inheritance,
+    );
+    for (var builder in linker.builders.values) {
+      for (var unit in builder.element.units) {
+        inferrer.inferCompilationUnit(unit);
+      }
+    }
+  }
+}
 
-    if (unresolvedNode == null) {
-      node.variableDeclaration_type2 = LinkedNodeTypeBuilder(
-        kind: LinkedNodeTypeKind.dynamic_,
-      );
-      return;
+class _FunctionElementForLink_Initializer implements FunctionElementImpl {
+  final _InferenceNode _node;
+
+  @override
+  Element enclosingElement;
+
+  _FunctionElementForLink_Initializer(this._node);
+
+  @override
+  DartType get returnType {
+    if (!_node.isEvaluated) {
+      _node._walker.walk(_node);
+    }
+    return LazyAst.getType(_node._node);
+  }
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class _InferenceDependenciesCollector extends RecursiveAstVisitor<void> {
+  final Set<PropertyInducingElement> _set = Set.identity();
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    var element = node.staticElement;
+    if (element is PropertyAccessorElement && element.isGetter) {
+      _set.add(element.variable);
+    }
+  }
+}
+
+class _InferenceNode extends graph.Node<_InferenceNode> {
+  final _InferenceWalker _walker;
+  final LibraryElement _library;
+  final Scope _scope;
+  final PropertyInducingElementImpl _element;
+  final VariableDeclaration _node;
+
+  @override
+  bool isEvaluated = false;
+
+  _InferenceNode(
+    this._walker,
+    this._library,
+    this._scope,
+    this._element,
+    this._node,
+  );
+
+  bool get isImplicitlyTypedInstanceField {
+    VariableDeclarationList variables = _node.parent;
+    if (variables.type == null) {
+      var parent = variables.parent;
+      return parent is FieldDeclaration && !parent.isStatic;
+    }
+    return false;
+  }
+
+  @override
+  List<_InferenceNode> computeDependencies() {
+    _buildLocalElements();
+    _resolveInitializer();
+
+    var collector = _InferenceDependenciesCollector();
+    _node.initializer.accept(collector);
+
+    if (collector._set.isEmpty) {
+      return const <_InferenceNode>[];
     }
 
-    var expression = unit.context.readInitializer(node);
-    astFactory.expressionFunctionBody(null, null, expression, null);
+    var dependencies = collector._set
+        .map(_walker.getNode)
+        .where((node) => node != null)
+        .toList();
 
-    // TODO(scheglov) can be shared for the whole library
-    var astResolver = AstResolver(linker, libraryRef);
+    for (var node in dependencies) {
+      if (node.isImplicitlyTypedInstanceField) {
+        LazyAst.setType(_node, DynamicTypeImpl.instance);
+        isEvaluated = true;
+        return const <_InferenceNode>[];
+      }
+    }
 
-    var resolvedNode = astResolver.resolve(unit, expression);
-    node.variableDeclaration_initializer = resolvedNode;
+    return dependencies;
+  }
 
-    if (node.variableDeclaration_type2 == null) {
-      var initializerType = expression.staticType;
+  void evaluate() {
+    _resolveInitializer();
+
+    if (LazyAst.getType(_node) == null) {
+      var initializerType = _node.initializer.staticType;
       initializerType = _dynamicIfNull(initializerType);
+      LazyAst.setType(_node, initializerType);
+    }
 
-      var linkingBundleContext = linker.linkingBundleContext;
-      node.variableDeclaration_type2 = linkingBundleContext.writeType(
-        initializerType,
-      );
+    isEvaluated = true;
+  }
+
+  void markCircular(List<_InferenceNode> cycle) {
+    LazyAst.setType(_node, DynamicTypeImpl.instance);
+
+    var cycleNames = Set<String>();
+    for (var inferenceNode in cycle) {
+      var node = inferenceNode._node;
+      if (node is VariableDeclaration) {
+        cycleNames.add(node.name.name);
+      } else {
+        cycleNames.add('<unknown>');
+      }
+    }
+
+    LazyAst.setTypeInferenceError(
+      _node,
+      TopLevelInferenceErrorBuilder(
+        kind: TopLevelInferenceErrorKind.dependencyCycle,
+        arguments: cycleNames.toList(),
+      ),
+    );
+
+    isEvaluated = true;
+  }
+
+  void _buildLocalElements() {
+    var holder = ElementHolder();
+    _node.initializer.accept(LocalElementBuilder(holder, null));
+    _element.encloseElements(holder.functions);
+  }
+
+  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);
+
+  @override
+  void evaluate(_InferenceNode v) {
+    v.evaluate();
+  }
+
+  @override
+  void evaluateScc(List<_InferenceNode> scc) {
+    for (var node in scc) {
+      node.markCircular(scc);
     }
   }
 
-  void _visitClassFields(
-      LinkedNode class_, void Function(LinkedNodeBuilder) f) {
-    var members = class_.classOrMixinDeclaration_members;
+  _InferenceNode getNode(Element element) {
+    return _nodes[element];
+  }
 
-    for (var member in members) {
-      if (member.kind == LinkedNodeKind.fieldDeclaration) {
-        var variableList = member.fieldDeclaration_fields;
-        for (var field in variableList.variableDeclarationList_variables) {
-          f(field);
+  void walkNodes() {
+    for (var node in _nodes.values) {
+      if (!node.isEvaluated) {
+        walk(node);
+      }
+    }
+  }
+}
+
+class _InitializerInference {
+  final Linker _linker;
+  final _InferenceWalker _walker;
+
+  LibraryElement _library;
+  Scope _scope;
+
+  _InitializerInference(this._linker) : _walker = _InferenceWalker(_linker);
+
+  void createNodes() {
+    for (var builder in _linker.builders.values) {
+      _library = builder.element;
+      for (var unit in _library.units) {
+        unit.types.forEach(_addClassElementFields);
+        unit.mixins.forEach(_addClassElementFields);
+
+        _scope = builder.libraryScope;
+        for (var element in unit.topLevelVariables) {
+          _addNode(element);
         }
       }
     }
   }
 
-  void _visitClassList(void Function(LinkedNodeBuilder) f) {
-    var unitDeclarations = unit.node.compilationUnit_declarations;
-    for (LinkedNodeBuilder unitDeclaration in unitDeclarations) {
-      if (unitDeclaration.kind == LinkedNodeKind.classDeclaration) {
-        f(unitDeclaration);
-      }
+  void perform() {
+    _walker.walkNodes();
+  }
+
+  void _addClassElementFields(ClassElement class_) {
+    var node = _getLinkedNode(class_);
+    _scope = LinkingNodeContext.get(node).scope;
+    for (var element in class_.fields) {
+      _addNode(element);
+    }
+  }
+
+  void _addNode(PropertyInducingElement element) {
+    if (element.isSynthetic) return;
+
+    VariableDeclaration node = _getLinkedNode(element);
+    if (LazyAst.getType(node) != null) return;
+
+    if (node.initializer != null) {
+      var inferenceNode =
+          _InferenceNode(_walker, _library, _scope, element, node);
+      _walker._nodes[element] = inferenceNode;
+      (element as PropertyInducingElementImpl).initializer =
+          _FunctionElementForLink_Initializer(inferenceNode);
+    } else {
+      LazyAst.setType(node, DynamicTypeImpl.instance);
     }
   }
 }
diff --git a/analyzer/lib/src/summary2/type_alias.dart b/analyzer/lib/src/summary2/type_alias.dart
new file mode 100644
index 0000000..56ed006
--- /dev/null
+++ b/analyzer/lib/src/summary2/type_alias.dart
@@ -0,0 +1,118 @@
+// 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/dart/element/element.dart';
+import 'package:analyzer/src/summary2/lazy_ast.dart';
+import 'package:analyzer/src/summary2/link.dart';
+
+class TypeAliasSelfReferenceFinder {
+  /// Check typedefs and mark the ones having self references.
+  void perform(Linker linker) {
+    for (var builder in linker.builders.values) {
+      for (var unitContext in builder.context.units) {
+        for (var node in unitContext.unit.declarations) {
+          if (node is FunctionTypeAlias) {
+            var finder = _Finder(node);
+            finder.functionTypeAlias(node);
+            LazyFunctionTypeAlias.setHasSelfReference(
+              node,
+              finder.hasSelfReference,
+            );
+          } else if (node is GenericTypeAlias) {
+            var finder = _Finder(node);
+            finder.genericTypeAlias(node);
+            LazyGenericTypeAlias.setHasSelfReference(
+              node,
+              finder.hasSelfReference,
+            );
+          }
+        }
+      }
+    }
+  }
+}
+
+class _Finder {
+  final AstNode self;
+  bool hasSelfReference = false;
+
+  _Finder(this.self);
+
+  void functionTypeAlias(FunctionTypeAlias node) {
+    _typeParameterList(node.typeParameters);
+    _formalParameterList(node.parameters);
+    _visit(node.returnType);
+  }
+
+  void genericTypeAlias(GenericTypeAlias node) {
+    var functionType = node.functionType;
+    if (functionType != null) {
+      _typeParameterList(functionType.typeParameters);
+      _formalParameterList(functionType.parameters);
+      _visit(functionType.returnType);
+    }
+  }
+
+  void _argumentList(TypeArgumentList node) {
+    if (node != null) {
+      for (var argument in node.arguments) {
+        _visit(argument);
+      }
+    }
+  }
+
+  void _formalParameter(FormalParameter node) {
+    if (node is DefaultFormalParameter) {
+      _formalParameter(node.parameter);
+    } else if (node is FunctionTypedFormalParameter) {
+      _visit(node.returnType);
+      _formalParameterList(node.parameters);
+    } else if (node is SimpleFormalParameter) {
+      _visit(node.type);
+    }
+  }
+
+  void _formalParameterList(FormalParameterList node) {
+    for (var parameter in node.parameters) {
+      _formalParameter(parameter);
+    }
+  }
+
+  void _typeParameterList(TypeParameterList node) {
+    if (node != null) {
+      for (var parameter in node.typeParameters) {
+        _visit(parameter.bound);
+      }
+    }
+  }
+
+  void _visit(TypeAnnotation node) {
+    if (hasSelfReference) return;
+    if (node == null) return;
+
+    if (node is TypeName) {
+      var element = node.name.staticElement;
+      if (element is ElementImpl) {
+        var typeNode = element.linkedNode;
+        if (typeNode == self) {
+          hasSelfReference = true;
+          return;
+        }
+        if (typeNode is FunctionTypeAlias) {
+          functionTypeAlias(typeNode);
+        } else if (typeNode is GenericTypeAlias) {
+          genericTypeAlias(typeNode);
+        }
+        _argumentList(node.typeArguments);
+      }
+    } else if (node is GenericFunctionType) {
+      _typeParameterList(node.typeParameters);
+      _formalParameterList(node.parameters);
+      _visit(node.returnType);
+    } else {
+      throw UnimplementedError('(${node.runtimeType}) $node');
+    }
+  }
+}
diff --git a/analyzer/lib/src/summary2/type_builder.dart b/analyzer/lib/src/summary2/type_builder.dart
new file mode 100644
index 0000000..ffa1d14
--- /dev/null
+++ b/analyzer/lib/src/summary2/type_builder.dart
@@ -0,0 +1,18 @@
+// 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/type.dart';
+
+/// The builder for a [DartType] represented by a node.
+abstract class TypeBuilder implements DartType {
+  /// Build the type, and set it for the corresponding node.
+  /// Does nothing if the type has been already built.
+  ///
+  /// Return the built type.
+  DartType build();
+
+  noSuchMethod(Invocation invocation) {
+    return super.noSuchMethod(invocation);
+  }
+}
diff --git a/analyzer/lib/src/summary2/types_builder.dart b/analyzer/lib/src/summary2/types_builder.dart
new file mode 100644
index 0000000..0fa8a2b
--- /dev/null
+++ b/analyzer/lib/src/summary2/types_builder.dart
@@ -0,0 +1,352 @@
+// 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/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/type_system.dart';
+import 'package:analyzer/src/summary2/default_types_builder.dart';
+import 'package:analyzer/src/summary2/lazy_ast.dart';
+import 'package:analyzer/src/summary2/type_builder.dart';
+
+class NodesToBuildType {
+  final List<AstNode> declarations = [];
+  final List<TypeBuilder> typeBuilders = [];
+
+  void addDeclaration(AstNode node) {
+    declarations.add(node);
+  }
+
+  void addTypeBuilder(TypeBuilder builder) {
+    typeBuilders.add(builder);
+  }
+}
+
+class TypesBuilder {
+  final Dart2TypeSystem typeSystem;
+
+  TypesBuilder(this.typeSystem);
+
+  DynamicTypeImpl get _dynamicType => DynamicTypeImpl.instance;
+
+  VoidTypeImpl get _voidType => VoidTypeImpl.instance;
+
+  /// Build types for all type annotations, and set types for declarations.
+  void build(NodesToBuildType nodes) {
+    DefaultTypesBuilder(typeSystem).build(nodes.declarations);
+
+    for (var builder in nodes.typeBuilders) {
+      builder.build();
+    }
+
+    _MixinsInference(typeSystem).perform(nodes.declarations);
+
+    for (var declaration in nodes.declarations) {
+      _declaration(declaration);
+    }
+  }
+
+  FunctionType _buildFunctionType(
+    TypeParameterList typeParameterList,
+    TypeAnnotation returnTypeNode,
+    FormalParameterList parameterList,
+  ) {
+    var returnType = returnTypeNode?.type ?? _dynamicType;
+
+    List<TypeParameterElement> typeParameters;
+    if (typeParameterList != null) {
+      typeParameters = typeParameterList.typeParameters
+          .map<TypeParameterElement>((p) => p.declaredElement)
+          .toList();
+    } else {
+      typeParameters = const <TypeParameterElement>[];
+    }
+
+    var formalParameters = parameterList.parameters.map((parameter) {
+      return ParameterElementImpl.synthetic(
+        parameter.identifier?.name ?? '',
+        _getType(parameter),
+        // ignore: deprecated_member_use_from_same_package
+        parameter.kind,
+      );
+    }).toList();
+
+    return FunctionTypeImpl.synthetic(
+      returnType,
+      typeParameters,
+      formalParameters,
+    );
+  }
+
+  void _classDeclaration(ClassDeclaration node) {}
+
+  void _declaration(AstNode node) {
+    if (node is ClassDeclaration) {
+      _classDeclaration(node);
+    } else if (node is ClassTypeAlias) {
+      // TODO(scheglov) ???
+    } else if (node is FieldFormalParameter) {
+      _fieldFormalParameter(node);
+    } else if (node is FunctionDeclaration) {
+      var returnType = node.returnType?.type;
+      if (returnType == null) {
+        if (node.isSetter) {
+          returnType = _voidType;
+        } else {
+          returnType = _dynamicType;
+        }
+      }
+      LazyAst.setReturnType(node, returnType);
+    } else if (node is FunctionTypeAlias) {
+      _functionTypeAlias(node);
+    } else if (node is FunctionTypedFormalParameter) {
+      _functionTypedFormalParameter(node);
+    } else if (node is GenericTypeAlias) {
+      // TODO(scheglov) ???
+    } else if (node is MethodDeclaration) {
+      var returnType = node.returnType?.type;
+      if (returnType == null) {
+        if (node.isSetter) {
+          returnType = _voidType;
+        } else if (node.isOperator && node.name.name == '[]=') {
+          returnType = _voidType;
+        } else {
+          returnType = _dynamicType;
+        }
+      }
+      LazyAst.setReturnType(node, returnType);
+    } else if (node is MixinDeclaration) {
+      // TODO(scheglov) ???
+    } else if (node is SimpleFormalParameter) {
+      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 _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 _functionTypeAlias(FunctionTypeAlias node) {
+    var returnTypeNode = node.returnType;
+    LazyAst.setReturnType(node, returnTypeNode?.type ?? _dynamicType);
+  }
+
+  void _functionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    var type = _buildFunctionType(
+      node.typeParameters,
+      node.returnType,
+      node.parameters,
+    );
+    LazyAst.setType(node, type);
+  }
+
+  static DartType _getType(FormalParameter node) {
+    if (node is DefaultFormalParameter) {
+      return _getType(node.parameter);
+    }
+    return LazyAst.getType(node);
+  }
+}
+
+/// Performs mixins inference in a [ClassDeclaration].
+class _MixinInference {
+  final Dart2TypeSystem typeSystem;
+
+  InterfaceType classType;
+  List<InterfaceType> mixinTypes = [];
+  List<InterfaceType> supertypesForMixinInference;
+
+  _MixinInference(this.typeSystem, this.classType);
+
+  void perform(WithClause withClause) {
+    if (withClause == null) return;
+
+    for (var mixinNode in withClause.mixinTypes) {
+      var mixinType = _inferSingle(mixinNode);
+      mixinTypes.add(mixinType);
+
+      _addSupertypes(mixinType);
+    }
+  }
+
+  void _addSupertypes(InterfaceType type) {
+    if (supertypesForMixinInference != null) {
+      ClassElementImpl.collectAllSupertypes(
+        supertypesForMixinInference,
+        type,
+        classType,
+      );
+    }
+  }
+
+  InterfaceType _findInterfaceTypeForElement(
+    ClassElement element,
+    List<InterfaceType> interfaceTypes,
+  ) {
+    for (var interfaceType in interfaceTypes) {
+      if (interfaceType.element == element) return interfaceType;
+    }
+    return null;
+  }
+
+  List<InterfaceType> _findInterfaceTypesForConstraints(
+    List<InterfaceType> constraints,
+    List<InterfaceType> interfaceTypes,
+  ) {
+    var result = <InterfaceType>[];
+    for (var constraint in constraints) {
+      var interfaceType = _findInterfaceTypeForElement(
+        constraint.element,
+        interfaceTypes,
+      );
+
+      // No matching interface type found, so inference fails.
+      if (interfaceType == null) {
+        return null;
+      }
+
+      result.add(interfaceType);
+    }
+    return result;
+  }
+
+  InterfaceType _inferSingle(TypeName mixinNode) {
+    var mixinType = _interfaceType(mixinNode.type);
+
+    if (mixinNode.typeArguments != null) {
+      return mixinType;
+    }
+
+    var mixinElement = mixinType.element;
+    if (mixinElement.typeParameters.isEmpty) {
+      return mixinType;
+    }
+
+    var mixinSupertypeConstraints =
+        typeSystem.gatherMixinSupertypeConstraintsForInference(mixinElement);
+    if (mixinSupertypeConstraints.isEmpty) {
+      return mixinType;
+    }
+
+    if (supertypesForMixinInference == null) {
+      supertypesForMixinInference = <InterfaceType>[];
+      _addSupertypes(classType.superclass);
+      for (var previousMixinType in mixinTypes) {
+        _addSupertypes(previousMixinType);
+      }
+    }
+
+    var matchingInterfaceTypes = _findInterfaceTypesForConstraints(
+      mixinSupertypeConstraints,
+      supertypesForMixinInference,
+    );
+
+    // Note: if matchingInterfaceType is null, that's an error.  Also,
+    // if there are multiple matching interface types that use
+    // different type parameters, that's also an error.  But we can't
+    // report errors from the linker, so we just use the
+    // first matching interface type (if there is one).  The error
+    // detection logic is implemented in the ErrorVerifier.
+    if (matchingInterfaceTypes == null) {
+      return mixinType;
+    }
+
+    // Try to pattern match matchingInterfaceTypes against
+    // mixinSupertypeConstraints to find the correct set of type
+    // parameters to apply to the mixin.
+    var inferredMixin = typeSystem.matchSupertypeConstraints(
+      mixinElement,
+      mixinSupertypeConstraints,
+      matchingInterfaceTypes,
+    );
+    if (inferredMixin != null) {
+      mixinType = inferredMixin;
+      mixinNode.type = inferredMixin;
+    }
+
+    return mixinType;
+  }
+
+  InterfaceType _interfaceType(DartType type) {
+    if (type is InterfaceType && !type.element.isEnum) {
+      return type;
+    }
+    return typeSystem.typeProvider.objectType;
+  }
+}
+
+/// Performs mixin inference for all declarations.
+class _MixinsInference {
+  final Dart2TypeSystem typeSystem;
+
+  _MixinsInference(this.typeSystem);
+
+  void perform(List<AstNode> declarations) {
+    for (var node in declarations) {
+      if (node is ClassDeclaration || node is ClassTypeAlias) {
+        ClassElementImpl element = (node as Declaration).declaredElement;
+        element.linkedMixinInferenceCallback = _callbackWhenRecursion;
+      }
+    }
+
+    for (var declaration in declarations) {
+      _inferDeclaration(declaration);
+    }
+  }
+
+  /// This method is invoked when mixins are asked from the [element], and
+  /// we are inferring the [element] now, i.e. there is a loop.
+  ///
+  /// This is an error. So, we return the empty list, and break the loop.
+  List<InterfaceType> _callbackWhenLoop(ClassElementImpl element) {
+    element.linkedMixinInferenceCallback = null;
+    return <InterfaceType>[];
+  }
+
+  /// This method is invoked when mixins are asked from the [element], and
+  /// we are not inferring the [element] now, i.e. there is no loop.
+  List<InterfaceType> _callbackWhenRecursion(ClassElementImpl element) {
+    _inferDeclaration(element.linkedNode);
+    // The inference was successful, let the element return actual mixins.
+    return null;
+  }
+
+  void _infer(ClassElementImpl element, WithClause withClause) {
+    element.linkedMixinInferenceCallback = _callbackWhenLoop;
+    try {
+      _MixinInference(typeSystem, element.type).perform(withClause);
+    } finally {
+      element.linkedMixinInferenceCallback = null;
+    }
+  }
+
+  void _inferDeclaration(AstNode node) {
+    if (node is ClassDeclaration) {
+      _infer(node.declaredElement, node.withClause);
+    } else if (node is ClassTypeAlias) {
+      _infer(node.declaredElement, node.withClause);
+    }
+  }
+}
diff --git a/analyzer/lib/src/task/api/dart.dart b/analyzer/lib/src/task/api/dart.dart
index f1f19e6..9064e25 100644
--- a/analyzer/lib/src/task/api/dart.dart
+++ b/analyzer/lib/src/task/api/dart.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/task/api/model.dart';
-import 'package:analyzer/src/task/dart.dart';
 
 /**
  * The analysis errors associated with a [Source] representing a compilation
@@ -89,8 +88,7 @@
  * The result is only available for [Source]s representing a compilation unit.
  */
 final ResultDescriptor<CompilationUnit> PARSED_UNIT =
-    new ResultDescriptor<CompilationUnit>('PARSED_UNIT', null,
-        cachingPolicy: AST_CACHING_POLICY);
+    new ResultDescriptor<CompilationUnit>('PARSED_UNIT', null);
 
 /**
  * The resolved [CompilationUnit] associated with a compilation unit, with
@@ -99,8 +97,7 @@
  * The result is only available for [LibrarySpecificUnit]s.
  */
 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT', null,
-        cachingPolicy: AST_CACHING_POLICY);
+    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT', null);
 
 /**
  * The kind of a [Source].
@@ -116,9 +113,8 @@
  *
  * The result is only available for [Source]s representing a compilation unit.
  */
-final ResultDescriptor<Token> TOKEN_STREAM = new ResultDescriptor<Token>(
-    'TOKEN_STREAM', null,
-    cachingPolicy: TOKEN_STREAM_CACHING_POLICY);
+final ResultDescriptor<Token> TOKEN_STREAM =
+    new ResultDescriptor<Token>('TOKEN_STREAM', null);
 
 /**
  * The sources of the Dart files that a library consists of.
diff --git a/analyzer/lib/src/task/api/general.dart b/analyzer/lib/src/task/api/general.dart
index 2f7ab11..d884116 100644
--- a/analyzer/lib/src/task/api/general.dart
+++ b/analyzer/lib/src/task/api/general.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/task/api/model.dart b/analyzer/lib/src/task/api/model.dart
index fe0edef..2d13057 100644
--- a/analyzer/lib/src/task/api/model.dart
+++ b/analyzer/lib/src/task/api/model.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/task/api/yaml.dart b/analyzer/lib/src/task/api/yaml.dart
index 8bfe390..aacc75d 100644
--- a/analyzer/lib/src/task/api/yaml.dart
+++ b/analyzer/lib/src/task/api/yaml.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/task/dart.dart b/analyzer/lib/src/task/dart.dart
deleted file mode 100644
index 36dd7f6..0000000
--- a/analyzer/lib/src/task/dart.dart
+++ /dev/null
@@ -1,5601 +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.
-
-import 'dart:collection';
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_resolution_map.dart';
-import 'package:analyzer/dart/ast/token.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/error/error.dart';
-import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/exception/exception.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/source/line_info.dart';
-import 'package:analyzer/src/context/cache.dart';
-import 'package:analyzer/src/dart/ast/ast.dart'
-    show
-        CompilationUnitImpl,
-        NamespaceDirectiveImpl,
-        UriBasedDirectiveImpl,
-        UriValidationCode;
-import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/constant/constant_verifier.dart';
-import 'package:analyzer/src/dart/constant/evaluation.dart';
-import 'package:analyzer/src/dart/element/builder.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
-import 'package:analyzer/src/dart/scanner/scanner.dart';
-import 'package:analyzer/src/dart/sdk/patch.dart';
-import 'package:analyzer/src/dart/sdk/sdk.dart';
-import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/error/inheritance_override.dart';
-import 'package:analyzer/src/error/pending_error.dart';
-import 'package:analyzer/src/generated/constant.dart';
-import 'package:analyzer/src/generated/declaration_resolver.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/error_verifier.dart';
-import 'package:analyzer/src/generated/incremental_resolver.dart';
-import 'package:analyzer/src/generated/parser.dart';
-import 'package:analyzer/src/generated/resolver.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:analyzer/src/ignore_comments/ignore_info.dart';
-import 'package:analyzer/src/services/lint.dart';
-import 'package:analyzer/src/task/api/dart.dart';
-import 'package:analyzer/src/task/api/general.dart';
-import 'package:analyzer/src/task/api/model.dart';
-import 'package:analyzer/src/task/driver.dart';
-import 'package:analyzer/src/task/general.dart';
-import 'package:analyzer/src/task/inputs.dart';
-import 'package:analyzer/src/task/model.dart';
-import 'package:analyzer/src/task/strong/checker.dart';
-import 'package:analyzer/src/task/strong_mode.dart';
-
-export 'package:analyzer/src/dart/constant/evaluation.dart'
-    show ConstantEvaluationTarget;
-export 'package:analyzer/src/ignore_comments/ignore_info.dart';
-
-/**
- * The [ResultCachingPolicy] for ASTs.
- */
-const ResultCachingPolicy AST_CACHING_POLICY =
-    const SimpleResultCachingPolicy(1024 * 64, 32);
-
-/**
- * The [ResultCachingPolicy] for lists of [ConstantEvaluationTarget]s.
- */
-const ResultCachingPolicy CONSTANT_EVALUATION_TARGET_LIST_POLICY =
-    const SimpleResultCachingPolicy(-1, -1);
-
-/**
- * The [ResultCachingPolicy] for [ConstantEvaluationTarget]s.
- */
-const ResultCachingPolicy CONSTANT_EVALUATION_TARGET_POLICY =
-    const SimpleResultCachingPolicy(-1, -1);
-
-/**
- * The [ResultCachingPolicy] for [Element]s.
- */
-const ResultCachingPolicy ELEMENT_CACHING_POLICY =
-    const SimpleResultCachingPolicy(-1, -1);
-
-/**
- * The [ResultCachingPolicy] for [TOKEN_STREAM].
- */
-const ResultCachingPolicy TOKEN_STREAM_CACHING_POLICY =
-    const SimpleResultCachingPolicy(1, 1);
-
-/**
- * The [ResultCachingPolicy] for [UsedImportedElements]s.
- */
-const ResultCachingPolicy USED_IMPORTED_ELEMENTS_POLICY =
-    const SimpleResultCachingPolicy(-1, -1);
-
-/**
- * The [ResultCachingPolicy] for [UsedLocalElements]s.
- */
-const ResultCachingPolicy USED_LOCAL_ELEMENTS_POLICY =
-    const SimpleResultCachingPolicy(-1, -1);
-
-/**
- * The errors produced while building a library's directives.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ListResultDescriptor<AnalysisError> BUILD_DIRECTIVES_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'BUILD_DIRECTIVES_ERRORS', AnalysisError.NO_ERRORS);
-/**
- * The errors produced while building a library element.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ListResultDescriptor<AnalysisError> BUILD_LIBRARY_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'BUILD_LIBRARY_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * A list of the [ConstantEvaluationTarget]s defined in a unit.  This includes
- * constants defined at top level, statically inside classes, and local to
- * functions, as well as constant constructors, annotations, and default values
- * of parameters.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<ConstantEvaluationTarget>
-    COMPILATION_UNIT_CONSTANTS =
-    new ListResultDescriptor<ConstantEvaluationTarget>(
-        'COMPILATION_UNIT_CONSTANTS', null,
-        cachingPolicy: CONSTANT_EVALUATION_TARGET_LIST_POLICY);
-
-/**
- * The element model associated with a single compilation unit.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnitElement> COMPILATION_UNIT_ELEMENT =
-    new ResultDescriptor<CompilationUnitElement>(
-        'COMPILATION_UNIT_ELEMENT', null,
-        cachingPolicy: ELEMENT_CACHING_POLICY);
-
-/**
- * The list of [ConstantEvaluationTarget]s on which the target constant element
- * depends.
- *
- * The result is only available for targets representing a
- * [ConstantEvaluationTarget] (i.e. a constant variable declaration, a constant
- * constructor, or a parameter element with a default value).
- */
-final ListResultDescriptor<ConstantEvaluationTarget> CONSTANT_DEPENDENCIES =
-    new ListResultDescriptor<ConstantEvaluationTarget>(
-        'CONSTANT_DEPENDENCIES', const <ConstantEvaluationTarget>[]);
-
-/**
- * The flag specifying that the target constant element expression AST is
- * resolved, i.e. identifiers have all required elements set.
- *
- * The result is only available for targets representing a
- * [ConstantEvaluationTarget] (i.e. a constant variable declaration, a constant
- * constructor, or a parameter element with a default value).
- */
-final ResultDescriptor<bool> CONSTANT_EXPRESSION_RESOLVED =
-    new ResultDescriptor<bool>('CONSTANT_EXPRESSION_RESOLVED', false);
-
-/**
- * The list of [ConstantEvaluationTarget]s on which constant expressions of a
- * unit depend.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<ConstantEvaluationTarget>
-    CONSTANT_EXPRESSIONS_DEPENDENCIES =
-    new ListResultDescriptor<ConstantEvaluationTarget>(
-        'CONSTANT_EXPRESSIONS_DEPENDENCIES',
-        const <ConstantEvaluationTarget>[]);
-
-/**
- * A [ConstantEvaluationTarget] that has been successfully constant-evaluated.
- *
- * TODO(paulberry): is ELEMENT_CACHING_POLICY the correct caching policy?
- *
- * The result is only available for [ConstantEvaluationTarget]s.
- *
- */
-final ResultDescriptor<ConstantEvaluationTarget> CONSTANT_VALUE =
-    new ResultDescriptor<ConstantEvaluationTarget>('CONSTANT_VALUE', null,
-        cachingPolicy: CONSTANT_EVALUATION_TARGET_POLICY);
-
-/**
- * The sources representing the libraries that include a given source as a part.
- *
- * The result is only available for [Source]s representing a compilation unit.
- */
-final ListResultDescriptor<Source> CONTAINING_LIBRARIES =
-    new ListResultDescriptor<Source>('CONTAINING_LIBRARIES', const <Source>[]);
-
-/**
- * The flag specifying that [RESOLVED_UNIT] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT1] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT1 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT1', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT10] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT10 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT10', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT11] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT11 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT11', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT12] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT12 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT12', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT2] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT2 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT2', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT3] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT3 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT3', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT4] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT4 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT4', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT5] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT5 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT5', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT6] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT6 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT6', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT7] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT7 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT7', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT8] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT8 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT8', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT9] has been been computed for this
- * compilation unit (without requiring that the AST for it still be in cache).
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<bool> CREATED_RESOLVED_UNIT9 =
-    new ResultDescriptor<bool>('CREATED_RESOLVED_UNIT9', false);
-
-/**
- * All [AnalysisError]s results for [Source]s.
- */
-final List<ListResultDescriptor<AnalysisError>> ERROR_SOURCE_RESULTS =
-    <ListResultDescriptor<AnalysisError>>[
-  BUILD_DIRECTIVES_ERRORS,
-  BUILD_LIBRARY_ERRORS,
-  PARSE_ERRORS,
-  SCAN_ERRORS,
-];
-
-/**
- * All [AnalysisError]s results in for [LibrarySpecificUnit]s.
- */
-final List<ListResultDescriptor<AnalysisError>> ERROR_UNIT_RESULTS =
-    <ListResultDescriptor<AnalysisError>>[
-  HINTS,
-  LIBRARY_UNIT_ERRORS,
-  LINTS,
-  RESOLVE_DIRECTIVES_ERRORS,
-  RESOLVE_TYPE_BOUNDS_ERRORS,
-  RESOLVE_TYPE_NAMES_ERRORS,
-  RESOLVE_UNIT_ERRORS,
-  STRONG_MODE_ERRORS,
-  VARIABLE_REFERENCE_ERRORS,
-  VERIFY_ERRORS
-];
-
-/**
- * The sources representing the export closure of a library.
- * The [Source]s include only library sources, not their units.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ListResultDescriptor<Source> EXPORT_SOURCE_CLOSURE =
-    new ListResultDescriptor<Source>('EXPORT_SOURCE_CLOSURE', null);
-
-/**
- * The errors produced while generating hints a compilation unit.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<AnalysisError> HINTS =
-    new ListResultDescriptor<AnalysisError>(
-        'HINT_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The ignore information for a [Source].
- */
-final ResultDescriptor<IgnoreInfo> IGNORE_INFO =
-    new ResultDescriptor<IgnoreInfo>('IGNORE_INFO', null);
-
-/**
- * A list of the [VariableElement]s whose type should be inferred that another
- * inferable static variable (the target) depends on.
- *
- * The result is only available for [VariableElement]s, and only when strong
- * mode is enabled.
- */
-final ListResultDescriptor<VariableElement>
-    INFERABLE_STATIC_VARIABLE_DEPENDENCIES =
-    new ListResultDescriptor<VariableElement>(
-        'INFERABLE_STATIC_VARIABLE_DEPENDENCIES', null);
-
-/**
- * A list of the [VariableElement]s defined in a unit whose type should be
- * inferred. This includes variables defined at the library level as well as
- * static members inside classes.
- *
- * The result is only available for [LibrarySpecificUnit]s, and only when strong
- * mode is enabled.
- */
-final ListResultDescriptor<VariableElement> INFERABLE_STATIC_VARIABLES_IN_UNIT =
-    new ListResultDescriptor<VariableElement>(
-        'INFERABLE_STATIC_VARIABLES_IN_UNIT', null);
-
-/**
- * An inferable static variable ([VariableElement]) whose type has been
- * inferred.
- *
- * The result is only available for [VariableElement]s, and only when strong
- * mode is enabled.
- */
-final ResultDescriptor<VariableElement> INFERRED_STATIC_VARIABLE =
-    new ResultDescriptor<VariableElement>('INFERRED_STATIC_VARIABLE', null,
-        cachingPolicy: ELEMENT_CACHING_POLICY);
-
-/**
- * A list of the [LibraryElement]s that make up the strongly connected
- * component in the import/export graph in which the target resides.
- *
- * Only non-empty in strongMode.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ListResultDescriptor<LibraryElement> LIBRARY_CYCLE =
-    new ListResultDescriptor<LibraryElement>('LIBRARY_CYCLE', null);
-
-/**
- * A list of the [LibrarySpecificUnit]s that comprise all of the parts and
- * libraries in the direct import/export dependencies of the library cycle
- * of the target, with the intra-component dependencies excluded.
- *
- * Only non-empty in strongMode.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ListResultDescriptor<LibrarySpecificUnit> LIBRARY_CYCLE_DEPENDENCIES =
-    new ListResultDescriptor<LibrarySpecificUnit>(
-        'LIBRARY_CYCLE_DEPENDENCIES', null);
-
-/**
- * A list of the [LibrarySpecificUnit]s (including all parts) that make up
- * the strongly connected component in the import/export graph in which the
- * target resides.
- *
- * Only non-empty in strongMode.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ListResultDescriptor<LibrarySpecificUnit> LIBRARY_CYCLE_UNITS =
-    new ListResultDescriptor<LibrarySpecificUnit>('LIBRARY_CYCLE_UNITS', null);
-
-/**
- * The partial [LibraryElement] associated with a library.
- *
- * The [LibraryElement] and its [CompilationUnitElement]s are attached to each
- * other. Directives 'library', 'part' and 'part of' are resolved.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT1 =
-    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT1', null,
-        cachingPolicy: ELEMENT_CACHING_POLICY);
-
-/**
- * The partial [LibraryElement] associated with a library.
- *
- * In addition to [LIBRARY_ELEMENT1] also [LibraryElement.imports] and
- * [LibraryElement.exports] are set.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT2 =
-    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT2', null,
-        cachingPolicy: ELEMENT_CACHING_POLICY);
-
-/**
- * The partial [LibraryElement] associated with a library.
- *
- * In addition to [LIBRARY_ELEMENT2] the [LibraryElement.publicNamespace] is set.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT3 =
-    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT3', null,
-        cachingPolicy: ELEMENT_CACHING_POLICY);
-
-/**
- * The partial [LibraryElement] associated with a library.
- *
- * In addition to [LIBRARY_ELEMENT3] the [LibraryElement.entryPoint] is set,
- * if the library does not declare one already and one of the exported
- * libraries exports one.
- *
- * Also [LibraryElement.exportNamespace] is set.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT4 =
-    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT4', null,
-        cachingPolicy: ELEMENT_CACHING_POLICY);
-
-/**
- * The partial [LibraryElement] associated with a library.
- *
- * [LIBRARY_ELEMENT5] plus resolved types type parameter bounds.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT5 =
-    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT5', null,
-        cachingPolicy: ELEMENT_CACHING_POLICY);
-
-/**
- * The partial [LibraryElement] associated with a library.
- *
- * [LIBRARY_ELEMENT5] plus resolved types for every element.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT6 =
-    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT6', null,
-        cachingPolicy: ELEMENT_CACHING_POLICY);
-
-/**
- * The partial [LibraryElement] associated with a library.
- *
- * [LIBRARY_ELEMENT6] plus [RESOLVED_UNIT7] for all library units.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT7 =
-    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT7', null,
-        cachingPolicy: ELEMENT_CACHING_POLICY);
-
-/**
- * The partial [LibraryElement] associated with a library.
- *
- * [LIBRARY_ELEMENT7] for the library and its import/export closure.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT8 =
-    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT8', null,
-        cachingPolicy: ELEMENT_CACHING_POLICY);
-
-/**
- * The partial [LibraryElement] associated with a library.
- *
- * The same as a [LIBRARY_ELEMENT8].
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT9 =
-    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT9', null,
-        cachingPolicy: ELEMENT_CACHING_POLICY);
-
-/**
- * List of all `LIBRARY_ELEMENT` results.
- */
-final List<ResultDescriptor<LibraryElement>> LIBRARY_ELEMENT_RESULTS =
-    <ResultDescriptor<LibraryElement>>[
-  LIBRARY_ELEMENT1,
-  LIBRARY_ELEMENT2,
-  LIBRARY_ELEMENT3,
-  LIBRARY_ELEMENT4,
-  LIBRARY_ELEMENT5,
-  LIBRARY_ELEMENT6,
-  LIBRARY_ELEMENT7,
-  LIBRARY_ELEMENT8,
-  LIBRARY_ELEMENT9,
-  LIBRARY_ELEMENT
-];
-
-/**
- * The flag specifying whether all analysis errors are computed in a specific
- * library.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<bool> LIBRARY_ERRORS_READY =
-    new ResultDescriptor<bool>('LIBRARY_ERRORS_READY', false);
-
-/**
- * The [LibrarySpecificUnit]s that a library consists of.
- *
- * The list will include the defining unit and units for [INCLUDED_PARTS].
- * So, it is never empty or `null`.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ListResultDescriptor<LibrarySpecificUnit> LIBRARY_SPECIFIC_UNITS =
-    new ListResultDescriptor<LibrarySpecificUnit>(
-        'LIBRARY_SPECIFIC_UNITS', const <LibrarySpecificUnit>[]);
-
-/**
- * The analysis errors associated with a compilation unit in a specific library.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<AnalysisError> LIBRARY_UNIT_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'LIBRARY_UNIT_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The errors produced while generating lints for a compilation unit.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<AnalysisError> LINTS =
-    new ListResultDescriptor<AnalysisError>(
-        'LINT_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The errors produced while parsing a compilation unit.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [Source]s representing a compilation unit.
- */
-final ListResultDescriptor<AnalysisError> PARSE_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'PARSE_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The list of [PendingError]s for a compilation unit.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<PendingError> PENDING_ERRORS =
-    new ListResultDescriptor<PendingError>(
-        'PENDING_ERRORS', const <PendingError>[]);
-
-/**
- * The flag specifying that [LIBRARY_ELEMENT2] is ready for a library and its
- * import/export closure.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<bool> READY_LIBRARY_ELEMENT2 =
-    new ResultDescriptor<bool>('READY_LIBRARY_ELEMENT2', false);
-
-/**
- * The flag specifying that [LIBRARY_ELEMENT6] is ready for a library and its
- * import/export closure.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<bool> READY_LIBRARY_ELEMENT6 =
-    new ResultDescriptor<bool>('READY_LIBRARY_ELEMENT6', false);
-
-/**
- * The flag specifying that [LIBRARY_ELEMENT7] is ready for a library and its
- * import/export closure.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<bool> READY_LIBRARY_ELEMENT7 =
-    new ResultDescriptor<bool>('READY_LIBRARY_ELEMENT7', false);
-
-/**
- * The flag specifying that [RESOLVED_UNIT] is ready for all of the units of a
- * library.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ResultDescriptor<bool> READY_RESOLVED_UNIT =
-    new ResultDescriptor<bool>('READY_RESOLVED_UNIT', false);
-
-/**
- * The sources of the Dart files that a library references.
- *
- * The list is the union of [IMPORTED_LIBRARIES], [EXPORTED_LIBRARIES] and
- * [UNITS] of the defining unit and [INCLUDED_PARTS]. Never empty or `null`.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ListResultDescriptor<Source> REFERENCED_SOURCES =
-    new ListResultDescriptor<Source>('REFERENCED_SOURCES', const <Source>[]);
-
-/**
- * The list of [ConstantEvaluationTarget]s on which error verification depends.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<ConstantEvaluationTarget> REQUIRED_CONSTANTS =
-    new ListResultDescriptor<ConstantEvaluationTarget>(
-        'REQUIRED_CONSTANTS', const <ConstantEvaluationTarget>[]);
-
-/**
- * The errors produced while resolving a library's directives.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [Source]s representing a library.
- */
-final ListResultDescriptor<AnalysisError> RESOLVE_DIRECTIVES_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'RESOLVE_DIRECTIVES_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The errors produced while resolving bounds of type parameters of classes,
- * class and function aliases.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<AnalysisError> RESOLVE_TYPE_BOUNDS_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'RESOLVE_TYPE_BOUNDS_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The errors produced while resolving type names.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<AnalysisError> RESOLVE_TYPE_NAMES_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'RESOLVE_TYPE_NAMES_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The errors produced while resolving a full compilation unit.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<AnalysisError> RESOLVE_UNIT_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'RESOLVE_UNIT_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The partially resolved [CompilationUnit] associated with a compilation unit.
- *
- * Tasks that use this value as an input can assume that the [SimpleIdentifier]s
- * at all declaration sites have been bound to the element defined by the
- * declaration, except for the constants defined in an 'enum' declaration.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT1 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT1', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * The resolved [CompilationUnit] associated with a compilation unit in which
- * the types of class members have been inferred in addition to everything that
- * is true of a [RESOLVED_UNIT9].
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT10 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT10', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * The resolved [CompilationUnit] associated with a compilation unit, with
- * constants not yet resolved.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT11 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT11', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * The resolved [CompilationUnit] associated with a compilation unit, with
- * constants resolved.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT12 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT12', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * The partially resolved [CompilationUnit] associated with a compilation unit.
- *
- * In addition to what is true of a [RESOLVED_UNIT1], tasks that use this value
- * as an input can assume that its directives have been resolved.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT2 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT2', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * The partially resolved [CompilationUnit] associated with a compilation unit.
- *
- * Tasks that use this value as an input can assume that the [SimpleIdentifier]s
- * at all declaration sites have been bound to the element defined by the
- * declaration, including the constants defined in an 'enum' declaration.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT3 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT3', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * The partially resolved [CompilationUnit] associated with a compilation unit.
- *
- * In addition to what is true of a [RESOLVED_UNIT3], tasks that use this value
- * as an input can assume that the types associated with type bounds have been
- * resolved.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT4 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT4', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * The partially resolved [CompilationUnit] associated with a compilation unit.
- *
- * In addition to what is true of a [RESOLVED_UNIT4], tasks that use this value
- * as an input can assume that the types associated with declarations have been
- * resolved. This includes the types of superclasses, mixins, interfaces,
- * fields, return types, parameters, and local variables.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT5 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT5', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * The partially resolved [CompilationUnit] associated with a compilation unit.
- *
- * In addition to what is true of a [RESOLVED_UNIT5], tasks that use this value
- * as an input can assume that references to local variables and formal
- * parameters have been resolved.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT6 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT6', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * The partially resolved [CompilationUnit] associated with a compilation unit.
- *
- * In addition to what is true of a [RESOLVED_UNIT6], tasks that use this value
- * as an input can assume that elements and types associated with expressions
- * outside of method bodies (essentially initializers) have been initially
- * resolved.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT7 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT7', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * The partially resolved [CompilationUnit] associated with a compilation unit.
- *
- * In addition to what is true of a [RESOLVED_UNIT7], tasks that use this value
- * as an input can assume that the types of static variables have been inferred.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT8 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT8', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * The partially resolved [CompilationUnit] associated with a compilation unit.
- *
- * In addition to what is true of a [RESOLVED_UNIT8], tasks that use this value
- * as an input can assume that the initializers of instance variables have been
- * re-resolved.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ResultDescriptor<CompilationUnit> RESOLVED_UNIT9 =
-    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT9', null,
-        cachingPolicy: AST_CACHING_POLICY);
-
-/**
- * List of all `RESOLVED_UNITx` results.
- */
-final List<ResultDescriptor<CompilationUnit>> RESOLVED_UNIT_RESULTS =
-    <ResultDescriptor<CompilationUnit>>[
-  RESOLVED_UNIT1,
-  RESOLVED_UNIT2,
-  RESOLVED_UNIT3,
-  RESOLVED_UNIT4,
-  RESOLVED_UNIT5,
-  RESOLVED_UNIT6,
-  RESOLVED_UNIT7,
-  RESOLVED_UNIT8,
-  RESOLVED_UNIT9,
-  RESOLVED_UNIT10,
-  RESOLVED_UNIT11,
-  RESOLVED_UNIT12,
-  RESOLVED_UNIT
-];
-
-/**
- * The errors produced while scanning a compilation unit.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [Source]s representing a compilation unit.
- */
-final ListResultDescriptor<AnalysisError> SCAN_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'SCAN_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The errors produced while resolving a static [VariableElement] initializer.
- *
- * The result is only available for [VariableElement]s, and only when strong
- * mode is enabled.
- */
-final ListResultDescriptor<AnalysisError> STATIC_VARIABLE_RESOLUTION_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'STATIC_VARIABLE_RESOLUTION_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * A list of the [AnalysisError]s reported while resolving static
- * [INFERABLE_STATIC_VARIABLES_IN_UNIT] defined in a unit.
- *
- * The result is only available for [LibrarySpecificUnit]s, and only when strong
- * mode is enabled.
- */
-final ListResultDescriptor<AnalysisError>
-    STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT =
-    new ListResultDescriptor<AnalysisError>(
-        'STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT', AnalysisError.NO_ERRORS);
-
-/**
- * The additional strong mode errors produced while verifying a
- * compilation unit.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [LibrarySpecificUnits]s representing a
- * compilation unit.
- *
- */
-final ListResultDescriptor<AnalysisError> STRONG_MODE_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'STRONG_MODE_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The [TypeProvider] of the [AnalysisContext].
- */
-final ResultDescriptor<TypeProvider> TYPE_PROVIDER =
-    new ResultDescriptor<TypeProvider>('TYPE_PROVIDER', null);
-
-/**
- * The [UsedImportedElements] of a [LibrarySpecificUnit].
- */
-final ResultDescriptor<UsedImportedElements> USED_IMPORTED_ELEMENTS =
-    new ResultDescriptor<UsedImportedElements>('USED_IMPORTED_ELEMENTS', null,
-        cachingPolicy: USED_IMPORTED_ELEMENTS_POLICY);
-
-/**
- * The [UsedLocalElements] of a [LibrarySpecificUnit].
- */
-final ResultDescriptor<UsedLocalElements> USED_LOCAL_ELEMENTS =
-    new ResultDescriptor<UsedLocalElements>('USED_LOCAL_ELEMENTS', null,
-        cachingPolicy: USED_LOCAL_ELEMENTS_POLICY);
-
-/**
- * The errors produced while resolving variable references in a compilation unit.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<AnalysisError> VARIABLE_REFERENCE_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'VARIABLE_REFERENCE_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * The errors produced while verifying a compilation unit.
- *
- * The list will be empty if there were no errors, but will not be `null`.
- *
- * The result is only available for [LibrarySpecificUnit]s.
- */
-final ListResultDescriptor<AnalysisError> VERIFY_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'VERIFY_ERRORS', AnalysisError.NO_ERRORS);
-
-/**
- * Return a list of unique errors for the [Source] of the given [target].
- */
-List<AnalysisError> getTargetSourceErrors(
-    RecordingErrorListener listener, AnalysisTarget target) {
-  Source source = target.source;
-  List<AnalysisError> errors = listener.getErrorsForSource(source);
-  return getUniqueErrors(errors);
-}
-
-/**
- * Return a list of errors containing the errors from the given [errors] list
- * but with duplications removed.
- */
-List<AnalysisError> getUniqueErrors(List<AnalysisError> errors) {
-  if (errors.isEmpty) {
-    return errors;
-  }
-  return errors.toSet().toList();
-}
-
-/**
- * A task that builds a compilation unit element for a single compilation unit.
- */
-class BuildCompilationUnitElementTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input whose value is the AST for the compilation unit.
-   */
-  static const String PARSED_UNIT_INPUT_NAME = 'PARSED_UNIT_INPUT_NAME';
-
-  /**
-   * The name of the input whose value is the source line info.
-   */
-  static const String LINE_INFO_INPUT_NAME = 'LINE_INFO_INPUT_NAME';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'BuildCompilationUnitElementTask',
-      createTask,
-      buildInputs, <ResultDescriptor>[
-    COMPILATION_UNIT_CONSTANTS,
-    COMPILATION_UNIT_ELEMENT,
-    CREATED_RESOLVED_UNIT1,
-    RESOLVED_UNIT1
-  ]);
-
-  /**
-   * Initialize a newly created task to build a compilation unit element for
-   * the given [target] in the given [context].
-   */
-  BuildCompilationUnitElementTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    LibrarySpecificUnit librarySpecificUnit = target;
-    Source source = getRequiredSource();
-    CompilationUnit unit = getRequiredInput(PARSED_UNIT_INPUT_NAME);
-    LineInfo lineInfo = getRequiredInput(LINE_INFO_INPUT_NAME);
-    //
-    // Try to get the existing CompilationUnitElement.
-    //
-    CompilationUnitElement element;
-    {
-      InternalAnalysisContext internalContext =
-          context as InternalAnalysisContext;
-      AnalysisCache analysisCache = internalContext.analysisCache;
-      CacheEntry cacheEntry = internalContext.getCacheEntry(target);
-      element = analysisCache.getValue(target, COMPILATION_UNIT_ELEMENT);
-      if (element == null &&
-          internalContext.aboutToComputeResult(
-              cacheEntry, COMPILATION_UNIT_ELEMENT)) {
-        element = analysisCache.getValue(target, COMPILATION_UNIT_ELEMENT);
-      }
-    }
-    //
-    // Build or reuse CompilationUnitElement.
-    //
-    if (element == null) {
-      CompilationUnitBuilder builder = new CompilationUnitBuilder();
-      element = builder.buildCompilationUnit(
-          source, unit, librarySpecificUnit.library);
-      (element as CompilationUnitElementImpl).lineInfo = lineInfo;
-    } else {
-      new DeclarationResolver().resolve(unit, element);
-    }
-    //
-    // Prepare constants.
-    //
-    ConstantFinder constantFinder = new ConstantFinder();
-    unit.accept(constantFinder);
-    List<ConstantEvaluationTarget> constants =
-        constantFinder.constantsToCompute;
-    //
-    // Record outputs.
-    //
-    outputs[COMPILATION_UNIT_CONSTANTS] = constants;
-    outputs[COMPILATION_UNIT_ELEMENT] = element;
-    outputs[RESOLVED_UNIT1] = unit;
-    outputs[CREATED_RESOLVED_UNIT1] = true;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the given
-   * [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      PARSED_UNIT_INPUT_NAME: PARSED_UNIT.of(unit.unit, flushOnAccess: true),
-      LINE_INFO_INPUT_NAME: LINE_INFO.of(unit.unit)
-    };
-  }
-
-  /**
-   * Create a [BuildCompilationUnitElementTask] based on the given [target] in
-   * the given [context].
-   */
-  static BuildCompilationUnitElementTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new BuildCompilationUnitElementTask(context, target);
-  }
-}
-
-/**
- * A task that builds imports and export directive elements for a library.
- */
-class BuildDirectiveElementsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input whose value is the defining [LIBRARY_ELEMENT1].
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The name of the input for [RESOLVED_UNIT1] of a library unit.
-   */
-  static const String UNIT_INPUT_NAME = 'UNIT_INPUT_NAME';
-
-  /**
-   * The input with a map from referenced sources to their modification times.
-   */
-  static const String SOURCES_MODIFICATION_TIME_INPUT_NAME =
-      'SOURCES_MODIFICATION_TIME_INPUT_NAME';
-
-  /**
-   * The input with a list of [LIBRARY_ELEMENT3]s of imported libraries.
-   */
-  static const String IMPORTS_LIBRARY_ELEMENT_INPUT_NAME =
-      'IMPORTS_LIBRARY_ELEMENT1_INPUT_NAME';
-
-  /**
-   * The input with a list of [LIBRARY_ELEMENT3]s of exported libraries.
-   */
-  static const String EXPORTS_LIBRARY_ELEMENT_INPUT_NAME =
-      'EXPORTS_LIBRARY_ELEMENT_INPUT_NAME';
-
-  /**
-   * The input with a list of [SOURCE_KIND]s of imported libraries.
-   */
-  static const String IMPORTS_SOURCE_KIND_INPUT_NAME =
-      'IMPORTS_SOURCE_KIND_INPUT_NAME';
-
-  /**
-   * The input with a list of [SOURCE_KIND]s of exported libraries.
-   */
-  static const String EXPORTS_SOURCE_KIND_INPUT_NAME =
-      'EXPORTS_SOURCE_KIND_INPUT_NAME';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'BuildDirectiveElementsTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[LIBRARY_ELEMENT2, BUILD_DIRECTIVES_ERRORS]);
-
-  BuildDirectiveElementsTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    LibraryElementImpl libraryElement = getRequiredInput(LIBRARY_INPUT);
-    CompilationUnit libraryUnit = getRequiredInput(UNIT_INPUT_NAME);
-    Map<Source, int> sourceModificationTimeMap =
-        getRequiredInput(SOURCES_MODIFICATION_TIME_INPUT_NAME);
-    Map<Source, LibraryElement> importLibraryMap =
-        getRequiredInput(IMPORTS_LIBRARY_ELEMENT_INPUT_NAME);
-    Map<Source, LibraryElement> exportLibraryMap =
-        getRequiredInput(EXPORTS_LIBRARY_ELEMENT_INPUT_NAME);
-    Map<Source, SourceKind> importSourceKindMap =
-        getRequiredInput(IMPORTS_SOURCE_KIND_INPUT_NAME);
-    Map<Source, SourceKind> exportSourceKindMap =
-        getRequiredInput(EXPORTS_SOURCE_KIND_INPUT_NAME);
-    //
-    // Try to get the existing LibraryElement.
-    //
-    LibraryElement element;
-    {
-      InternalAnalysisContext internalContext =
-          context as InternalAnalysisContext;
-      AnalysisCache analysisCache = internalContext.analysisCache;
-      CacheEntry cacheEntry = internalContext.getCacheEntry(target);
-      element = analysisCache.getValue(target, LIBRARY_ELEMENT2);
-      if (element == null &&
-          internalContext.aboutToComputeResult(cacheEntry, LIBRARY_ELEMENT2)) {
-        element = analysisCache.getValue(target, LIBRARY_ELEMENT2);
-      }
-    }
-    //
-    // Build or reuse the directive elements.
-    //
-    List<AnalysisError> errors;
-    if (element == null) {
-      DirectiveElementBuilder builder = new DirectiveElementBuilder(
-          context,
-          libraryElement,
-          sourceModificationTimeMap,
-          importLibraryMap,
-          importSourceKindMap,
-          exportLibraryMap,
-          exportSourceKindMap);
-      libraryUnit.accept(builder);
-      // See the commentary in the computation of the LIBRARY_CYCLE result
-      // for details on library cycle invalidation.
-      libraryElement.invalidateLibraryCycles();
-      errors = builder.errors;
-    } else {
-      DirectiveResolver resolver = new DirectiveResolver(
-          sourceModificationTimeMap, importSourceKindMap, exportSourceKindMap);
-      libraryUnit.accept(resolver);
-      errors = resolver.errors;
-    }
-    //
-    // Record outputs.
-    //
-    outputs[LIBRARY_ELEMENT2] = libraryElement;
-    outputs[BUILD_DIRECTIVES_ERRORS] = errors;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given library [libSource].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      LIBRARY_INPUT: LIBRARY_ELEMENT1.of(source),
-      UNIT_INPUT_NAME:
-          RESOLVED_UNIT1.of(new LibrarySpecificUnit(source, source)),
-      SOURCES_MODIFICATION_TIME_INPUT_NAME:
-          REFERENCED_SOURCES.of(source).toMapOf(MODIFICATION_TIME),
-      IMPORTS_LIBRARY_ELEMENT_INPUT_NAME:
-          IMPORTED_LIBRARIES.of(source).toMapOf(LIBRARY_ELEMENT1),
-      EXPORTS_LIBRARY_ELEMENT_INPUT_NAME:
-          EXPORTED_LIBRARIES.of(source).toMapOf(LIBRARY_ELEMENT1),
-      IMPORTS_SOURCE_KIND_INPUT_NAME:
-          IMPORTED_LIBRARIES.of(source).toMapOf(SOURCE_KIND),
-      EXPORTS_SOURCE_KIND_INPUT_NAME:
-          EXPORTED_LIBRARIES.of(source).toMapOf(SOURCE_KIND)
-    };
-  }
-
-  /**
-   * Create a [BuildDirectiveElementsTask] based on the given [target] in
-   * the given [context].
-   */
-  static BuildDirectiveElementsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new BuildDirectiveElementsTask(context, target);
-  }
-}
-
-/**
- * A task that builds the elements representing the members of enum
- * declarations.
- */
-class BuildEnumMemberElementsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The name of the [RESOLVED_UNIT1] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'BuildEnumMemberElementsTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[CREATED_RESOLVED_UNIT3, RESOLVED_UNIT3]);
-
-  BuildEnumMemberElementsTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    //
-    // Build the enum members if they have not already been created.
-    //
-    EnumDeclaration findFirstEnum() {
-      NodeList<CompilationUnitMember> members = unit.declarations;
-      int length = members.length;
-      for (int i = 0; i < length; i++) {
-        CompilationUnitMember member = members[i];
-        if (member is EnumDeclaration) {
-          return member;
-        }
-      }
-      return null;
-    }
-
-    EnumDeclaration firstEnum = findFirstEnum();
-    if (firstEnum != null &&
-        resolutionMap
-            .elementDeclaredByEnumDeclaration(firstEnum)
-            .accessors
-            .isEmpty) {
-      EnumMemberBuilder builder = new EnumMemberBuilder(typeProvider);
-      unit.accept(builder);
-    }
-    //
-    // Record outputs.
-    //
-    outputs[CREATED_RESOLVED_UNIT3] = true;
-    outputs[RESOLVED_UNIT3] = unit;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
-      UNIT_INPUT: RESOLVED_UNIT2.of(unit)
-    };
-  }
-
-  /**
-   * Create a [BuildEnumMemberElementsTask] based on the given [target] in
-   * the given [context].
-   */
-  static BuildEnumMemberElementsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new BuildEnumMemberElementsTask(context, target);
-  }
-}
-
-/**
- * A task that builds [EXPORT_NAMESPACE] and [LIBRARY_ELEMENT4] for a library.
- */
-class BuildExportNamespaceTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input for [LIBRARY_ELEMENT3] of a library.
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'BuildExportNamespaceTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[LIBRARY_ELEMENT4]);
-
-  BuildExportNamespaceTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    LibraryElementImpl library = getRequiredInput(LIBRARY_INPUT);
-    //
-    // Compute export namespace.
-    //
-    library.exportNamespace = null;
-    NamespaceBuilder builder = new NamespaceBuilder();
-    Namespace namespace = builder.createExportNamespaceForLibrary(library);
-    library.exportNamespace = namespace;
-    //
-    // Update entry point.
-    //
-    if (library.entryPoint == null) {
-      Iterable<Element> exportedElements = namespace.definedNames.values;
-      library.entryPoint = exportedElements.firstWhere(
-          (element) => element is FunctionElement && element.isEntryPoint,
-          orElse: () => null);
-    }
-    //
-    // Record outputs.
-    //
-    outputs[LIBRARY_ELEMENT4] = library;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given library [libSource].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      LIBRARY_INPUT: LIBRARY_ELEMENT3.of(source),
-      'exportsLibraryPublicNamespace':
-          EXPORT_SOURCE_CLOSURE.of(source).toMapOf(LIBRARY_ELEMENT3)
-    };
-  }
-
-  /**
-   * Create a [BuildExportNamespaceTask] based on the given [target] in
-   * the given [context].
-   */
-  static BuildExportNamespaceTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new BuildExportNamespaceTask(context, target);
-  }
-}
-
-/**
- * A task that builds a library element for a Dart library.
- */
-class BuildLibraryElementTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input whose value is the defining [RESOLVED_UNIT1].
-   */
-  static const String DEFINING_UNIT_INPUT = 'DEFINING_UNIT_INPUT';
-
-  /**
-   * The name of the input whose value is a list of built [RESOLVED_UNIT1]s
-   * of the parts sourced by a library.
-   */
-  static const String PARTS_UNIT_INPUT = 'PARTS_UNIT_INPUT';
-
-  /**
-   * The name of the input whose value is the modification time of the source.
-   */
-  static const String MODIFICATION_TIME_INPUT = 'MODIFICATION_TIME_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'BuildLibraryElementTask', createTask, buildInputs, <ResultDescriptor>[
-    BUILD_LIBRARY_ERRORS,
-    LIBRARY_ELEMENT1,
-    IS_LAUNCHABLE
-  ]);
-
-  /**
-   * The constant used as an unknown common library name in parts.
-   */
-  static const String _UNKNOWN_LIBRARY_NAME = 'unknown-library-name';
-
-  /**
-   * Initialize a newly created task to build a library element for the given
-   * [target] in the given [context].
-   */
-  BuildLibraryElementTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    List<AnalysisError> errors = <AnalysisError>[];
-    //
-    // Prepare inputs.
-    //
-    Source librarySource = getRequiredSource();
-    CompilationUnit definingCompilationUnit =
-        getRequiredInput(DEFINING_UNIT_INPUT);
-    List<CompilationUnit> partUnits = getRequiredInput(PARTS_UNIT_INPUT);
-    int modificationTime = getRequiredInput(MODIFICATION_TIME_INPUT);
-    //
-    // Process inputs.
-    //
-    CompilationUnitElementImpl definingCompilationUnitElement =
-        definingCompilationUnit.declaredElement;
-    Map<Source, CompilationUnit> partUnitMap =
-        new HashMap<Source, CompilationUnit>();
-    int partLength = partUnits.length;
-    for (int i = 0; i < partLength; i++) {
-      CompilationUnit partUnit = partUnits[i];
-      Source partSource =
-          resolutionMap.elementDeclaredByCompilationUnit(partUnit).source;
-      partUnitMap[partSource] = partUnit;
-    }
-    //
-    // Update "part" directives.
-    //
-    LibraryIdentifier libraryNameNode = null;
-    String partsLibraryName = _UNKNOWN_LIBRARY_NAME;
-    Set<Source> seenPartSources = new Set<Source>();
-    FunctionElement entryPoint =
-        _findEntryPoint(definingCompilationUnitElement);
-    List<Directive> directivesToResolve = <Directive>[];
-    List<CompilationUnitElementImpl> sourcedCompilationUnits =
-        <CompilationUnitElementImpl>[];
-    NodeList<Directive> directives = definingCompilationUnit.directives;
-    int directiveLength = directives.length;
-    for (int i = 0; i < directiveLength; i++) {
-      Directive directive = directives[i];
-      if (directive is LibraryDirective) {
-        libraryNameNode = directive.name;
-        directivesToResolve.add(directive);
-      } else if (directive is PartDirective) {
-        StringLiteral partUri = directive.uri;
-        Source partSource = directive.uriSource;
-        CompilationUnit partUnit = partUnitMap[partSource];
-        if (partUnit != null) {
-          CompilationUnitElementImpl partElement = partUnit.declaredElement;
-          partElement.uriOffset = partUri.offset;
-          partElement.uriEnd = partUri.end;
-          partElement.uri = directive.uriContent;
-          //
-          // Validate that the part source is unique in the library.
-          //
-          if (!seenPartSources.add(partSource)) {
-            errors.add(new AnalysisError(
-                librarySource,
-                partUri.offset,
-                partUri.length,
-                CompileTimeErrorCode.DUPLICATE_PART,
-                [partSource.uri]));
-          }
-          //
-          // Validate that the part contains a part-of directive with the same
-          // name as the library.
-          //
-          if (context.exists(partSource)) {
-            _NameOrSource nameOrSource = _getPartLibraryNameOrUri(
-                context, partSource, partUnit, directivesToResolve);
-            if (nameOrSource == null) {
-              errors.add(new AnalysisError(
-                  librarySource,
-                  partUri.offset,
-                  partUri.length,
-                  CompileTimeErrorCode.PART_OF_NON_PART,
-                  [partUri.toSource()]));
-            } else {
-              String name = nameOrSource.name;
-              if (name != null) {
-                if (libraryNameNode == null) {
-                  if (partsLibraryName == _UNKNOWN_LIBRARY_NAME) {
-                    partsLibraryName = name;
-                  } else if (partsLibraryName != name) {
-                    partsLibraryName = null;
-                  }
-                } else if (libraryNameNode.name != name) {
-                  errors.add(new AnalysisError(
-                      librarySource,
-                      partUri.offset,
-                      partUri.length,
-                      StaticWarningCode.PART_OF_DIFFERENT_LIBRARY,
-                      [libraryNameNode.name, name]));
-                }
-              } else {
-                Source source = nameOrSource.source;
-                if (source != librarySource) {
-                  errors.add(new AnalysisError(
-                      librarySource,
-                      partUri.offset,
-                      partUri.length,
-                      StaticWarningCode.PART_OF_DIFFERENT_LIBRARY,
-                      [librarySource.uri.toString(), source.uri.toString()]));
-                }
-              }
-            }
-          }
-          if (entryPoint == null) {
-            entryPoint = _findEntryPoint(partElement);
-          }
-          directive.element = partElement;
-          sourcedCompilationUnits.add(partElement);
-        }
-      }
-    }
-    // TODO(brianwilkerson) Report the error
-    // ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART
-    //
-    // Create and populate the library element.
-    //
-    AnalysisContext owningContext = context;
-    if (context is InternalAnalysisContext) {
-      InternalAnalysisContext internalContext = context;
-      owningContext = internalContext.getContextFor(librarySource);
-    }
-    //
-    // Try to get the existing LibraryElement.
-    //
-    LibraryElementImpl libraryElement;
-    {
-      InternalAnalysisContext internalContext =
-          context as InternalAnalysisContext;
-      AnalysisCache analysisCache = internalContext.analysisCache;
-      CacheEntry cacheEntry = internalContext.getCacheEntry(target);
-      libraryElement = analysisCache.getValue(target, LIBRARY_ELEMENT1)
-          as LibraryElementImpl;
-      if (libraryElement == null &&
-          internalContext.aboutToComputeResult(cacheEntry, LIBRARY_ELEMENT1)) {
-        libraryElement = analysisCache.getValue(target, LIBRARY_ELEMENT1)
-            as LibraryElementImpl;
-      }
-    }
-    //
-    // Create a new LibraryElement.
-    //
-    if (libraryElement == null) {
-      libraryElement =
-          new LibraryElementImpl.forNode(owningContext, null, libraryNameNode);
-      libraryElement.isSynthetic = modificationTime < 0;
-      libraryElement.definingCompilationUnit = definingCompilationUnitElement;
-      libraryElement.entryPoint = entryPoint;
-      libraryElement.parts = sourcedCompilationUnits;
-      libraryElement.hasExtUri = _hasExtUri(definingCompilationUnit);
-      BuildLibraryElementUtils.patchTopLevelAccessors(libraryElement);
-      // set the library documentation to the docs associated with the first
-      // directive in the compilation unit.
-      if (definingCompilationUnit.directives.isNotEmpty) {
-        setElementDocumentationComment(
-            libraryElement, definingCompilationUnit.directives.first);
-      }
-    }
-    //
-    // Resolve the relevant directives to the library element.
-    //
-    // TODO(brianwilkerson) This updates the state of the AST structures but
-    // does not associate a new result with it.
-    //
-    int length = directivesToResolve.length;
-    for (int i = 0; i < length; i++) {
-      Directive directive = directivesToResolve[i];
-      directive.element = libraryElement;
-    }
-    //
-    // Record outputs.
-    //
-    outputs[BUILD_LIBRARY_ERRORS] = errors;
-    outputs[LIBRARY_ELEMENT1] = libraryElement;
-    outputs[IS_LAUNCHABLE] = entryPoint != null;
-  }
-
-  /**
-   * Return the top-level [FunctionElement] entry point, or `null` if the given
-   * [element] does not define an entry point.
-   */
-  FunctionElement _findEntryPoint(CompilationUnitElementImpl element) {
-    List<FunctionElement> functions = element.functions;
-    int length = functions.length;
-    for (int i = 0; i < length; i++) {
-      FunctionElement function = functions[i];
-      if (function.isEntryPoint) {
-        return function;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Return the name of the library that the given part is declared to be a
-   * part of, or `null` if the part does not contain a part-of directive.
-   */
-  _NameOrSource _getPartLibraryNameOrUri(
-      AnalysisContext context,
-      Source partSource,
-      CompilationUnit partUnit,
-      List<Directive> directivesToResolve) {
-    NodeList<Directive> directives = partUnit.directives;
-    int length = directives.length;
-    for (int i = 0; i < length; i++) {
-      Directive directive = directives[i];
-      if (directive is PartOfDirective) {
-        directivesToResolve.add(directive);
-        LibraryIdentifier libraryName = directive.libraryName;
-        if (libraryName != null) {
-          return new _NameOrSource(libraryName.name, null);
-        }
-        String uri = directive.uri?.stringValue;
-        if (uri != null) {
-          Source librarySource =
-              context.sourceFactory.resolveUri(partSource, uri);
-          if (librarySource != null) {
-            return new _NameOrSource(null, librarySource);
-          }
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Return `true` if the given compilation [unit] contains at least one
-   * import directive with a `dart-ext:` URI.
-   */
-  bool _hasExtUri(CompilationUnit unit) {
-    NodeList<Directive> directives = unit.directives;
-    int length = directives.length;
-    for (int i = 0; i < length; i++) {
-      Directive directive = directives[i];
-      if (directive is ImportDirective) {
-        if (DartUriResolver.isDartExtUri(directive.uriContent)) {
-          return true;
-        }
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the given
-   * [libSource].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      DEFINING_UNIT_INPUT:
-          RESOLVED_UNIT1.of(new LibrarySpecificUnit(source, source)),
-      PARTS_UNIT_INPUT: INCLUDED_PARTS.of(source).toList((Source unit) {
-        return RESOLVED_UNIT1.of(new LibrarySpecificUnit(source, unit));
-      }),
-      MODIFICATION_TIME_INPUT: MODIFICATION_TIME.of(source)
-    };
-  }
-
-  /**
-   * Create a [BuildLibraryElementTask] based on the given [target] in the
-   * given [context].
-   */
-  static BuildLibraryElementTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new BuildLibraryElementTask(context, target);
-  }
-}
-
-/**
- * A task that builds [PUBLIC_NAMESPACE] for a library.
- */
-class BuildPublicNamespaceTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input for [LIBRARY_ELEMENT2] of a library.
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'BuildPublicNamespaceTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[LIBRARY_ELEMENT3]);
-
-  BuildPublicNamespaceTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    LibraryElementImpl library = getRequiredInput(LIBRARY_INPUT);
-    NamespaceBuilder builder = new NamespaceBuilder();
-    library.publicNamespace = builder.createPublicNamespaceForLibrary(library);
-    outputs[LIBRARY_ELEMENT3] = library;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given library [libSource].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{LIBRARY_INPUT: LIBRARY_ELEMENT2.of(source)};
-  }
-
-  /**
-   * Create a [BuildPublicNamespaceTask] based on the given [target] in
-   * the given [context].
-   */
-  static BuildPublicNamespaceTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new BuildPublicNamespaceTask(context, target);
-  }
-}
-
-/**
- * A task that builds [EXPORT_SOURCE_CLOSURE] of a library.
- */
-class BuildSourceExportClosureTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the export closure.
-   */
-  static const String EXPORT_INPUT = 'EXPORT_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'BuildSourceExportClosureTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[EXPORT_SOURCE_CLOSURE]);
-
-  BuildSourceExportClosureTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    List<Source> exportClosure = getRequiredInput(EXPORT_INPUT);
-    //
-    // Record output.
-    //
-    outputs[EXPORT_SOURCE_CLOSURE] = exportClosure;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given library [libSource].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      EXPORT_INPUT: new _ExportSourceClosureTaskInput(source, LIBRARY_ELEMENT2)
-    };
-  }
-
-  /**
-   * Create a [BuildSourceExportClosureTask] based on the given [target] in
-   * the given [context].
-   */
-  static BuildSourceExportClosureTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new BuildSourceExportClosureTask(context, target);
-  }
-}
-
-/**
- * A task that builds [TYPE_PROVIDER] for a context.
- */
-class BuildTypeProviderTask extends SourceBasedAnalysisTask {
-  /**
-   * The [PUBLIC_NAMESPACE] input of the `dart:core` library.
-   */
-  static const String CORE_INPUT = 'CORE_INPUT';
-
-  /**
-   * The [PUBLIC_NAMESPACE] input of the `dart:async` library.
-   */
-  static const String ASYNC_INPUT = 'ASYNC_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'BuildTypeProviderTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[TYPE_PROVIDER]);
-
-  BuildTypeProviderTask(
-      InternalAnalysisContext context, AnalysisContextTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    LibraryElement coreLibrary = getRequiredInput(CORE_INPUT);
-    LibraryElement asyncLibrary = getOptionalInput(ASYNC_INPUT);
-    Namespace coreNamespace = coreLibrary.publicNamespace;
-    Namespace asyncNamespace = asyncLibrary.publicNamespace;
-    //
-    // Record outputs.
-    //
-    TypeProvider typeProvider =
-        new TypeProviderImpl.forNamespaces(coreNamespace, asyncNamespace);
-    (context as InternalAnalysisContext).typeProvider = typeProvider;
-    outputs[TYPE_PROVIDER] = typeProvider;
-  }
-
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    AnalysisContextTarget contextTarget = target;
-    SourceFactory sourceFactory = contextTarget.context.sourceFactory;
-    Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
-    Source asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC);
-    if (asyncSource == null) {
-      return <String, TaskInput>{CORE_INPUT: LIBRARY_ELEMENT3.of(coreSource)};
-    }
-    return <String, TaskInput>{
-      CORE_INPUT: LIBRARY_ELEMENT3.of(coreSource),
-      ASYNC_INPUT: LIBRARY_ELEMENT3.of(asyncSource)
-    };
-  }
-
-  /**
-   * Create a [BuildTypeProviderTask] based on the given [context].
-   */
-  static BuildTypeProviderTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new BuildTypeProviderTask(context, target);
-  }
-}
-
-/**
- * A task that computes [CONSTANT_DEPENDENCIES] for a constant.
- */
-class ComputeConstantDependenciesTask extends ConstantEvaluationAnalysisTask {
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ComputeConstantDependenciesTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[CONSTANT_DEPENDENCIES]);
-
-  ComputeConstantDependenciesTask(
-      InternalAnalysisContext context, ConstantEvaluationTarget constant)
-      : super(context, constant);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    ConstantEvaluationTarget constant = target;
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    //
-    // Compute dependencies.
-    //
-    List<ConstantEvaluationTarget> dependencies = <ConstantEvaluationTarget>[];
-    new ConstantEvaluationEngine(typeProvider, context.declaredVariables,
-            typeSystem: context.typeSystem)
-        .computeDependencies(constant, dependencies.add);
-    //
-    // Record outputs.
-    //
-    outputs[CONSTANT_DEPENDENCIES] = dependencies;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    return <String, TaskInput>{
-      'constantExpressionResolved': CONSTANT_EXPRESSION_RESOLVED.of(target),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
-    };
-  }
-
-  /**
-   * Create a [ComputeConstantDependenciesTask] based on the given [target] in
-   * the given [context].
-   */
-  static ComputeConstantDependenciesTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ComputeConstantDependenciesTask(context, target);
-  }
-}
-
-/**
- * A task that computes the value of a constant ([CONSTANT_VALUE]) and
- * stores it in the element model.
- */
-class ComputeConstantValueTask extends ConstantEvaluationAnalysisTask {
-  /**
-   * The name of the input which ensures that dependent constants are evaluated
-   * before the target.
-   */
-  static const String DEPENDENCIES_INPUT = 'DEPENDENCIES_INPUT';
-
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ComputeConstantValueTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[CONSTANT_VALUE]);
-
-  ComputeConstantValueTask(
-      InternalAnalysisContext context, ConstantEvaluationTarget constant)
-      : super(context, constant);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  bool get handlesDependencyCycles => true;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    // Note: DEPENDENCIES_INPUT is not needed.  It is merely a bookkeeping
-    // dependency to ensure that the constants that this constant depends on
-    // are computed first.
-    ConstantEvaluationTarget constant = target;
-    AnalysisContext context = constant.context;
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    //
-    // Compute the value of the constant, or report an error if there was a
-    // cycle.
-    //
-    ConstantEvaluationEngine constantEvaluationEngine =
-        new ConstantEvaluationEngine(typeProvider, context.declaredVariables,
-            typeSystem: context.typeSystem);
-    if (dependencyCycle == null) {
-      constantEvaluationEngine.computeConstantValue(constant);
-    } else {
-      List<ConstantEvaluationTarget> constantsInCycle =
-          <ConstantEvaluationTarget>[];
-      int length = dependencyCycle.length;
-      for (int i = 0; i < length; i++) {
-        WorkItem workItem = dependencyCycle[i];
-        if (workItem.descriptor == DESCRIPTOR) {
-          AnalysisTarget target = workItem.target;
-          constantsInCycle.add(target);
-          if (target is ConstructorElementImpl) {
-            target.isCycleFree = false;
-          }
-        }
-      }
-      assert(constantsInCycle.isNotEmpty);
-      constantEvaluationEngine.generateCycleError(constantsInCycle, constant);
-    }
-    //
-    // Record outputs.
-    //
-    outputs[CONSTANT_VALUE] = constant;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the given
-   * [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    ConstantEvaluationTarget evaluationTarget = target;
-    return <String, TaskInput>{
-      DEPENDENCIES_INPUT:
-          CONSTANT_DEPENDENCIES.of(evaluationTarget).toListOf(CONSTANT_VALUE),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
-    };
-  }
-
-  /**
-   * Create a [ComputeConstantValueTask] based on the given [target] in the
-   * given [context].
-   */
-  static ComputeConstantValueTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ComputeConstantValueTask(context, target);
-  }
-}
-
-/**
- * A task that computes the [INFERABLE_STATIC_VARIABLE_DEPENDENCIES] for a
- * static variable whose type should be inferred.
- */
-class ComputeInferableStaticVariableDependenciesTask
-    extends InferStaticVariableTask {
-  /**
-   * The name of the [RESOLVED_UNIT7] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ComputeInferableStaticVariableDependenciesTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[INFERABLE_STATIC_VARIABLE_DEPENDENCIES]);
-
-  ComputeInferableStaticVariableDependenciesTask(
-      InternalAnalysisContext context, VariableElement variable)
-      : super(context, variable);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    //
-    // Compute dependencies.
-    //
-    VariableDeclaration declaration = getDeclaration(unit);
-    VariableGatherer gatherer = new VariableGatherer(_isInferableStatic);
-    declaration.initializer.accept(gatherer);
-    //
-    // Record outputs.
-    //
-    outputs[INFERABLE_STATIC_VARIABLE_DEPENDENCIES] = gatherer.results.toList();
-  }
-
-  /**
-   * Return `true` if the given [variable] is a static variable whose type
-   * should be inferred.
-   */
-  bool _isInferableStatic(VariableElement variable) =>
-      variable.isStatic &&
-      variable.hasImplicitType &&
-      variable.initializer != null;
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    if (target is VariableElement) {
-      CompilationUnitElementImpl unit = target
-          .getAncestor((Element element) => element is CompilationUnitElement);
-      return <String, TaskInput>{
-        UNIT_INPUT: RESOLVED_UNIT7
-            .of(new LibrarySpecificUnit(unit.librarySource, unit.source))
-      };
-    }
-    throw new AnalysisException(
-        'Cannot build inputs for a ${target.runtimeType}');
-  }
-
-  /**
-   * Create a [ComputeInferableStaticVariableDependenciesTask] based on the
-   * given [target] in the given [context].
-   */
-  static ComputeInferableStaticVariableDependenciesTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ComputeInferableStaticVariableDependenciesTask(context, target);
-  }
-}
-
-/**
- * A task that computes the [LIBRARY_CYCLE] for a
- * library element.  Also computes the [LIBRARY_CYCLE_UNITS] and the
- * [LIBRARY_CYCLE_DEPENDENCIES].
- */
-class ComputeLibraryCycleTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [LIBRARY_ELEMENT2] input.
-   */
-  static const String LIBRARY_ELEMENT_INPUT = 'LIBRARY_ELEMENT_INPUT';
-
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ComputeLibraryCycleForUnitTask',
-      createTask,
-      buildInputs, <ResultDescriptor>[
-    LIBRARY_CYCLE,
-    LIBRARY_CYCLE_UNITS,
-    LIBRARY_CYCLE_DEPENDENCIES
-  ]);
-
-  ComputeLibraryCycleTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    // The computation of library cycles is necessarily non-local, since we
-    // in general have to look at all of the reachable libraries
-    // in order to find the strongly connected components.  Repeating this
-    // computation for every node would be quadratic.  The libraryCycle getter
-    // will avoid this by computing the library cycles for every reachable
-    // library and recording it in the element model.  This means that this
-    // task implicitly produces the output for many other targets.  This
-    // can't be expressed in the task model right now: instead, we just
-    // run tasks for those other targets, and they pick up the recorded
-    // version off of the element model.  Unfortunately, this means that
-    // the task model will not handle the invalidation of the recorded
-    // results for us.  Instead, we must explicitly invalidate the recorded
-    // library cycle information when we add or subtract edges from the
-    // import/export graph.  Any update that changes the
-    // import/export graph will induce a recomputation of the LIBRARY_ELEMENT2
-    // result for the changed node. This recomputation is responsible for
-    // conservatively invalidating the library cycle information recorded
-    // in the element model.  The LIBRARY_CYCLE results that have been cached
-    // by the task model are conservatively invalidated by the
-    // IMPORT_EXPORT_SOURCE_CLOSURE dependency below.  If anything reachable
-    // from a node is changed, its LIBRARY_CYCLE results will be re-computed
-    // here (possibly re-using the result from the element model if invalidation
-    // did not cause it to be erased).  In summary, task model dependencies
-    // on the import/export source closure ensure that this method will be
-    // re-run if anything reachable from this target has been invalidated,
-    // and the invalidation code (invalidateLibraryCycles) will ensure that
-    // element model results will be re-used here only if they are still valid.
-    LibraryElement library = getRequiredInput(LIBRARY_ELEMENT_INPUT);
-    if (!LibraryElementImpl.hasResolutionCapability(
-        library, LibraryResolutionCapability.resolvedTypeNames)) {
-      List<LibraryElement> component = library.libraryCycle;
-      Set<LibraryElement> filter = component.toSet();
-      Set<CompilationUnitElement> deps = new Set<CompilationUnitElement>();
-      void addLibrary(LibraryElement l) {
-        if (!filter.contains(l)) {
-          deps.addAll(l.units);
-        }
-      }
-
-      int length = component.length;
-      for (int i = 0; i < length; i++) {
-        LibraryElement library = component[i];
-        library.importedLibraries.forEach(addLibrary);
-        library.exportedLibraries.forEach(addLibrary);
-      }
-      //
-      // Record outputs.
-      //
-      LibrarySpecificUnit unitToLSU(CompilationUnitElement unit) =>
-          new LibrarySpecificUnit(unit.librarySource, unit.source);
-      outputs[LIBRARY_CYCLE] = component;
-      outputs[LIBRARY_CYCLE_UNITS] =
-          component.expand((l) => l.units).map(unitToLSU).toList();
-      outputs[LIBRARY_CYCLE_DEPENDENCIES] = deps.map(unitToLSU).toList();
-    } else {
-      outputs[LIBRARY_CYCLE] = <LibraryElement>[];
-      outputs[LIBRARY_CYCLE_UNITS] = <LibrarySpecificUnit>[];
-      outputs[LIBRARY_CYCLE_DEPENDENCIES] = <LibrarySpecificUnit>[];
-    }
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source librarySource = target;
-    return <String, TaskInput>{
-      LIBRARY_ELEMENT_INPUT: LIBRARY_ELEMENT2.of(librarySource),
-      'resolveReachableLibraries': READY_LIBRARY_ELEMENT2.of(librarySource),
-    };
-  }
-
-  /**
-   * Create a [ComputeLibraryCycleTask] based on the
-   * given [target] in the given [context].
-   */
-  static ComputeLibraryCycleTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ComputeLibraryCycleTask(context, target);
-  }
-}
-
-/**
- * A task that builds [REQUIRED_CONSTANTS] for a unit.
- */
-class ComputeRequiredConstantsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [RESOLVED_UNIT] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ComputeRequiredConstantsTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[PENDING_ERRORS, REQUIRED_CONSTANTS]);
-
-  ComputeRequiredConstantsTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    Source source = getRequiredSource();
-    //
-    // Prepare inputs.
-    //
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    //
-    // Use the ErrorVerifier to compute errors.
-    //
-    RequiredConstantsComputer computer = new RequiredConstantsComputer(source);
-    unit.accept(computer);
-    List<PendingError> pendingErrors = computer.pendingErrors;
-    List<ConstantEvaluationTarget> requiredConstants =
-        computer.requiredConstants;
-    //
-    // Record outputs.
-    //
-    outputs[PENDING_ERRORS] = pendingErrors;
-    outputs[REQUIRED_CONSTANTS] = requiredConstants;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{UNIT_INPUT: RESOLVED_UNIT.of(unit)};
-  }
-
-  /**
-   * Create a [ComputeRequiredConstantsTask] based on the given [target] in
-   * the given [context].
-   */
-  static ComputeRequiredConstantsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ComputeRequiredConstantsTask(context, target);
-  }
-}
-
-/**
- * A base class for analysis tasks whose target is expected to be a
- * [ConstantEvaluationTarget].
- */
-abstract class ConstantEvaluationAnalysisTask extends AnalysisTask {
-  /**
-   * Initialize a newly created task to perform analysis within the given
-   * [context] in order to produce results for the given [constant].
-   */
-  ConstantEvaluationAnalysisTask(
-      AnalysisContext context, ConstantEvaluationTarget constant)
-      : super(context, constant);
-
-  @override
-  String get description {
-    Source source = target.source;
-    String sourceName = source == null ? '<unknown source>' : source.fullName;
-    return '${descriptor.name} for element $target in source $sourceName';
-  }
-}
-
-/**
- * A task that computes a list of the libraries containing the target source.
- */
-class ContainingLibrariesTask extends SourceBasedAnalysisTask {
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ContainingLibrariesTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[CONTAINING_LIBRARIES]);
-
-  ContainingLibrariesTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    // TODO(brianwilkerson) This value can change as new libraries are analyzed
-    // so we need some way of making sure that this result is removed from the
-    // cache appropriately.
-    Source source = getRequiredSource();
-    outputs[CONTAINING_LIBRARIES] = context.getLibrariesContaining(source);
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    return <String, TaskInput>{};
-  }
-
-  /**
-   * Create a [ContainingLibrariesTask] based on the given [target] in the given
-   * [context].
-   */
-  static ContainingLibrariesTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ContainingLibrariesTask(context, target);
-  }
-}
-
-/**
- * A task that merges all of the errors for a single source into a single list
- * of errors.
- */
-class DartErrorsTask extends SourceBasedAnalysisTask {
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('DartErrorsTask',
-      createTask, buildInputs, <ResultDescriptor>[DART_ERRORS]);
-
-  /**
-   * The name of the [IGNORE_INFO_INPUT] input.
-   */
-  static const String IGNORE_INFO_INPUT = 'IGNORE_INFO_INPUT';
-
-  /**
-   * The name of the [LINE_INFO_INPUT] input.
-   */
-  static const String LINE_INFO_INPUT = 'LINE_INFO_INPUT';
-
-  DartErrorsTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    List<List<AnalysisError>> errorLists = <List<AnalysisError>>[];
-
-    //
-    // Filter ignored errors.
-    //
-    List<AnalysisError> errors =
-        _filterIgnores(AnalysisError.mergeLists(errorLists));
-
-    //
-    // Record outputs.
-    //
-    outputs[DART_ERRORS] = errors;
-  }
-
-  List<AnalysisError> _filterIgnores(List<AnalysisError> errors) {
-    if (errors.isEmpty) {
-      return errors;
-    }
-
-    IgnoreInfo ignoreInfo = getRequiredInput(IGNORE_INFO_INPUT);
-    if (!ignoreInfo.hasIgnores) {
-      return errors;
-    }
-
-    LineInfo lineInfo = getRequiredInput(LINE_INFO_INPUT);
-
-    return filterIgnored(errors, ignoreInfo, lineInfo);
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    Map<String, TaskInput> inputs = <String, TaskInput>{};
-    inputs[LINE_INFO_INPUT] = LINE_INFO.of(source);
-    inputs[IGNORE_INFO_INPUT] = IGNORE_INFO.of(source);
-    return inputs;
-  }
-
-  /**
-   * Create a [DartErrorsTask] based on the given [target] in the given
-   * [context].
-   */
-  static DartErrorsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new DartErrorsTask(context, target);
-  }
-
-  /**
-   * Return a new list with items from [errors] which are not filtered out by
-   * the [ignoreInfo].
-   */
-  static List<AnalysisError> filterIgnored(
-      List<AnalysisError> errors, IgnoreInfo ignoreInfo, LineInfo lineInfo) {
-    if (errors.isEmpty || !ignoreInfo.hasIgnores) {
-      return errors;
-    }
-
-    bool isIgnored(AnalysisError error) {
-      int errorLine = lineInfo.getLocation(error.offset).lineNumber;
-      String errorCode = error.errorCode.name.toLowerCase();
-      return ignoreInfo.ignoredAt(errorCode, errorLine);
-    }
-
-    return errors.where((AnalysisError e) => !isIgnored(e)).toList();
-  }
-}
-
-/**
- * A task that builds [RESOLVED_UNIT12] for a unit.
- */
-class EvaluateUnitConstantsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [RESOLVED_UNIT11] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The name of the [CONSTANT_VALUE] input.
-   */
-  static const String CONSTANT_VALUES = 'CONSTANT_VALUES';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'EvaluateUnitConstantsTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[CREATED_RESOLVED_UNIT12, RESOLVED_UNIT12]);
-
-  EvaluateUnitConstantsTask(AnalysisContext context, LibrarySpecificUnit target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    // No actual work needs to be performed; the task manager will ensure that
-    // all constants are evaluated before this method is called.
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    outputs[RESOLVED_UNIT12] = unit;
-    outputs[CREATED_RESOLVED_UNIT12] = true;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      'libraryElement': LIBRARY_ELEMENT9.of(unit.library),
-      UNIT_INPUT: RESOLVED_UNIT11.of(unit),
-      CONSTANT_VALUES:
-          COMPILATION_UNIT_CONSTANTS.of(unit).toListOf(CONSTANT_VALUE),
-      'constantExpressionsDependencies':
-          CONSTANT_EXPRESSIONS_DEPENDENCIES.of(unit).toListOf(CONSTANT_VALUE)
-    };
-  }
-
-  /**
-   * Create an [EvaluateUnitConstantsTask] based on the given [target] in
-   * the given [context].
-   */
-  static EvaluateUnitConstantsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new EvaluateUnitConstantsTask(context, target);
-  }
-}
-
-/**
- * A task that builds [USED_IMPORTED_ELEMENTS] for a unit.
- */
-class GatherUsedImportedElementsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [RESOLVED_UNIT11] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'GatherUsedImportedElementsTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[USED_IMPORTED_ELEMENTS]);
-
-  GatherUsedImportedElementsTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    CompilationUnitElement unitElement = unit.declaredElement;
-    LibraryElement libraryElement = unitElement.library;
-    //
-    // Prepare used imported elements.
-    //
-    GatherUsedImportedElementsVisitor visitor =
-        new GatherUsedImportedElementsVisitor(libraryElement);
-    unit.accept(visitor);
-    //
-    // Record outputs.
-    //
-    outputs[USED_IMPORTED_ELEMENTS] = visitor.usedElements;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{UNIT_INPUT: RESOLVED_UNIT11.of(unit)};
-  }
-
-  /**
-   * Create a [GatherUsedImportedElementsTask] based on the given [target] in
-   * the given [context].
-   */
-  static GatherUsedImportedElementsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new GatherUsedImportedElementsTask(context, target);
-  }
-}
-
-/**
- * A task that builds [USED_LOCAL_ELEMENTS] for a unit.
- */
-class GatherUsedLocalElementsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [RESOLVED_UNIT11] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'GatherUsedLocalElementsTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[USED_LOCAL_ELEMENTS]);
-
-  GatherUsedLocalElementsTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    CompilationUnitElement unitElement = unit.declaredElement;
-    LibraryElement libraryElement = unitElement.library;
-    //
-    // Prepare used local elements.
-    //
-    GatherUsedLocalElementsVisitor visitor =
-        new GatherUsedLocalElementsVisitor(libraryElement);
-    unit.accept(visitor);
-    //
-    // Record outputs.
-    //
-    outputs[USED_LOCAL_ELEMENTS] = visitor.usedElements;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{UNIT_INPUT: RESOLVED_UNIT11.of(unit)};
-  }
-
-  /**
-   * Create a [GatherUsedLocalElementsTask] based on the given [target] in
-   * the given [context].
-   */
-  static GatherUsedLocalElementsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new GatherUsedLocalElementsTask(context, target);
-  }
-}
-
-/**
- * A task that generates [HINTS] for a unit.
- */
-class GenerateHintsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [RESOLVED_UNIT11] input.
-   */
-  static const String RESOLVED_UNIT_INPUT = 'RESOLVED_UNIT';
-
-  /**
-   * The name of a list of [USED_LOCAL_ELEMENTS] for each library unit input.
-   */
-  static const String USED_LOCAL_ELEMENTS_INPUT = 'USED_LOCAL_ELEMENTS';
-
-  /**
-   * The name of a list of [USED_IMPORTED_ELEMENTS] for each library unit input.
-   */
-  static const String USED_IMPORTED_ELEMENTS_INPUT = 'USED_IMPORTED_ELEMENTS';
-
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'GenerateHintsTask', createTask, buildInputs, <ResultDescriptor>[HINTS]);
-
-  GenerateHintsTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    AnalysisOptions analysisOptions = context.analysisOptions;
-    if (!analysisOptions.hint) {
-      outputs[HINTS] = AnalysisError.NO_ERRORS;
-      return;
-    }
-    //
-    // Prepare collectors.
-    //
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    Source source = getRequiredSource();
-    ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
-    //
-    // Prepare inputs.
-    //
-    CompilationUnit unit = getRequiredInput(RESOLVED_UNIT_INPUT);
-    List<UsedImportedElements> usedImportedElementsList =
-        getRequiredInput(USED_IMPORTED_ELEMENTS_INPUT);
-    List<UsedLocalElements> usedLocalElementsList =
-        getRequiredInput(USED_LOCAL_ELEMENTS_INPUT);
-    CompilationUnitElement unitElement = unit.declaredElement;
-    LibraryElement libraryElement = unitElement.library;
-    TypeSystem typeSystem = context.typeSystem;
-
-    //
-    // Generate errors.
-    //
-    unit.accept(new DeadCodeVerifier(
-        errorReporter, (unit as CompilationUnitImpl).isNonNullable,
-        typeSystem: typeSystem));
-    // Verify imports.
-    {
-      ImportsVerifier verifier = new ImportsVerifier();
-      verifier.addImports(unit);
-      usedImportedElementsList.forEach(verifier.removeUsedElements);
-      verifier.generateDuplicateImportHints(errorReporter);
-      verifier.generateDuplicateShownHiddenNameHints(errorReporter);
-      verifier.generateUnusedImportHints(errorReporter);
-      verifier.generateUnusedShownNameHints(errorReporter);
-    }
-    // Unused local elements.
-    {
-      UsedLocalElements usedElements =
-          new UsedLocalElements.merge(usedLocalElementsList);
-      UnusedLocalElementsVerifier visitor =
-          new UnusedLocalElementsVerifier(errorListener, usedElements);
-      unit.accept(visitor);
-    }
-    // Dart2js analysis.
-    if (analysisOptions.dart2jsHint) {
-      unit.accept(new Dart2JSVerifier(errorReporter));
-    }
-    // Dart best practices.
-    var inheritanceManager2 = new InheritanceManager2(context.typeSystem);
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
-
-    unit.accept(new BestPracticesVerifier(
-        errorReporter, typeProvider, libraryElement,
-        typeSystem: typeSystem,
-        resourceProvider: resourceProvider,
-        analysisOptions: context.analysisOptions));
-    unit.accept(new OverrideVerifier(
-      inheritanceManager2,
-      libraryElement,
-      errorReporter,
-    ));
-    // Find to-do comments.
-    new ToDoFinder(errorReporter).findIn(unit);
-    //
-    // Record outputs.
-    //
-    outputs[HINTS] = errorListener.errors;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    Source libSource = unit.library;
-    return <String, TaskInput>{
-      RESOLVED_UNIT_INPUT: RESOLVED_UNIT.of(unit),
-      USED_LOCAL_ELEMENTS_INPUT:
-          LIBRARY_SPECIFIC_UNITS.of(libSource).toListOf(USED_LOCAL_ELEMENTS),
-      USED_IMPORTED_ELEMENTS_INPUT:
-          LIBRARY_SPECIFIC_UNITS.of(libSource).toListOf(USED_IMPORTED_ELEMENTS),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
-    };
-  }
-
-  /**
-   * Create a [GenerateHintsTask] based on the given [target] in
-   * the given [context].
-   */
-  static GenerateHintsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new GenerateHintsTask(context, target);
-  }
-}
-
-/**
- * A task that generates [LINTS] for a unit.
- */
-class GenerateLintsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [RESOLVED_UNIT] input.
-   */
-  static const String RESOLVED_UNIT_INPUT = 'RESOLVED_UNIT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'GenerateLintsTask', createTask, buildInputs, <ResultDescriptor>[LINTS]);
-
-  GenerateLintsTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    AnalysisOptions analysisOptions = context.analysisOptions;
-    if (!analysisOptions.lint) {
-      outputs[LINTS] = AnalysisError.NO_ERRORS;
-      return;
-    }
-    //
-    // Prepare collectors.
-    //
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    Source source = getRequiredSource();
-    ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
-    //
-    // Prepare inputs.
-    //
-    CompilationUnit unit = getRequiredInput(RESOLVED_UNIT_INPUT);
-    //
-    // Generate lints.
-    //
-    List<AstVisitor> visitors = <AstVisitor>[];
-    bool timeVisits = analysisOptions.enableTiming;
-    List<Linter> linters = getLints(context);
-    int length = linters.length;
-    for (int i = 0; i < length; i++) {
-      Linter linter = linters[i];
-      AstVisitor visitor = linter.getVisitor();
-      if (visitor != null) {
-        linter.reporter = errorReporter;
-        if (timeVisits) {
-          visitor = new TimedAstVisitor(visitor, lintRegistry.getTimer(linter));
-        }
-        visitors.add(visitor);
-      }
-    }
-    AstVisitor visitor = new ExceptionHandlingDelegatingAstVisitor(
-        visitors, ExceptionHandlingDelegatingAstVisitor.logException);
-    unit.accept(visitor);
-    //
-    // Record outputs.
-    //
-    outputs[LINTS] = errorListener.errors;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) =>
-      <String, TaskInput>{RESOLVED_UNIT_INPUT: RESOLVED_UNIT.of(target)};
-
-  /**
-   * Create a [GenerateLintsTask] based on the given [target] in
-   * the given [context].
-   */
-  static GenerateLintsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new GenerateLintsTask(context, target);
-  }
-}
-
-/**
- * A task that ensures that all of the inferable instance members in a
- * compilation unit have had their type inferred.
- */
-class InferInstanceMembersInUnitTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The name of the input whose value is the [RESOLVED_UNIT8] for the
-   * compilation unit.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'InferInstanceMembersInUnitTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[CREATED_RESOLVED_UNIT10, RESOLVED_UNIT10]);
-
-  /**
-   * Initialize a newly created task to build a library element for the given
-   * [unit] in the given [context].
-   */
-  InferInstanceMembersInUnitTask(
-      InternalAnalysisContext context, LibrarySpecificUnit unit)
-      : super(context, unit);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-
-    //
-    // Infer instance members.
-    //
-    var inheritance = new InheritanceManager2(context.typeSystem);
-    InstanceMemberInferrer inferrer =
-        new InstanceMemberInferrer(typeProvider, inheritance);
-    inferrer.inferCompilationUnit(unit.declaredElement);
-    //
-    // Record outputs.
-    //
-    outputs[RESOLVED_UNIT10] = unit;
-    outputs[CREATED_RESOLVED_UNIT10] = true;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the given
-   * [libSource].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      UNIT_INPUT: RESOLVED_UNIT9.of(unit),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
-      // In strong mode, add additional dependencies to enforce inference
-      // ordering.
-
-      // Require that field re-resolution be complete for all units in the
-      // current library cycle.
-      'orderLibraryCycleTasks':
-          LIBRARY_CYCLE_UNITS.of(unit.library).toListOf(CREATED_RESOLVED_UNIT9),
-      // Require that full inference be complete for all dependencies of the
-      // current library cycle.
-      'orderLibraryCycles': LIBRARY_CYCLE_DEPENDENCIES
-          .of(unit.library)
-          .toListOf(CREATED_RESOLVED_UNIT10)
-    };
-  }
-
-  /**
-   * Create a [InferInstanceMembersInUnitTask] based on the given [target] in
-   * the given [context].
-   */
-  static InferInstanceMembersInUnitTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new InferInstanceMembersInUnitTask(context, target);
-  }
-}
-
-/**
- * An abstract class that defines utility methods that are useful for tasks
- * operating on static variables.
- */
-abstract class InferStaticVariableTask extends ConstantEvaluationAnalysisTask {
-  InferStaticVariableTask(
-      InternalAnalysisContext context, VariableElement variable)
-      : super(context, variable);
-
-  /**
-   * Return the declaration of the target within the given compilation [unit].
-   * Throw an exception if the declaration cannot be found.
-   */
-  VariableDeclaration getDeclaration(CompilationUnit unit) {
-    VariableElement variable = target;
-    int offset = variable.nameOffset;
-    AstNode node = new NodeLocator2(offset).searchWithin(unit);
-    if (node == null) {
-      Source variableSource = variable.source;
-      Source unitSource =
-          resolutionMap.elementDeclaredByCompilationUnit(unit).source;
-      if (variableSource != unitSource) {
-        throw new AnalysisException(
-            "Failed to find the AST node for the variable "
-            "${variable.displayName} at $offset in $variableSource "
-            "because we were looking in $unitSource");
-      }
-      throw new AnalysisException(
-          "Failed to find the AST node for the variable "
-          "${variable.displayName} at $offset in $variableSource");
-    }
-    VariableDeclaration declaration =
-        node.thisOrAncestorOfType<VariableDeclaration>();
-    if (declaration == null || declaration.name != node) {
-      Source variableSource = variable.source;
-      Source unitSource =
-          resolutionMap.elementDeclaredByCompilationUnit(unit).source;
-      if (variableSource != unitSource) {
-        if (declaration == null) {
-          throw new AnalysisException(
-              "Failed to find the declaration of the variable "
-              "${variable.displayName} at $offset in $variableSource "
-              "because the node was not in a variable declaration "
-              "possibly because we were looking in $unitSource");
-        }
-        throw new AnalysisException(
-            "Failed to find the declaration of the variable "
-            "${variable.displayName} at $offset in $variableSource "
-            "because we were looking in $unitSource");
-      }
-      if (declaration == null) {
-        throw new AnalysisException(
-            "Failed to find the declaration of the variable "
-            "${variable.displayName} at $offset in $variableSource "
-            "because the node was not in a variable declaration");
-      }
-      throw new AnalysisException(
-          "Failed to find the declaration of the variable "
-          "${variable.displayName} at $offset in $variableSource "
-          "because the node was not the name in a variable declaration");
-    }
-    return declaration;
-  }
-}
-
-/**
- * A task that ensures that all of the inferable static variables in a
- * compilation unit have had their type inferred.
- */
-class InferStaticVariableTypesInUnitTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input whose value is the [RESOLVED_UNIT8] for the
-   * compilation unit.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The name of the [STATIC_VARIABLE_RESOLUTION_ERRORS] for all static
-   * variables in the compilation unit.
-   */
-  static const String ERRORS_LIST_INPUT = 'INFERRED_VARIABLES_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'InferStaticVariableTypesInUnitTask',
-      createTask,
-      buildInputs, <ResultDescriptor>[
-    CREATED_RESOLVED_UNIT8,
-    RESOLVED_UNIT8,
-    STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT
-  ]);
-
-  /**
-   * Initialize a newly created task to build a library element for the given
-   * [unit] in the given [context].
-   */
-  InferStaticVariableTypesInUnitTask(
-      InternalAnalysisContext context, LibrarySpecificUnit unit)
-      : super(context, unit);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    List<List<AnalysisError>> errorLists = getRequiredInput(ERRORS_LIST_INPUT);
-    //
-    // Record outputs. There is no additional work to be done at this time
-    // because the work has implicitly been done by virtue of the task model
-    // preparing all of the inputs.
-    //
-    outputs[RESOLVED_UNIT8] = unit;
-    outputs[CREATED_RESOLVED_UNIT8] = true;
-    outputs[STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT] =
-        AnalysisError.mergeLists(errorLists);
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the given
-   * [libSource].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      'inferredTypes': INFERABLE_STATIC_VARIABLES_IN_UNIT
-          .of(unit)
-          .toListOf(INFERRED_STATIC_VARIABLE),
-      ERRORS_LIST_INPUT: INFERABLE_STATIC_VARIABLES_IN_UNIT
-          .of(unit)
-          .toListOf(STATIC_VARIABLE_RESOLUTION_ERRORS),
-      UNIT_INPUT: RESOLVED_UNIT7.of(unit)
-    };
-  }
-
-  /**
-   * Create a [InferStaticVariableTypesInUnitTask] based on the given [target]
-   * in the given [context].
-   */
-  static InferStaticVariableTypesInUnitTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new InferStaticVariableTypesInUnitTask(context, target);
-  }
-}
-
-/**
- * A task that computes the type of an inferable static variable and
- * stores it in the element model.
- */
-class InferStaticVariableTypeTask extends InferStaticVariableTask {
-  /**
-   * The name of the input which ensures that dependent values have their type
-   * inferred before the target.
-   */
-  static const String DEPENDENCIES_INPUT = 'DEPENDENCIES_INPUT';
-
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The name of the [RESOLVED_UNIT8] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'InferStaticVariableTypeTask',
-      createTask,
-      buildInputs, <ResultDescriptor>[
-    INFERRED_STATIC_VARIABLE,
-    STATIC_VARIABLE_RESOLUTION_ERRORS
-  ]);
-
-  InferStaticVariableTypeTask(
-      InternalAnalysisContext context, VariableElement variable)
-      : super(context, variable);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  bool get handlesDependencyCycles => true;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    // Note: DEPENDENCIES_INPUT is not needed.  It is merely a bookkeeping
-    // dependency to ensure that the variables that this variable references
-    // have types inferred before inferring the type of this variable.
-    //
-    VariableElementImpl variable = target;
-
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    var inheritance = new InheritanceManager2(context.typeSystem);
-
-    // If we're not in a dependency cycle, and we have no type annotation,
-    // re-resolve the right hand side and do inference.
-    List<AnalysisError> errors = AnalysisError.NO_ERRORS;
-    if (dependencyCycle == null && variable.hasImplicitType) {
-      VariableDeclaration declaration = getDeclaration(unit);
-      //
-      // Re-resolve the variable's initializer so that the inferred types
-      // of other variables will be propagated.
-      //
-      RecordingErrorListener errorListener = new RecordingErrorListener();
-      Expression initializer = declaration.initializer;
-
-      ResolutionContext resolutionContext =
-          ResolutionContextBuilder.contextFor(initializer);
-      ResolverVisitor visitor = new ResolverVisitor(inheritance,
-          variable.library, variable.source, typeProvider, errorListener,
-          nameScope: resolutionContext.scope);
-      if (resolutionContext.enclosingClassDeclaration != null) {
-        visitor.prepareToResolveMembersInClass(
-            resolutionContext.enclosingClassDeclaration);
-      }
-      initializer.accept(visitor);
-      DartType newType = initializer.staticType;
-      if (newType == null || newType.isBottom || newType.isDartCoreNull) {
-        newType = typeProvider.dynamicType;
-      }
-
-      //
-      // Record the type of the variable.
-      //
-      setFieldType(variable, newType);
-      errors = getUniqueErrors(errorListener.errors);
-    } else {
-      // TODO(brianwilkerson) For now we simply don't infer any type for
-      // variables or fields involved in a cycle. We could try to be smarter
-      // by re-resolving the initializer in a context in which the types of all
-      // of the variables in the cycle are assumed to be `null`, but it isn't
-      // clear to me that this would produce better results often enough to
-      // warrant the extra effort.
-    }
-    //
-    // Record outputs.
-    //
-    outputs[INFERRED_STATIC_VARIABLE] = variable;
-    outputs[STATIC_VARIABLE_RESOLUTION_ERRORS] = errors;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the given
-   * [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    VariableElement variable = target;
-    LibrarySpecificUnit unit =
-        new LibrarySpecificUnit(variable.library.source, variable.source);
-    return <String, TaskInput>{
-      DEPENDENCIES_INPUT: INFERABLE_STATIC_VARIABLE_DEPENDENCIES
-          .of(variable)
-          .toListOf(INFERRED_STATIC_VARIABLE),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
-      UNIT_INPUT: RESOLVED_UNIT7.of(unit),
-      // In strong mode, add additional dependencies to enforce inference
-      // ordering.
-
-      // Require that full inference be complete for all dependencies of the
-      // current library cycle.
-      'orderLibraryCycles': LIBRARY_CYCLE_DEPENDENCIES
-          .of(unit.library)
-          .toListOf(CREATED_RESOLVED_UNIT10)
-    };
-  }
-
-  /**
-   * Create a [InferStaticVariableTypeTask] based on the given [target] in the
-   * given [context].
-   */
-  static InferStaticVariableTypeTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new InferStaticVariableTypeTask(context, target);
-  }
-}
-
-/**
- * A task computes all of the errors of all of the units for a single
- * library source and sets the [LIBRARY_ERRORS_READY] flag.
- */
-class LibraryErrorsReadyTask extends SourceBasedAnalysisTask {
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'LibraryErrorsReadyTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[LIBRARY_ERRORS_READY]);
-
-  LibraryErrorsReadyTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    outputs[LIBRARY_ERRORS_READY] = true;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      'allErrors': UNITS.of(source).toListOf(DART_ERRORS),
-      'libraryElement': LIBRARY_ELEMENT.of(source)
-    };
-  }
-
-  /**
-   * Create a [LibraryErrorsReadyTask] based on the given [target] in the given
-   * [context].
-   */
-  static LibraryErrorsReadyTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new LibraryErrorsReadyTask(context, target);
-  }
-}
-
-/**
- * A task that merges all of the errors for a single source into a single list
- * of errors.
- */
-class LibraryUnitErrorsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [BUILD_DIRECTIVES_ERRORS] input.
-   */
-  static const String BUILD_DIRECTIVES_ERRORS_INPUT = 'BUILD_DIRECTIVES_ERRORS';
-
-  /**
-   * The name of the [BUILD_LIBRARY_ERRORS] input.
-   */
-  static const String BUILD_LIBRARY_ERRORS_INPUT = 'BUILD_LIBRARY_ERRORS';
-
-  /**
-   * The name of the [HINTS] input.
-   */
-  static const String HINTS_INPUT = 'HINTS';
-
-  /**
-   * The name of the [LINTS] input.
-   */
-  static const String LINTS_INPUT = 'LINTS';
-
-  /**
-   * The name of the [STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT] input.
-   */
-  static const String STATIC_VARIABLE_RESOLUTION_ERRORS_INPUT =
-      'STATIC_VARIABLE_RESOLUTION_ERRORS_INPUT';
-
-  /**
-   * The name of the [RESOLVE_DIRECTIVES_ERRORS] input.
-   */
-  static const String RESOLVE_DIRECTIVES_ERRORS_INPUT =
-      'RESOLVE_DIRECTIVES_ERRORS';
-
-  /**
-   * The name of the [STRONG_MODE_ERRORS] input.
-   */
-  static const String STRONG_MODE_ERRORS_INPUT = 'STRONG_MODE_ERRORS';
-
-  /**
-   * The name of the [RESOLVE_TYPE_NAMES_ERRORS] input.
-   */
-  static const String RESOLVE_TYPE_NAMES_ERRORS_INPUT =
-      'RESOLVE_TYPE_NAMES_ERRORS';
-
-  /**
-   * The name of the [RESOLVE_TYPE_BOUNDS_ERRORS] input.
-   */
-  static const String RESOLVE_TYPE_NAMES_ERRORS2_INPUT =
-      'RESOLVE_TYPE_NAMES_ERRORS2';
-
-  /**
-   * The name of the [RESOLVE_UNIT_ERRORS] input.
-   */
-  static const String RESOLVE_UNIT_ERRORS_INPUT = 'RESOLVE_UNIT_ERRORS';
-
-  /**
-   * The name of the [VARIABLE_REFERENCE_ERRORS] input.
-   */
-  static const String VARIABLE_REFERENCE_ERRORS_INPUT =
-      'VARIABLE_REFERENCE_ERRORS';
-
-  /**
-   * The name of the [VERIFY_ERRORS] input.
-   */
-  static const String VERIFY_ERRORS_INPUT = 'VERIFY_ERRORS';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'LibraryUnitErrorsTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[LIBRARY_UNIT_ERRORS]);
-
-  LibraryUnitErrorsTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    List<List<AnalysisError>> errorLists = <List<AnalysisError>>[];
-    errorLists.add(getRequiredInput(BUILD_DIRECTIVES_ERRORS_INPUT));
-    errorLists.add(getRequiredInput(BUILD_LIBRARY_ERRORS_INPUT));
-    errorLists.add(getRequiredInput(HINTS_INPUT));
-    errorLists.add(getRequiredInput(LINTS_INPUT));
-    errorLists.add(getRequiredInput(RESOLVE_DIRECTIVES_ERRORS_INPUT));
-    errorLists.add(getRequiredInput(RESOLVE_TYPE_NAMES_ERRORS_INPUT));
-    errorLists.add(getRequiredInput(RESOLVE_TYPE_NAMES_ERRORS2_INPUT));
-    errorLists.add(getRequiredInput(RESOLVE_UNIT_ERRORS_INPUT));
-    errorLists.add(getRequiredInput(STATIC_VARIABLE_RESOLUTION_ERRORS_INPUT));
-    errorLists.add(getRequiredInput(STRONG_MODE_ERRORS_INPUT));
-    errorLists.add(getRequiredInput(VARIABLE_REFERENCE_ERRORS_INPUT));
-    errorLists.add(getRequiredInput(VERIFY_ERRORS_INPUT));
-    //
-    // Record outputs.
-    //
-    outputs[LIBRARY_UNIT_ERRORS] = AnalysisError.mergeLists(errorLists);
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [unit].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    Map<String, TaskInput> inputs = <String, TaskInput>{
-      HINTS_INPUT: HINTS.of(unit),
-      LINTS_INPUT: LINTS.of(unit),
-      RESOLVE_DIRECTIVES_ERRORS_INPUT: RESOLVE_DIRECTIVES_ERRORS.of(unit),
-      RESOLVE_TYPE_NAMES_ERRORS_INPUT: RESOLVE_TYPE_NAMES_ERRORS.of(unit),
-      RESOLVE_TYPE_NAMES_ERRORS2_INPUT: RESOLVE_TYPE_BOUNDS_ERRORS.of(unit),
-      RESOLVE_UNIT_ERRORS_INPUT: RESOLVE_UNIT_ERRORS.of(unit),
-      STATIC_VARIABLE_RESOLUTION_ERRORS_INPUT:
-          STATIC_VARIABLE_RESOLUTION_ERRORS_IN_UNIT.of(unit),
-      STRONG_MODE_ERRORS_INPUT: STRONG_MODE_ERRORS.of(unit),
-      VARIABLE_REFERENCE_ERRORS_INPUT: VARIABLE_REFERENCE_ERRORS.of(unit),
-      VERIFY_ERRORS_INPUT: VERIFY_ERRORS.of(unit)
-    };
-    Source source = unit.source;
-    if (unit.library == source) {
-      inputs[BUILD_DIRECTIVES_ERRORS_INPUT] =
-          BUILD_DIRECTIVES_ERRORS.of(source);
-      inputs[BUILD_LIBRARY_ERRORS_INPUT] = BUILD_LIBRARY_ERRORS.of(source);
-    } else {
-      inputs[BUILD_DIRECTIVES_ERRORS_INPUT] =
-          new ConstantTaskInput(AnalysisError.NO_ERRORS);
-      inputs[BUILD_LIBRARY_ERRORS_INPUT] =
-          new ConstantTaskInput(AnalysisError.NO_ERRORS);
-    }
-    return inputs;
-  }
-
-  /**
-   * Create a [LibraryUnitErrorsTask] based on the given [target] in the given
-   * [context].
-   */
-  static LibraryUnitErrorsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new LibraryUnitErrorsTask(context, target);
-  }
-}
-
-/**
- * A task that parses the content of a Dart file, producing an AST structure,
- * any lexical errors found in the process, the kind of the file (library or
- * part), and several lists based on the AST.
- */
-class ParseDartTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input whose value is the line information produced for the
-   * file.
-   */
-  static const String LINE_INFO_INPUT_NAME = 'LINE_INFO_INPUT_NAME';
-
-  /**
-   * The name of the input whose value is the modification time of the file.
-   */
-  static const String MODIFICATION_TIME_INPUT_NAME =
-      'MODIFICATION_TIME_INPUT_NAME';
-
-  /**
-   * The name of the input whose value is the token stream produced for the file.
-   */
-  static const String TOKEN_STREAM_INPUT_NAME = 'TOKEN_STREAM_INPUT_NAME';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ParseDartTask', createTask, buildInputs, <ResultDescriptor>[
-    EXPLICITLY_IMPORTED_LIBRARIES,
-    EXPORTED_LIBRARIES,
-    IMPORTED_LIBRARIES,
-    INCLUDED_PARTS,
-    LIBRARY_SPECIFIC_UNITS,
-    PARSE_ERRORS,
-    PARSED_UNIT,
-    REFERENCED_SOURCES,
-    SOURCE_KIND,
-    UNITS,
-  ]);
-
-  /**
-   * The source that is being parsed.
-   */
-  Source _source;
-
-  /**
-   * The [ErrorReporter] to report errors to.
-   */
-  ErrorReporter _errorReporter;
-
-  /**
-   * Initialize a newly created task to parse the content of the Dart file
-   * associated with the given [target] in the given [context].
-   */
-  ParseDartTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    _source = getRequiredSource();
-    LineInfo lineInfo = getRequiredInput(LINE_INFO_INPUT_NAME);
-    int modificationTime = getRequiredInput(MODIFICATION_TIME_INPUT_NAME);
-    Token tokenStream = getRequiredInput(TOKEN_STREAM_INPUT_NAME);
-
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    _errorReporter = new ErrorReporter(errorListener, _source);
-
-    AnalysisOptions options = context.analysisOptions;
-    Parser parser =
-        new Parser(_source, errorListener, useFasta: options.useFastaParser);
-    parser.parseFunctionBodies =
-        options.analyzeFunctionBodiesPredicate(_source);
-    parser.enableOptionalNewAndConst = true;
-    CompilationUnit unit = parser.parseCompilationUnit(tokenStream);
-    unit.lineInfo = lineInfo;
-
-    if (options.patchPaths.isNotEmpty && _source.uri.scheme == 'dart') {
-      var resourceProvider =
-          (context.sourceFactory.dartSdk as FolderBasedDartSdk)
-              .resourceProvider;
-      new SdkPatcher().patch(resourceProvider,
-          context.analysisOptions.patchPaths, errorListener, _source, unit);
-    }
-
-    bool hasNonPartOfDirective = false;
-    bool hasPartOfDirective = false;
-    HashSet<Source> explicitlyImportedSourceSet = new HashSet<Source>();
-    HashSet<Source> exportedSourceSet = new HashSet<Source>();
-    HashSet<Source> includedSourceSet = new HashSet<Source>();
-    NodeList<Directive> directives = unit.directives;
-    int length = directives.length;
-    for (int i = 0; i < length; i++) {
-      Directive directive = directives[i];
-      if (directive is PartOfDirective) {
-        hasPartOfDirective = true;
-      } else {
-        hasNonPartOfDirective = true;
-        if (directive is UriBasedDirective) {
-          Source referencedSource = _resolveDirective(directive);
-          if (referencedSource != null) {
-            if (directive is ExportDirective) {
-              exportedSourceSet.add(referencedSource);
-            } else if (directive is ImportDirective) {
-              explicitlyImportedSourceSet.add(referencedSource);
-            } else if (directive is PartDirective) {
-              includedSourceSet.add(referencedSource);
-            } else {
-              throw new AnalysisException(
-                  '$runtimeType failed to handle a ${directive.runtimeType}');
-            }
-          }
-        }
-      }
-    }
-    //
-    // Always include "dart:core" source.
-    //
-    HashSet<Source> importedSourceSet =
-        new HashSet.from(explicitlyImportedSourceSet);
-    Source coreLibrarySource = context.sourceFactory.forUri(DartSdk.DART_CORE);
-    if (coreLibrarySource == null) {
-      String message;
-      DartSdk sdk = context.sourceFactory.dartSdk;
-      if (sdk == null) {
-        message = 'Could not resolve "dart:core": SDK not defined';
-      } else {
-        message = 'Could not resolve "dart:core": SDK incorrectly configured';
-      }
-      throw new AnalysisException(message);
-    }
-    importedSourceSet.add(coreLibrarySource);
-    //
-    // Compute kind.
-    //
-    SourceKind sourceKind = SourceKind.LIBRARY;
-    if (modificationTime == -1) {
-      sourceKind = SourceKind.UNKNOWN;
-    } else if (hasPartOfDirective && !hasNonPartOfDirective) {
-      sourceKind = SourceKind.PART;
-    }
-    //
-    // Compute source lists.
-    //
-    List<Source> explicitlyImportedSources =
-        explicitlyImportedSourceSet.toList();
-    List<Source> exportedSources = exportedSourceSet.toList();
-    List<Source> importedSources = importedSourceSet.toList();
-    List<Source> includedSources = includedSourceSet.toList();
-    List<Source> unitSources = <Source>[_source]..addAll(includedSourceSet);
-    List<LibrarySpecificUnit> librarySpecificUnits =
-        unitSources.map((s) => new LibrarySpecificUnit(_source, s)).toList();
-    //
-    // Compute referenced sources.
-    //
-    Set<Source> referencedSources = new Set<Source>();
-    referencedSources.add(coreLibrarySource);
-    referencedSources.addAll(unitSources);
-    for (Directive directive in unit.directives) {
-      if (directive is NamespaceDirective) {
-        referencedSources.add(directive.uriSource);
-        for (Configuration configuration in directive.configurations) {
-          referencedSources.add(configuration.uriSource);
-        }
-      }
-    }
-    referencedSources.removeWhere((source) => source == null);
-    //
-    // Record outputs.
-    //
-    List<AnalysisError> parseErrors = getUniqueErrors(errorListener.errors);
-    outputs[EXPLICITLY_IMPORTED_LIBRARIES] = explicitlyImportedSources;
-    outputs[EXPORTED_LIBRARIES] = exportedSources;
-    outputs[IMPORTED_LIBRARIES] = importedSources;
-    outputs[INCLUDED_PARTS] = includedSources;
-    outputs[LIBRARY_SPECIFIC_UNITS] = librarySpecificUnits;
-    outputs[PARSE_ERRORS] = parseErrors;
-    outputs[PARSED_UNIT] = unit;
-    outputs[REFERENCED_SOURCES] = referencedSources.toList();
-    outputs[SOURCE_KIND] = sourceKind;
-    outputs[UNITS] = unitSources;
-  }
-
-  /**
-   * Return the result of resolving the URI of the given URI-based [directive]
-   * against the URI of the given library, or `null` if the URI is not valid.
-   */
-  Source _resolveDirective(UriBasedDirective directive) {
-    bool isImport = directive is ImportDirective;
-
-    // Resolve the default URI.
-    Source defaultSource;
-    {
-      StringLiteral uriLiteral = directive.uri;
-      String uriContent = uriLiteral.stringValue;
-      if (uriContent != null) {
-        uriContent = uriContent.trim();
-        directive.uriContent = uriContent;
-      }
-      defaultSource = _resolveUri(isImport, uriLiteral, uriContent);
-      directive.uriSource = defaultSource;
-    }
-
-    // Resolve all configurations and try to choose one.
-    if (directive is NamespaceDirectiveImpl) {
-      String configuredUriContent;
-      Source configuredSource;
-      for (Configuration configuration in directive.configurations) {
-        String uriContent = configuration.uri.stringValue;
-        Source source = _resolveUri(isImport, configuration.uri, uriContent);
-        configuration.uriSource = source;
-        if (configuredSource == null) {
-          String variableName =
-              configuration.name.components.map((i) => i.name).join('.');
-          String variableValue = context.declaredVariables.get(variableName);
-          if (configuration.value != null &&
-                  variableValue == configuration.value.stringValue ||
-              variableValue == 'true') {
-            configuredUriContent = configuration.uri.stringValue;
-            configuredSource = source;
-          }
-        }
-      }
-      String selectedContentUri = configuredUriContent ?? directive.uriContent;
-      Source selectedSource = configuredSource ?? defaultSource;
-      directive.selectedUriContent = selectedContentUri;
-      directive.selectedSource = selectedSource;
-      return selectedSource;
-    }
-    return defaultSource;
-  }
-
-  /**
-   * Return the result of resolve the given [uriContent], reporting errors
-   * against the [uriLiteral].
-   */
-  Source _resolveUri(
-      bool isImport, StringLiteral uriLiteral, String uriContent) {
-    UriValidationCode code =
-        UriBasedDirectiveImpl.validateUri(isImport, uriLiteral, uriContent);
-    if (code == null) {
-      try {
-        Uri.parse(uriContent);
-      } on FormatException {
-        return null;
-      }
-      return context.sourceFactory.resolveUri(_source, uriContent);
-    } else if (code == UriValidationCode.URI_WITH_DART_EXT_SCHEME) {
-      return null;
-    } else if (code == UriValidationCode.URI_WITH_INTERPOLATION) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.URI_WITH_INTERPOLATION, uriLiteral);
-      return null;
-    } else if (code == UriValidationCode.INVALID_URI) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.INVALID_URI, uriLiteral, [uriContent]);
-      return null;
-    }
-    throw new AnalysisException('Failed to handle validation code: $code');
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the given
-   * [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    return <String, TaskInput>{
-      LINE_INFO_INPUT_NAME: LINE_INFO.of(target),
-      MODIFICATION_TIME_INPUT_NAME: MODIFICATION_TIME.of(target),
-      TOKEN_STREAM_INPUT_NAME: TOKEN_STREAM.of(target, flushOnAccess: true)
-    };
-  }
-
-  /**
-   * Create a [ParseDartTask] based on the given [target] in the given
-   * [context].
-   */
-  static ParseDartTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ParseDartTask(context, target);
-  }
-}
-
-/**
- * A task that builds [RESOLVED_UNIT7] for a unit.
- */
-class PartiallyResolveUnitReferencesTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [LIBRARY_ELEMENT6] input.
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The name of the [RESOLVED_UNIT6] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'PartiallyResolveUnitReferencesTask',
-      createTask,
-      buildInputs, <ResultDescriptor>[
-    INFERABLE_STATIC_VARIABLES_IN_UNIT,
-    CREATED_RESOLVED_UNIT7,
-    RESOLVED_UNIT7
-  ]);
-
-  PartiallyResolveUnitReferencesTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT);
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    CompilationUnitElement unitElement = unit.declaredElement;
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    var inheritance = new InheritanceManager2(context.typeSystem);
-    //
-    // Resolve references and record outputs.
-    //
-    PartialResolverVisitor visitor = new PartialResolverVisitor(
-        inheritance,
-        libraryElement,
-        unitElement.source,
-        typeProvider,
-        AnalysisErrorListener.NULL_LISTENER);
-    unit.accept(visitor);
-    //
-    // Record outputs.
-    //
-    outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT] = visitor.staticVariables;
-    outputs[RESOLVED_UNIT7] = unit;
-    outputs[CREATED_RESOLVED_UNIT7] = true;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      'fullyBuiltLibraryElements': READY_LIBRARY_ELEMENT6.of(unit.library),
-      LIBRARY_INPUT: LIBRARY_ELEMENT6.of(unit.library),
-      UNIT_INPUT: RESOLVED_UNIT6.of(unit),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
-      // In strong mode, add additional dependencies to enforce inference
-      // ordering.
-
-      // Require that full inference be complete for all dependencies of the
-      // current library cycle.
-      'orderLibraryCycles': LIBRARY_CYCLE_DEPENDENCIES
-          .of(unit.library)
-          .toListOf(CREATED_RESOLVED_UNIT10)
-    };
-  }
-
-  /**
-   * Create a [PartiallyResolveUnitReferencesTask] based on the given [target]
-   * in the given [context].
-   */
-  static PartiallyResolveUnitReferencesTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new PartiallyResolveUnitReferencesTask(context, target);
-  }
-}
-
-/**
- * A task that ensures that [LIBRARY_ELEMENT2] is ready for the target library
- * source and its import/export closure.
- */
-class ReadyLibraryElement2Task extends SourceBasedAnalysisTask {
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ReadyLibraryElement2Task',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[READY_LIBRARY_ELEMENT2]);
-
-  ReadyLibraryElement2Task(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  bool get handlesDependencyCycles => true;
-
-  @override
-  void internalPerform() {
-    outputs[READY_LIBRARY_ELEMENT2] = true;
-  }
-
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      'thisLibraryElementReady': LIBRARY_ELEMENT2.of(source),
-      'directlyImportedLibrariesReady':
-          IMPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT2),
-      'directlyExportedLibrariesReady':
-          EXPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT2),
-    };
-  }
-
-  static ReadyLibraryElement2Task createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ReadyLibraryElement2Task(context, target);
-  }
-}
-
-/**
- * A task that ensures that [LIBRARY_ELEMENT6] is ready for the target library
- * source and its import/export closure.
- */
-class ReadyLibraryElement5Task extends SourceBasedAnalysisTask {
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ReadyLibraryElement5Task',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[READY_LIBRARY_ELEMENT6]);
-
-  ReadyLibraryElement5Task(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  bool get handlesDependencyCycles => true;
-
-  @override
-  void internalPerform() {
-    outputs[READY_LIBRARY_ELEMENT6] = true;
-  }
-
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      'thisLibraryElementReady': LIBRARY_ELEMENT6.of(source),
-      'directlyImportedLibrariesReady':
-          IMPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT6),
-      'directlyExportedLibrariesReady':
-          EXPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT6),
-    };
-  }
-
-  static ReadyLibraryElement5Task createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ReadyLibraryElement5Task(context, target);
-  }
-}
-
-/**
- * A task that ensures that [LIBRARY_ELEMENT7] is ready for the target library
- * source and its import/export closure.
- */
-class ReadyLibraryElement7Task extends SourceBasedAnalysisTask {
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ReadyLibraryElement7Task',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[READY_LIBRARY_ELEMENT7]);
-
-  ReadyLibraryElement7Task(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  bool get handlesDependencyCycles => true;
-
-  @override
-  void internalPerform() {
-    outputs[READY_LIBRARY_ELEMENT7] = true;
-  }
-
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      'thisLibraryElementReady': LIBRARY_ELEMENT7.of(source),
-      'directlyImportedLibrariesReady':
-          IMPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT7),
-      'directlyExportedLibrariesReady':
-          EXPORTED_LIBRARIES.of(source).toListOf(READY_LIBRARY_ELEMENT7),
-    };
-  }
-
-  static ReadyLibraryElement7Task createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ReadyLibraryElement7Task(context, target);
-  }
-}
-
-/**
- * A task that ensures that [RESOLVED_UNIT] is ready for every unit of the
- * target library source and its import/export closure.
- */
-class ReadyResolvedUnitTask extends SourceBasedAnalysisTask {
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ReadyResolvedUnitTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[READY_RESOLVED_UNIT]);
-
-  ReadyResolvedUnitTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  bool get handlesDependencyCycles => true;
-
-  @override
-  void internalPerform() {
-    outputs[READY_RESOLVED_UNIT] = true;
-  }
-
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      'thisLibraryUnitsReady':
-          LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT),
-    };
-  }
-
-  static ReadyResolvedUnitTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ReadyResolvedUnitTask(context, target);
-  }
-}
-
-/**
- * A task that ensures that the expression AST for a constant is resolved and
- * sets the [CONSTANT_EXPRESSION_RESOLVED] result.
- */
-class ResolveConstantExpressionTask extends ConstantEvaluationAnalysisTask {
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolveConstantExpressionTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[CONSTANT_EXPRESSION_RESOLVED]);
-
-  ResolveConstantExpressionTask(
-      InternalAnalysisContext context, ConstantEvaluationTarget constant)
-      : super(context, constant);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Record outputs.
-    //
-    outputs[CONSTANT_EXPRESSION_RESOLVED] = true;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source librarySource;
-    if (target is Element) {
-      CompilationUnitElementImpl unit = target
-          .getAncestor((Element element) => element is CompilationUnitElement);
-      librarySource = unit.librarySource;
-    } else if (target is ElementAnnotationImpl) {
-      librarySource = target.librarySource;
-    } else {
-      throw new AnalysisException(
-          'Cannot build inputs for a ${target.runtimeType}');
-    }
-    return <String, TaskInput>{
-      'createdResolvedUnit': CREATED_RESOLVED_UNIT11
-          .of(new LibrarySpecificUnit(librarySource, target.source))
-    };
-  }
-
-  /**
-   * Create a [ResolveConstantExpressionTask] based on the given [target] in
-   * the given [context].
-   */
-  static ResolveConstantExpressionTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolveConstantExpressionTask(context, target);
-  }
-}
-
-/**
- * A task that resolves imports and export directives to already built elements.
- */
-class ResolveDirectiveElementsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input whose value is the defining [LIBRARY_ELEMENT2].
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The name of the input for [RESOLVED_UNIT1] of a unit.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  static const String SOURCES_MODIFICATION_TIME_INPUT =
-      'SOURCES_MODIFICATION_TIME_INPUT';
-  static const String IMPORTS_SOURCE_KIND_INPUT = 'IMPORTS_SOURCE_KIND_INPUT';
-  static const String EXPORTS_SOURCE_KIND_INPUT = 'EXPORTS_SOURCE_KIND_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolveDirectiveElementsTask',
-      createTask,
-      buildInputs, <ResultDescriptor>[
-    CREATED_RESOLVED_UNIT2,
-    RESOLVED_UNIT2,
-    RESOLVE_DIRECTIVES_ERRORS
-  ]);
-
-  ResolveDirectiveElementsTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    LibrarySpecificUnit targetUnit = target;
-    //
-    // Prepare inputs.
-    //
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    Map<Source, int> sourceModificationTimeMap =
-        getRequiredInput(SOURCES_MODIFICATION_TIME_INPUT);
-    Map<Source, SourceKind> importSourceKindMap =
-        getRequiredInput(IMPORTS_SOURCE_KIND_INPUT);
-    Map<Source, SourceKind> exportSourceKindMap =
-        getRequiredInput(EXPORTS_SOURCE_KIND_INPUT);
-    //
-    // Resolve directive AST nodes to elements.
-    //
-    List<AnalysisError> errors = const <AnalysisError>[];
-    if (targetUnit.unit == targetUnit.library) {
-      DirectiveResolver resolver = new DirectiveResolver(
-          sourceModificationTimeMap, importSourceKindMap, exportSourceKindMap);
-      unit.accept(resolver);
-      errors = resolver.errors;
-    }
-    //
-    // Record outputs.
-    //
-    outputs[CREATED_RESOLVED_UNIT2] = true;
-    outputs[RESOLVED_UNIT2] = unit;
-    outputs[RESOLVE_DIRECTIVES_ERRORS] = errors;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      LIBRARY_INPUT: LIBRARY_ELEMENT2.of(unit.library),
-      UNIT_INPUT: RESOLVED_UNIT1.of(unit),
-      SOURCES_MODIFICATION_TIME_INPUT:
-          REFERENCED_SOURCES.of(unit.library).toMapOf(MODIFICATION_TIME),
-      IMPORTS_SOURCE_KIND_INPUT:
-          IMPORTED_LIBRARIES.of(unit.library).toMapOf(SOURCE_KIND),
-      EXPORTS_SOURCE_KIND_INPUT:
-          EXPORTED_LIBRARIES.of(unit.library).toMapOf(SOURCE_KIND)
-    };
-  }
-
-  /**
-   * Create a [ResolveDirectiveElementsTask] based on the given [target] in
-   * the given [context].
-   */
-  static ResolveDirectiveElementsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolveDirectiveElementsTask(context, target);
-  }
-}
-
-/**
- * An artificial task that does nothing except to force [LIBRARY_ELEMENT7] for
- * the target library and its import/export closure.
- */
-class ResolvedUnit7InLibraryClosureTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [LIBRARY_ELEMENT7] input.
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolvedUnit7InLibraryClosureTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[LIBRARY_ELEMENT8]);
-
-  ResolvedUnit7InLibraryClosureTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    LibraryElement library = getRequiredInput(LIBRARY_INPUT);
-    outputs[LIBRARY_ELEMENT8] = library;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      'readyForClosure': READY_LIBRARY_ELEMENT7.of(source),
-      LIBRARY_INPUT: LIBRARY_ELEMENT7.of(source),
-    };
-  }
-
-  /**
-   * Create a [ResolvedUnit7InLibraryClosureTask] based on the given
-   * [target] in the given [context].
-   */
-  static ResolvedUnit7InLibraryClosureTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolvedUnit7InLibraryClosureTask(context, target);
-  }
-}
-
-/**
- * An artificial task that does nothing except to force [LIBRARY_ELEMENT6] and
- * [RESOLVED_UNIT7] in the defining and part units of a library.
- */
-class ResolvedUnit7InLibraryTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [LIBRARY_ELEMENT6] input.
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolvedUnit7InLibraryTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[LIBRARY_ELEMENT7]);
-
-  ResolvedUnit7InLibraryTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    LibraryElement library = getRequiredInput(LIBRARY_INPUT);
-    outputs[LIBRARY_ELEMENT7] = library;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      'resolvedUnits':
-          LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT7),
-      LIBRARY_INPUT: LIBRARY_ELEMENT6.of(source),
-    };
-  }
-
-  /**
-   * Create a [ResolvedUnit7InLibraryTask] based on the given [target]
-   * in the given [context].
-   */
-  static ResolvedUnit7InLibraryTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolvedUnit7InLibraryTask(context, target);
-  }
-}
-
-/**
- * A task that ensures that all of the inferable instance members in a
- * compilation unit have had their right hand sides re-resolved
- */
-class ResolveInstanceFieldsInUnitTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [LIBRARY_ELEMENT6] input.
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The name of the input whose value is the [RESOLVED_UNIT8] for the
-   * compilation unit.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolveInstanceFieldsInUnitTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[CREATED_RESOLVED_UNIT9, RESOLVED_UNIT9]);
-
-  /**
-   * Initialize a newly created task to build a library element for the given
-   * [unit] in the given [context].
-   */
-  ResolveInstanceFieldsInUnitTask(
-      InternalAnalysisContext context, LibrarySpecificUnit unit)
-      : super(context, unit);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT);
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    var inheritance = new InheritanceManager2(context.typeSystem);
-
-    CompilationUnitElement unitElement = unit.declaredElement;
-    //
-    // Resolve references.
-    //
-    InstanceFieldResolverVisitor visitor = new InstanceFieldResolverVisitor(
-        inheritance,
-        libraryElement,
-        unitElement.source,
-        typeProvider,
-        AnalysisErrorListener.NULL_LISTENER);
-    visitor.resolveCompilationUnit(unit);
-    //
-    // Record outputs.
-    //
-    outputs[RESOLVED_UNIT9] = unit;
-    outputs[CREATED_RESOLVED_UNIT9] = true;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the given
-   * [libSource].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      UNIT_INPUT: RESOLVED_UNIT8.of(unit),
-      LIBRARY_INPUT: LIBRARY_ELEMENT6.of(unit.library),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
-      // In strong mode, add additional dependencies to enforce inference
-      // ordering.
-
-      // Require that static variable inference  be complete for all units in
-      // the current library cycle.
-      'orderLibraryCycleTasks':
-          LIBRARY_CYCLE_UNITS.of(unit.library).toListOf(CREATED_RESOLVED_UNIT8),
-      // Require that full inference be complete for all dependencies of the
-      // current library cycle.
-      'orderLibraryCycles': LIBRARY_CYCLE_DEPENDENCIES
-          .of(unit.library)
-          .toListOf(CREATED_RESOLVED_UNIT10)
-    };
-  }
-
-  /**
-   * Create a [ResolveInstanceFieldsInUnitTask] based on the given [target] in
-   * the given [context].
-   */
-  static ResolveInstanceFieldsInUnitTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolveInstanceFieldsInUnitTask(context, target);
-  }
-}
-
-/**
- * A task that finishes resolution by requesting [RESOLVED_UNIT11] for every
- * unit in the libraries closure and produces [LIBRARY_ELEMENT9].
- */
-class ResolveLibraryReferencesTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [LIBRARY_ELEMENT8] input.
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolveLibraryReferencesTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[LIBRARY_ELEMENT9]);
-
-  ResolveLibraryReferencesTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    LibraryElement library = getRequiredInput(LIBRARY_INPUT);
-    outputs[LIBRARY_ELEMENT9] = library;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      LIBRARY_INPUT: LIBRARY_ELEMENT8.of(source),
-      'resolvedUnits':
-          LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT11),
-    };
-  }
-
-  /**
-   * Create a [ResolveLibraryReferencesTask] based on the given [target] in
-   * the given [context].
-   */
-  static ResolveLibraryReferencesTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolveLibraryReferencesTask(context, target);
-  }
-}
-
-/**
- * A task that finishes resolution by requesting [RESOLVED_UNIT12] for every
- * unit in the libraries closure and produces [LIBRARY_ELEMENT].
- */
-class ResolveLibraryTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [LIBRARY_ELEMENT9] input.
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The name of the list of [RESOLVED_UNIT12] input.
-   */
-  static const String UNITS_INPUT = 'UNITS_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolveLibraryTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[LIBRARY_ELEMENT]);
-
-  ResolveLibraryTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    LibraryElement library = getRequiredInput(LIBRARY_INPUT);
-    //
-    // Record outputs.
-    //
-    outputs[LIBRARY_ELEMENT] = library;
-  }
-
-/**
- * Return a map from the names of the inputs of this kind of task to the task
- * input descriptors describing those inputs for a task with the
- * given [target].
- */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      LIBRARY_INPUT: LIBRARY_ELEMENT9.of(source),
-      'thisLibraryClosureIsReady': READY_RESOLVED_UNIT.of(source),
-    };
-  }
-
-/**
- * Create a [ResolveLibraryTask] based on the given [target] in the given
- * [context].
- */
-  static ResolveLibraryTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolveLibraryTask(context, target);
-  }
-}
-
-/**
- * An artificial task that does nothing except to force type names resolution
- * for the defining and part units of a library.
- */
-class ResolveLibraryTypeNamesTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [LIBRARY_ELEMENT5] input.
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolveLibraryTypeNamesTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[LIBRARY_ELEMENT6]);
-
-  ResolveLibraryTypeNamesTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    LibraryElement library = getRequiredInput(LIBRARY_INPUT);
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    //
-    // Create the synthetic element for `loadLibrary`.
-    //
-    (library as LibraryElementImpl).createLoadLibraryFunction(typeProvider);
-    //
-    // Record outputs.
-    //
-    outputs[LIBRARY_ELEMENT6] = library;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      'resolvedUnit':
-          LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT5),
-      LIBRARY_INPUT: LIBRARY_ELEMENT5.of(source),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
-    };
-  }
-
-  /**
-   * Create a [ResolveLibraryTypeNamesTask] based on the given [target] in
-   * the given [context].
-   */
-  static ResolveLibraryTypeNamesTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolveLibraryTypeNamesTask(context, target);
-  }
-}
-
-/**
- * An artificial task that does nothing except to force type parameter bounds
- * type names resolution for the defining and part units of a library.
- */
-class ResolveTopLevelLibraryTypeBoundsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [LIBRARY_ELEMENT4] input.
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolveTopLevelLibraryTypeBoundsTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[LIBRARY_ELEMENT5]);
-
-  ResolveTopLevelLibraryTypeBoundsTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  bool get handlesDependencyCycles => true;
-
-  @override
-  void internalPerform() {
-    LibraryElement library = getRequiredInput(LIBRARY_INPUT);
-    outputs[LIBRARY_ELEMENT5] = library;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    Source source = target;
-    return <String, TaskInput>{
-      LIBRARY_INPUT: LIBRARY_ELEMENT4.of(source),
-      'thisLibraryUnitsReady':
-          LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT4),
-      'directlyImportedLibrariesReady':
-          IMPORTED_LIBRARIES.of(source).toListOf(LIBRARY_ELEMENT5),
-      'directlyExportedLibrariesReady':
-          EXPORTED_LIBRARIES.of(source).toListOf(LIBRARY_ELEMENT5),
-    };
-  }
-
-  /**
-   * Create a [ResolveTopLevelLibraryTypeBoundsTask] based on the given [target]
-   * in the given [context].
-   */
-  static ResolveTopLevelLibraryTypeBoundsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolveTopLevelLibraryTypeBoundsTask(context, target);
-  }
-}
-
-/**
- * A task that builds [RESOLVED_UNIT4] for a unit.
- */
-class ResolveTopLevelUnitTypeBoundsTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input whose value is the defining [LIBRARY_ELEMENT4].
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The name of the [RESOLVED_UNIT3] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolveTopLevelUnitTypeBoundsTask',
-      createTask,
-      buildInputs, <ResultDescriptor>[
-    RESOLVE_TYPE_BOUNDS_ERRORS,
-    CREATED_RESOLVED_UNIT4,
-    RESOLVED_UNIT4
-  ]);
-
-  ResolveTopLevelUnitTypeBoundsTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    LibraryElement library = getRequiredInput(LIBRARY_INPUT);
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    CompilationUnitElement unitElement = unit.declaredElement;
-    //
-    // Resolve TypeName nodes.
-    //
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    new TypeParameterBoundsResolver(
-            context.typeSystem, library, unitElement.source, errorListener)
-        .resolveTypeBounds(unit);
-    //
-    // Record outputs.
-    //
-    outputs[RESOLVE_TYPE_BOUNDS_ERRORS] =
-        getTargetSourceErrors(errorListener, target);
-    outputs[RESOLVED_UNIT4] = unit;
-    outputs[CREATED_RESOLVED_UNIT4] = true;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    // TODO(brianwilkerson) This task updates the element model to have type
-    // information and updates the class hierarchy. It should produce a new
-    // version of the element model in order to record those changes.
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      'importsExportNamespace':
-          IMPORTED_LIBRARIES.of(unit.library).toMapOf(LIBRARY_ELEMENT4),
-      'dependOnAllExportedSources':
-          IMPORTED_LIBRARIES.of(unit.library).toMapOf(EXPORT_SOURCE_CLOSURE),
-      LIBRARY_INPUT: LIBRARY_ELEMENT4.of(unit.library),
-      UNIT_INPUT: RESOLVED_UNIT3.of(unit)
-    };
-  }
-
-  /**
-   * Create a [ResolveTopLevelUnitTypeBoundsTask] based on the given [target] in
-   * the given [context].
-   */
-  static ResolveTopLevelUnitTypeBoundsTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolveTopLevelUnitTypeBoundsTask(context, target);
-  }
-}
-
-/**
- * A task that resolves the bodies of top-level functions, constructors, and
- * methods within a single compilation unit.
- */
-class ResolveUnitTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input whose value is the defining [LIBRARY_ELEMENT8].
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The name of the [RESOLVED_UNIT10] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolveUnitTask', createTask, buildInputs, <ResultDescriptor>[
-    CONSTANT_EXPRESSIONS_DEPENDENCIES,
-    RESOLVE_UNIT_ERRORS,
-    CREATED_RESOLVED_UNIT11,
-    RESOLVED_UNIT11
-  ]);
-
-  ResolveUnitTask(
-      InternalAnalysisContext context, LibrarySpecificUnit compilationUnit)
-      : super(context, compilationUnit);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    LibrarySpecificUnit target = this.target;
-    LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT);
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    var inheritance = new InheritanceManager2(context.typeSystem);
-    //
-    // Resolve everything.
-    //
-    CompilationUnitElement unitElement = unit.declaredElement;
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    ResolverVisitor visitor = new ResolverVisitor(inheritance, libraryElement,
-        unitElement.source, typeProvider, errorListener);
-    unit.accept(visitor);
-    //
-    // Compute constant expressions' dependencies.
-    //
-    List<ConstantEvaluationTarget> constExprDependencies;
-    {
-      ConstantExpressionsDependenciesFinder finder =
-          new ConstantExpressionsDependenciesFinder();
-      unit.accept(finder);
-      constExprDependencies = finder.dependencies.toList();
-    }
-    //
-    // Record outputs.
-    //
-    // TODO(brianwilkerson) This task modifies the element model (by copying the
-    // AST's for constructor initializers into it) but does not produce an
-    // updated version of the element model.
-    //
-    outputs[CONSTANT_EXPRESSIONS_DEPENDENCIES] = constExprDependencies;
-    outputs[RESOLVE_UNIT_ERRORS] = getTargetSourceErrors(errorListener, target);
-    outputs[RESOLVED_UNIT11] = unit;
-    outputs[CREATED_RESOLVED_UNIT11] = true;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the given
-   * [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      LIBRARY_INPUT: LIBRARY_ELEMENT8.of(unit.library),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
-      UNIT_INPUT: RESOLVED_UNIT10.of(unit),
-      // In strong mode, add additional dependencies to enforce inference
-      // ordering.
-
-      // Require that inference be complete for all units in the
-      // current library cycle.
-      'orderLibraryCycleTasks':
-          LIBRARY_CYCLE_UNITS.of(unit.library).toListOf(CREATED_RESOLVED_UNIT10)
-    };
-  }
-
-  /**
-   * Create a [ResolveUnitTask] based on the given [target] in
-   * the given [context].
-   */
-  static ResolveUnitTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolveUnitTask(context, target);
-  }
-}
-
-/**
- * A task that builds [RESOLVED_UNIT5] for a unit.
- */
-class ResolveUnitTypeNamesTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input whose value is the defining [LIBRARY_ELEMENT5].
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The name of the [RESOLVED_UNIT4] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolveUnitTypeNamesTask', createTask, buildInputs, <ResultDescriptor>[
-    RESOLVE_TYPE_NAMES_ERRORS,
-    CREATED_RESOLVED_UNIT5,
-    RESOLVED_UNIT5
-  ]);
-
-  ResolveUnitTypeNamesTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    LibraryElement library = getRequiredInput(LIBRARY_INPUT);
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    CompilationUnitElement unitElement = unit.declaredElement;
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    //
-    // Resolve TypeName nodes.
-    //
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    TypeResolverVisitor visitor = new TypeResolverVisitor(
-        library, unitElement.source, typeProvider, errorListener,
-        shouldUseWithClauseInferredTypes: false,
-        shouldSetElementSupertypes: true);
-    unit.accept(visitor);
-    //
-    // Re-write the AST to handle the optional new and const feature.
-    //
-    unit.accept(new AstRewriteVisitor(context.typeSystem, library,
-        unit.declaredElement.source, typeProvider, errorListener));
-    //
-    // Record outputs.
-    //
-    outputs[RESOLVE_TYPE_NAMES_ERRORS] =
-        getTargetSourceErrors(errorListener, target);
-    outputs[RESOLVED_UNIT5] = unit;
-    outputs[CREATED_RESOLVED_UNIT5] = true;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    // TODO(brianwilkerson) This task updates the element model to have type
-    // information and updates the class hierarchy. It should produce a new
-    // version of the element model in order to record those changes.
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library),
-      UNIT_INPUT: RESOLVED_UNIT4.of(unit),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
-    };
-  }
-
-  /**
-   * Create a [ResolveUnitTypeNamesTask] based on the given [target] in
-   * the given [context].
-   */
-  static ResolveUnitTypeNamesTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolveUnitTypeNamesTask(context, target);
-  }
-}
-
-/**
- * A task that builds [RESOLVED_UNIT6] for a unit.
- */
-class ResolveVariableReferencesTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [LIBRARY_ELEMENT1] input.
-   */
-  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
-
-  /**
-   * The name of the [RESOLVED_UNIT5] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ResolveVariableReferencesTask',
-      createTask,
-      buildInputs, <ResultDescriptor>[
-    CREATED_RESOLVED_UNIT6,
-    RESOLVED_UNIT6,
-    VARIABLE_REFERENCE_ERRORS
-  ]);
-
-  ResolveVariableReferencesTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    //
-    // Prepare inputs.
-    //
-    LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT);
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    CompilationUnitElement unitElement = unit.declaredElement;
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    //
-    // Resolve local variables.
-    //
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    Scope nameScope = new LibraryScope(libraryElement);
-    VariableResolverVisitor visitor = new VariableResolverVisitor(
-        libraryElement, unitElement.source, typeProvider, errorListener,
-        nameScope: nameScope);
-    unit.accept(visitor);
-    //
-    // Record outputs.
-    //
-    outputs[RESOLVED_UNIT6] = unit;
-    outputs[CREATED_RESOLVED_UNIT6] = true;
-    outputs[VARIABLE_REFERENCE_ERRORS] =
-        getTargetSourceErrors(errorListener, target);
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      LIBRARY_INPUT: LIBRARY_ELEMENT1.of(unit.library),
-      UNIT_INPUT: RESOLVED_UNIT5.of(unit),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
-    };
-  }
-
-  /**
-   * Create a [ResolveVariableReferencesTask] based on the given [target] in
-   * the given [context].
-   */
-  static ResolveVariableReferencesTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ResolveVariableReferencesTask(context, target);
-  }
-}
-
-/**
- * A task that scans the content of a Dart file, producing a stream of Dart
- * tokens, line information, and any lexical errors encountered in the process.
- */
-class ScanDartTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the input whose value is the content of the file.
-   */
-  static const String CONTENT_INPUT_NAME = 'CONTENT_INPUT_NAME';
-
-  /**
-   * The name of the input whose value is the modification time of the file.
-   */
-  static const String MODIFICATION_TIME_INPUT = 'MODIFICATION_TIME_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'ScanDartTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[IGNORE_INFO, LINE_INFO, SCAN_ERRORS, TOKEN_STREAM],
-      suitabilityFor: suitabilityFor);
-
-  /**
-   * Initialize a newly created task to access the content of the source
-   * associated with the given [target] in the given [context].
-   */
-  ScanDartTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    Source source = getRequiredSource();
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-
-    int modificationTime = getRequiredInput(MODIFICATION_TIME_INPUT);
-    if (modificationTime < 0) {
-      String message = 'Content could not be read';
-      if (context is InternalAnalysisContext) {
-        CacheEntry entry =
-            (context as InternalAnalysisContext).getCacheEntry(target);
-        CaughtException exception = entry.exception;
-        if (exception != null) {
-          message = exception.toString();
-        }
-      }
-      if (source.exists()) {
-        errorListener.onError(new AnalysisError(
-            source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT, [message]));
-      }
-    }
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the given
-   * [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    if (target is Source) {
-      return <String, TaskInput>{
-        CONTENT_INPUT_NAME: CONTENT.of(target, flushOnAccess: true),
-        MODIFICATION_TIME_INPUT: MODIFICATION_TIME.of(target)
-      };
-    }
-    throw new AnalysisException(
-        'Cannot build inputs for a ${target.runtimeType}');
-  }
-
-  /**
-   * Create a [ScanDartTask] based on the given [target] in the given [context].
-   */
-  static ScanDartTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new ScanDartTask(context, target);
-  }
-
-  /**
-   * Return an indication of how suitable this task is for the given [target].
-   */
-  static TaskSuitability suitabilityFor(AnalysisTarget target) {
-    if (target is Source) {
-      if (target.shortName.endsWith(AnalysisEngine.SUFFIX_DART)) {
-        return TaskSuitability.HIGHEST;
-      }
-      return TaskSuitability.LOWEST;
-    }
-    return TaskSuitability.NONE;
-  }
-}
-
-/**
- * A task that builds [STRONG_MODE_ERRORS] for a unit.  Also builds
- * [RESOLVED_UNIT] for a unit.
- */
-class StrongModeVerifyUnitTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [RESOLVED_UNIT12] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'StrongModeVerifyUnitTask', createTask, buildInputs, <ResultDescriptor>[
-    STRONG_MODE_ERRORS,
-    CREATED_RESOLVED_UNIT,
-    RESOLVED_UNIT
-  ]);
-
-  StrongModeVerifyUnitTask(
-      InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    //
-    // Prepare inputs.
-    //
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    AnalysisOptionsImpl options = context.analysisOptions;
-    if (options.strongMode) {
-      CodeChecker checker = new CodeChecker(
-          typeProvider,
-          new Dart2TypeSystem(typeProvider,
-              implicitCasts: options.implicitCasts),
-          errorListener,
-          options);
-      checker.visitCompilationUnit(unit);
-    }
-    //
-    // Record outputs.
-    //
-    outputs[STRONG_MODE_ERRORS] = getUniqueErrors(errorListener.errors);
-    outputs[CREATED_RESOLVED_UNIT] = true;
-    outputs[RESOLVED_UNIT] = unit;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      UNIT_INPUT: RESOLVED_UNIT12.of(unit),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
-    };
-  }
-
-  /**
-   * Create a [StrongModeVerifyUnitTask] based on the given [target] in
-   * the given [context].
-   */
-  static StrongModeVerifyUnitTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new StrongModeVerifyUnitTask(context, target);
-  }
-}
-
-/**
- * A task that builds [VERIFY_ERRORS] for a unit.
- */
-class VerifyUnitTask extends SourceBasedAnalysisTask {
-  /**
-   * The name of the [PENDING_ERRORS] input.
-   */
-  static const String PENDING_ERRORS_INPUT = 'PENDING_ERRORS_INPUT';
-
-  /**
-   * The name of the input of a mapping from [REFERENCED_SOURCES] to their
-   * [MODIFICATION_TIME]s.
-   */
-  static const String REFERENCED_SOURCE_MODIFICATION_TIME_MAP_INPUT =
-      'REFERENCED_SOURCE_MODIFICATION_TIME_MAP_INPUT';
-
-  /**
-   * The name of the [TYPE_PROVIDER] input.
-   */
-  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
-
-  /**
-   * The name of the [RESOLVED_UNIT] input.
-   */
-  static const String UNIT_INPUT = 'UNIT_INPUT';
-
-  /**
-   * The task descriptor describing this kind of task.
-   */
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('VerifyUnitTask',
-      createTask, buildInputs, <ResultDescriptor>[VERIFY_ERRORS]);
-
-  /**
-   * The [ErrorReporter] to report errors to.
-   */
-  ErrorReporter errorReporter;
-
-  /**
-   * The mapping from the current library referenced sources to their
-   * modification times.
-   */
-  Map<Source, int> sourceTimeMap;
-
-  VerifyUnitTask(InternalAnalysisContext context, AnalysisTarget target)
-      : super(context, target);
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  @override
-  void internalPerform() {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    Source source = getRequiredSource();
-    errorReporter = new ErrorReporter(errorListener, source);
-    //
-    // Prepare inputs.
-    //
-    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
-    CompilationUnitElement unitElement = unit.declaredElement;
-    LibraryElement libraryElement = unitElement.library;
-    if (libraryElement == null) {
-      throw new AnalysisException(
-          'VerifyUnitTask verifying a unit with no library: '
-          '${unitElement.source.fullName}');
-    }
-    List<PendingError> pendingErrors = getRequiredInput(PENDING_ERRORS_INPUT);
-    sourceTimeMap =
-        getRequiredInput(REFERENCED_SOURCE_MODIFICATION_TIME_MAP_INPUT);
-    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    //
-    // Validate the directives.
-    //
-    validateDirectives(unit);
-    //
-    // Use the ConstantVerifier to compute errors.
-    //
-    ConstantVerifier constantVerifier = new ConstantVerifier(
-        errorReporter, libraryElement, typeProvider, context.declaredVariables);
-    unit.accept(constantVerifier);
-
-    //
-    // Compute inheritance and override errors.
-    //
-    var typeSystem = libraryElement.context.typeSystem;
-    var inheritanceManager = new InheritanceManager2(typeSystem);
-    var inheritanceOverrideVerifier = new InheritanceOverrideVerifier(
-        typeSystem, inheritanceManager, errorReporter);
-    inheritanceOverrideVerifier.verifyUnit(unit);
-
-    //
-    // Use the ErrorVerifier to compute errors.
-    //
-    ErrorVerifier errorVerifier = new ErrorVerifier(
-        errorReporter, libraryElement, typeProvider, inheritanceManager, false,
-        disableConflictingGenericsCheck: true);
-    unit.accept(errorVerifier);
-    //
-    // Convert the pending errors into actual errors.
-    //
-    for (PendingError pendingError in pendingErrors) {
-      errorListener.onError(pendingError.toAnalysisError());
-    }
-    //
-    // Record outputs.
-    //
-    outputs[VERIFY_ERRORS] = getUniqueErrors(errorListener.errors);
-  }
-
-  /**
-   * Check each directive in the given [unit] to see if the referenced source
-   * exists and report an error if it does not.
-   */
-  void validateDirectives(CompilationUnit unit) {
-    NodeList<Directive> directives = unit.directives;
-    int length = directives.length;
-    for (int i = 0; i < length; i++) {
-      Directive directive = directives[i];
-      if (directive is UriBasedDirective) {
-        validateReferencedSource(directive);
-      }
-    }
-  }
-
-  /**
-   * Check the given [directive] to see if the referenced source exists and
-   * report an error if it does not.
-   */
-  void validateReferencedSource(UriBasedDirectiveImpl directive) {
-    if (directive is NamespaceDirectiveImpl) {
-      for (Configuration configuration in directive.configurations) {
-        Source source = configuration.uriSource;
-        StringLiteral uriLiteral = configuration.uri;
-        String uriContent = uriLiteral?.stringValue?.trim();
-        if (source != null) {
-          int modificationTime = sourceTimeMap[source] ?? -1;
-          if (modificationTime >= 0) {
-            continue;
-          }
-        } else {
-          // Don't report errors already reported by ParseDartTask.resolveDirective
-          if (UriBasedDirectiveImpl.validateUri(
-                  directive is ImportDirective, uriLiteral, uriContent) !=
-              null) {
-            continue;
-          }
-        }
-        CompileTimeErrorCode errorCode =
-            CompileTimeErrorCode.URI_DOES_NOT_EXIST;
-        if (_isGenerated(source)) {
-          errorCode = CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED;
-        }
-        errorReporter.reportErrorForNode(errorCode, uriLiteral, [uriContent]);
-      }
-    }
-    Source source = directive.uriSource;
-    if (source != null) {
-      int modificationTime = sourceTimeMap[source] ?? -1;
-      if (modificationTime >= 0) {
-        return;
-      }
-    } else {
-      // Don't report errors already reported by ParseDartTask.resolveDirective
-      if (directive.validate() != null) {
-        return;
-      }
-    }
-    StringLiteral uriLiteral = directive.uri;
-    CompileTimeErrorCode errorCode = CompileTimeErrorCode.URI_DOES_NOT_EXIST;
-    if (_isGenerated(source)) {
-      errorCode = CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED;
-    }
-    errorReporter
-        .reportErrorForNode(errorCode, uriLiteral, [directive.uriContent]);
-  }
-
-  /**
-   * Return `true` if the given [source] refers to a file that is assumed to be
-   * generated.
-   */
-  bool _isGenerated(Source source) {
-    if (source == null) {
-      return false;
-    }
-    // TODO(brianwilkerson) Generalize this mechanism.
-    const List<String> suffixes = const <String>[
-      '.g.dart',
-      '.pb.dart',
-      '.pbenum.dart',
-      '.pbserver.dart',
-      '.pbjson.dart',
-      '.template.dart'
-    ];
-    String fullName = source.fullName;
-    for (String suffix in suffixes) {
-      if (fullName.endsWith(suffix)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Return a map from the names of the inputs of this kind of task to the task
-   * input descriptors describing those inputs for a task with the
-   * given [target].
-   */
-  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
-    LibrarySpecificUnit unit = target;
-    return <String, TaskInput>{
-      'thisLibraryClosureIsReady': READY_RESOLVED_UNIT.of(unit.library),
-      UNIT_INPUT: RESOLVED_UNIT.of(unit),
-      REFERENCED_SOURCE_MODIFICATION_TIME_MAP_INPUT:
-          REFERENCED_SOURCES.of(unit.library).toMapOf(MODIFICATION_TIME),
-      PENDING_ERRORS_INPUT: PENDING_ERRORS.of(unit),
-      'requiredConstants': REQUIRED_CONSTANTS.of(unit).toListOf(CONSTANT_VALUE),
-      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
-    };
-  }
-
-  /**
-   * Create a [VerifyUnitTask] based on the given [target] in
-   * the given [context].
-   */
-  static VerifyUnitTask createTask(
-      AnalysisContext context, AnalysisTarget target) {
-    return new VerifyUnitTask(context, target);
-  }
-}
-
-/**
- * A [TaskInput] whose value is a list of library sources exported directly
- * or indirectly by the target [Source].
- *
- * [resultDescriptor] is the type of result which should be produced for each
- * target [Source].
- */
-class _ExportSourceClosureTaskInput extends TaskInputImpl<List<Source>> {
-  final Source target;
-  final ResultDescriptor resultDescriptor;
-
-  _ExportSourceClosureTaskInput(this.target, this.resultDescriptor);
-
-  @override
-  TaskInputBuilder<List<Source>> createBuilder() =>
-      new _SourceClosureTaskInputBuilder(
-          target, _SourceClosureKind.EXPORT, resultDescriptor);
-}
-
-/**
- * An object holding either the name or the source associated with a part-of
- * directive.
- */
-class _NameOrSource {
-  final String name;
-
-  final Source source;
-
-  _NameOrSource(this.name, this.source);
-}
-
-/**
- * The kind of the source closure to build.
- */
-enum _SourceClosureKind { IMPORT, EXPORT, IMPORT_EXPORT }
-
-/**
- * A [TaskInputBuilder] used by [_ExportSourceClosureTaskInput].
- */
-class _SourceClosureTaskInputBuilder implements TaskInputBuilder<List<Source>> {
-  final _SourceClosureKind kind;
-  final Set<LibraryElement> _libraries = new HashSet<LibraryElement>();
-  final List<Source> _newSources = <Source>[];
-
-  @override
-  final ResultDescriptor currentResult;
-
-  Source currentTarget;
-
-  _SourceClosureTaskInputBuilder(
-      Source librarySource, this.kind, this.currentResult) {
-    _newSources.add(librarySource);
-  }
-
-  @override
-  void set currentValue(Object value) {
-    LibraryElement library = value;
-    if (_libraries.add(library)) {
-      if (kind == _SourceClosureKind.IMPORT ||
-          kind == _SourceClosureKind.IMPORT_EXPORT) {
-        List<ImportElement> imports = library.imports;
-        int length = imports.length;
-        for (int i = 0; i < length; i++) {
-          ImportElement importElement = imports[i];
-          Source importedSource = importElement.importedLibrary?.source;
-          if (importedSource != null) {
-            _newSources.add(importedSource);
-          }
-        }
-      }
-      if (kind == _SourceClosureKind.EXPORT ||
-          kind == _SourceClosureKind.IMPORT_EXPORT) {
-        List<ExportElement> exports = library.exports;
-        int length = exports.length;
-        for (int i = 0; i < length; i++) {
-          ExportElement exportElement = exports[i];
-          Source exportedSource = exportElement.exportedLibrary?.source;
-          if (exportedSource != null) {
-            _newSources.add(exportedSource);
-          }
-        }
-      }
-    }
-  }
-
-  @override
-  bool get flushOnAccess => false;
-
-  @override
-  List<Source> get inputValue {
-    return _libraries.map((LibraryElement library) => library.source).toList();
-  }
-
-  @override
-  void currentValueNotAvailable() {
-    // Nothing needs to be done.  moveNext() will simply go on to the next new
-    // source.
-  }
-
-  @override
-  bool moveNext() {
-    if (_newSources.isEmpty) {
-      return false;
-    }
-    currentTarget = _newSources.removeLast();
-    return true;
-  }
-}
diff --git a/analyzer/lib/src/task/dart_work_manager.dart b/analyzer/lib/src/task/dart_work_manager.dart
deleted file mode 100644
index 5aa9869..0000000
--- a/analyzer/lib/src/task/dart_work_manager.dart
+++ /dev/null
@@ -1,498 +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.
-
-import 'dart:collection';
-
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/context/cache.dart';
-import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisEngine, AnalysisErrorInfo, CacheState, InternalAnalysisContext;
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/utilities_collection.dart';
-import 'package:analyzer/src/task/api/dart.dart';
-import 'package:analyzer/src/task/api/model.dart';
-import 'package:analyzer/src/task/dart.dart';
-
-/**
- * The manager for Dart specific analysis.
- */
-class DartWorkManager implements WorkManager {
-  /**
-   * The list of errors that are reported for raw Dart [Source]s.
-   */
-  static final List<ResultDescriptor<List<AnalysisError>>> _SOURCE_ERRORS =
-      <ResultDescriptor<List<AnalysisError>>>[
-    BUILD_DIRECTIVES_ERRORS,
-    BUILD_LIBRARY_ERRORS,
-    PARSE_ERRORS,
-    SCAN_ERRORS
-  ];
-
-  /**
-   * The list of errors that are reported for raw Dart [LibrarySpecificUnit]s.
-   */
-  static final List<ResultDescriptor<List<AnalysisError>>> _UNIT_ERRORS =
-      <ResultDescriptor<List<AnalysisError>>>[
-    HINTS,
-    LINTS,
-    LIBRARY_UNIT_ERRORS,
-    RESOLVE_DIRECTIVES_ERRORS,
-    RESOLVE_TYPE_NAMES_ERRORS,
-    RESOLVE_TYPE_BOUNDS_ERRORS,
-    RESOLVE_UNIT_ERRORS,
-    STRONG_MODE_ERRORS,
-    VARIABLE_REFERENCE_ERRORS,
-    VERIFY_ERRORS
-  ];
-
-  final InternalAnalysisContext context;
-
-  /**
-   * The [TargetedResult]s that should be computed with priority.
-   */
-  final LinkedHashSet<TargetedResult> priorityResultQueue =
-      new LinkedHashSet<TargetedResult>();
-
-  /**
-   * The sources whose kind we don't know yet.
-   */
-  final LinkedHashSet<Source> unknownSourceQueue = new LinkedHashSet<Source>();
-
-  /**
-   * The queue of library sources to process.
-   */
-  final LinkedHashSet<Source> librarySourceQueue = new LinkedHashSet<Source>();
-
-  /**
-   * A table mapping library sources to the part sources they include.
-   */
-  final HashMap<Source, List<Source>> libraryPartsMap =
-      new HashMap<Source, List<Source>>();
-
-  /**
-   * A table mapping part sources to the library sources that include them.
-   */
-  final HashMap<Source, List<Source>> partLibrariesMap =
-      new HashMap<Source, List<Source>>();
-
-  /**
-   * Initialize a newly created manager.
-   */
-  DartWorkManager(this.context) {
-    context.onResultInvalidated.listen((InvalidatedResult event) {
-      if (event.descriptor == LIBRARY_ERRORS_READY) {
-        CacheEntry entry = event.entry;
-        if (entry.explicitlyAdded &&
-            entry.getValue(SOURCE_KIND) == SourceKind.LIBRARY) {
-          librarySourceQueue.add(entry.target);
-        }
-      }
-    });
-  }
-
-  /**
-   * Returns the correctly typed result of `context.analysisCache`.
-   */
-  AnalysisCache get analysisCache => context.analysisCache;
-
-  /**
-   * The partition that contains analysis results that are not shared with other
-   * contexts.
-   */
-  CachePartition get privateAnalysisCachePartition =>
-      context.privateAnalysisCachePartition;
-
-  /**
-   * Specifies that the client want the given [result] of the given [target]
-   * to be computed with priority.
-   */
-  void addPriorityResult(AnalysisTarget target, ResultDescriptor result) {
-    priorityResultQueue.add(new TargetedResult(target, result));
-  }
-
-  @override
-  void applyChange(List<Source> addedSources, List<Source> changedSources,
-      List<Source> removedSources) {
-    addedSources = addedSources.where(_isDartSource).toList();
-    changedSources = changedSources
-        .where(_isDartSource)
-        .where((source) => _needsComputing(source, SOURCE_KIND))
-        .toList();
-    removedSources = removedSources.where(_isDartSource).toList();
-    // unknown queue
-    unknownSourceQueue.addAll(addedSources);
-    unknownSourceQueue.addAll(changedSources);
-    unknownSourceQueue.removeAll(removedSources);
-    // library queue
-    librarySourceQueue.removeAll(changedSources);
-    librarySourceQueue.removeAll(removedSources);
-    // parts in libraries
-    for (Source changedSource in changedSources) {
-      _onLibrarySourceChangedOrRemoved(changedSource);
-    }
-    for (Source removedSource in removedSources) {
-      partLibrariesMap.remove(removedSource);
-      _onLibrarySourceChangedOrRemoved(removedSource);
-    }
-  }
-
-  @override
-  void applyPriorityTargets(List<AnalysisTarget> targets) {
-    // Unschedule the old targets.
-    List<TargetedResult> resultsToUnschedule = <TargetedResult>[];
-    for (TargetedResult result in priorityResultQueue) {
-      if (result.result == LIBRARY_ERRORS_READY) {
-        resultsToUnschedule.add(result);
-      }
-    }
-    priorityResultQueue.removeAll(resultsToUnschedule);
-    // Schedule new targets.
-    for (AnalysisTarget target in targets) {
-      if (_isDartSource(target)) {
-        SourceKind sourceKind = analysisCache.getValue(target, SOURCE_KIND);
-        if (sourceKind == SourceKind.UNKNOWN) {
-          addPriorityResult(target, SOURCE_KIND);
-        } else if (sourceKind == SourceKind.LIBRARY) {
-          _schedulePriorityLibrarySourceAnalysis(target);
-        } else if (sourceKind == SourceKind.PART) {
-          List<Source> libraries = context.getLibrariesContaining(target);
-          for (Source library in libraries) {
-            addPriorityResult(library, LIBRARY_ERRORS_READY);
-          }
-        }
-      }
-    }
-  }
-
-  @override
-  List<AnalysisError> getErrors(Source source) {
-    if (!_isDartSource(source)) {
-      return AnalysisError.NO_ERRORS;
-    }
-    // If analysis is finished, use all the errors.
-    if (analysisCache.getState(source, DART_ERRORS) == CacheState.VALID) {
-      return analysisCache.getValue(source, DART_ERRORS);
-    }
-    // If analysis is in progress, combine all known partial results.
-    List<AnalysisError> errors = <AnalysisError>[];
-    for (ResultDescriptor<List<AnalysisError>> descriptor in _SOURCE_ERRORS) {
-      errors.addAll(analysisCache.getValue(source, descriptor));
-    }
-    for (Source library in context.getLibrariesContaining(source)) {
-      LibrarySpecificUnit unit = new LibrarySpecificUnit(library, source);
-      for (ResultDescriptor<List<AnalysisError>> descriptor in _UNIT_ERRORS) {
-        errors.addAll(analysisCache.getValue(unit, descriptor));
-      }
-    }
-    return errors;
-  }
-
-  /**
-   * Returns libraries containing the given [part].
-   * Maybe empty, but not null.
-   */
-  List<Source> getLibrariesContainingPart(Source part) {
-    if (part.isInSystemLibrary) {
-      DartWorkManager sdkDartWorkManager = _getSdkDartWorkManager();
-      if (sdkDartWorkManager != this) {
-        return sdkDartWorkManager.getLibrariesContainingPart(part);
-      }
-    }
-    List<Source> libraries = partLibrariesMap[part];
-    libraries ??= _getLibrariesContainingPartFromResultProvider(part);
-    return libraries?.toList() ?? const <Source>[];
-  }
-
-  @override
-  TargetedResult getNextResult() {
-    // Try to find a priority result to compute.
-    while (priorityResultQueue.isNotEmpty) {
-      TargetedResult result = priorityResultQueue.first;
-      if (!_needsComputing(result.target, result.result)) {
-        priorityResultQueue.remove(result);
-        continue;
-      }
-      return result;
-    }
-    // Try to find a new library to analyze.
-    while (librarySourceQueue.isNotEmpty) {
-      Source librarySource = librarySourceQueue.first;
-      // Maybe done with this library.
-      if (!_needsComputing(librarySource, LIBRARY_ERRORS_READY)) {
-        librarySourceQueue.remove(librarySource);
-        continue;
-      }
-      // Analyze this library.
-      return new TargetedResult(librarySource, LIBRARY_ERRORS_READY);
-    }
-    // No libraries in the queue, check whether there are sources to organize.
-    while (unknownSourceQueue.isNotEmpty) {
-      Source source = unknownSourceQueue.first;
-      // Maybe done with this source.
-      if (!_needsComputing(source, SOURCE_KIND)) {
-        unknownSourceQueue.remove(source);
-        continue;
-      }
-      // Compute the kind of this source.
-      return new TargetedResult(source, SOURCE_KIND);
-    }
-    // TODO(scheglov) Report errors for parts that remained in the queue after
-    // all libraries had been processed.
-    // No results to compute.
-    return null;
-  }
-
-  @override
-  WorkOrderPriority getNextResultPriority() {
-    if (priorityResultQueue.isNotEmpty) {
-      return WorkOrderPriority.PRIORITY;
-    }
-    if (unknownSourceQueue.isNotEmpty || librarySourceQueue.isNotEmpty) {
-      return WorkOrderPriority.NORMAL;
-    }
-    return WorkOrderPriority.NONE;
-  }
-
-  /**
-   * Notifies the manager about analysis options changes.
-   */
-  void onAnalysisOptionsChanged() {
-    _invalidateAllLocalResolutionInformation(false);
-  }
-
-  /**
-   * Notifies the manager about [SourceFactory] changes.
-   */
-  void onSourceFactoryChanged() {
-    _invalidateAllLocalResolutionInformation(true);
-  }
-
-  @override
-  void resultsComputed(
-      AnalysisTarget target, Map<ResultDescriptor, dynamic> outputs) {
-    bool isDartSource = _isDartSource(target);
-    // Route SDK outputs to the SDK WorkManager.
-    if (isDartSource && target.source.isInSystemLibrary) {
-      DartWorkManager sdkWorkManager = _getSdkDartWorkManager();
-      if (sdkWorkManager != this) {
-        sdkWorkManager.resultsComputed(target, outputs);
-        return;
-      }
-    }
-    // Organize sources.
-    bool isDartLibrarySource = false;
-    if (isDartSource) {
-      Source source = target;
-      SourceKind kind = outputs[SOURCE_KIND];
-      if (kind != null) {
-        unknownSourceQueue.remove(source);
-        if (kind == SourceKind.LIBRARY) {
-          isDartLibrarySource = true;
-          if (context.prioritySources.contains(source)) {
-            _schedulePriorityLibrarySourceAnalysis(source);
-          } else {
-            bool needErrors = _shouldErrorsBeComputed(source);
-            if (needErrors) {
-              librarySourceQueue.add(target);
-            }
-          }
-        }
-      }
-    }
-    // Update parts in libraries.
-    if (isDartLibrarySource) {
-      Source library = target;
-      List<Source> includedParts = outputs[INCLUDED_PARTS] as List<Source>;
-      if (includedParts != null) {
-        libraryPartsMap[library] = includedParts;
-        for (Source part in includedParts) {
-          List<Source> libraries =
-              partLibrariesMap.putIfAbsent(part, () => <Source>[]);
-          if (!libraries.contains(library)) {
-            libraries.add(library);
-            _invalidateContainingLibraries(part);
-          }
-        }
-      }
-    }
-    // Update notice.
-    if (isDartSource) {
-      bool shouldSetErrors = false;
-      outputs.forEach((ResultDescriptor descriptor, value) {
-        if (descriptor == PARSED_UNIT && value != null) {
-          context.getNotice(target).parsedDartUnit = value;
-          shouldSetErrors = true;
-        }
-        if (descriptor == DART_ERRORS) {
-          shouldSetErrors = true;
-        }
-      });
-      if (shouldSetErrors) {
-        AnalysisErrorInfo info = context.getErrors(target);
-        context.getNotice(target).setErrors(info.errors, info.lineInfo);
-      }
-    }
-    if (target is LibrarySpecificUnit) {
-      Source source = target.source;
-      bool shouldSetErrors = false;
-      outputs.forEach((ResultDescriptor descriptor, value) {
-        if (descriptor == RESOLVED_UNIT && value != null) {
-          context.getNotice(source).resolvedDartUnit = value;
-          shouldSetErrors = true;
-        }
-      });
-      if (shouldSetErrors) {
-        AnalysisErrorInfo info = context.getErrors(source);
-        context.getNotice(source).setErrors(info.errors, info.lineInfo);
-      }
-    }
-  }
-
-  /**
-   * The given unit was incrementally resolved. Some of its error results might
-   * have been invalidated, so we schedule it for computing errors.
-   */
-  void unitIncrementallyResolved(Source librarySource, Source unitSource) {
-    librarySourceQueue.add(librarySource);
-  }
-
-  /**
-   * Ask the [context]'s result provider for [CONTAINING_LIBRARIES].
-   * Return the list of containing libraries, or `null` if unknown.
-   */
-  List<Source> _getLibrariesContainingPartFromResultProvider(Source part) {
-    CacheEntry cacheEntry = context.getCacheEntry(part);
-    bool knows = context.aboutToComputeResult(cacheEntry, CONTAINING_LIBRARIES);
-    if (knows) {
-      return cacheEntry.getValue(CONTAINING_LIBRARIES);
-    }
-    return null;
-  }
-
-  /**
-   * Return the SDK [DartWorkManager] or this one.
-   */
-  DartWorkManager _getSdkDartWorkManager() {
-    SourceFactory sourceFactory = context.sourceFactory;
-    InternalAnalysisContext sdkContext = sourceFactory.dartSdk.context;
-    if (sdkContext != context) {
-      for (WorkManager workManager in sdkContext.workManagers) {
-        if (workManager is DartWorkManager) {
-          return workManager;
-        }
-      }
-    }
-    return this;
-  }
-
-  /**
-   * Invalidate all of the resolution results computed by this context. The flag
-   * [invalidateUris] should be `true` if the cached results of converting URIs
-   * to source files should also be invalidated.
-   */
-  void _invalidateAllLocalResolutionInformation(bool invalidateUris) {
-    CachePartition partition = privateAnalysisCachePartition;
-    // Prepare targets and values to invalidate.
-    List<Source> dartSources = <Source>[];
-    List<LibrarySpecificUnit> unitTargets = <LibrarySpecificUnit>[];
-    MapIterator<AnalysisTarget, CacheEntry> iterator = partition.iterator();
-    while (iterator.moveNext()) {
-      AnalysisTarget target = iterator.key;
-      // Optionally gather Dart sources to invalidate URIs resolution.
-      if (invalidateUris && _isDartSource(target)) {
-        dartSources.add(target);
-      }
-      // LibrarySpecificUnit(s) are roots of Dart resolution.
-      // When one is invalidated, invalidation is propagated to all resolution.
-      if (target is LibrarySpecificUnit) {
-        unitTargets.add(target);
-        Source library = target.library;
-        if (context.exists(library)) {
-          CacheEntry entry = iterator.value;
-          if (entry.explicitlyAdded) {
-            librarySourceQueue.add(library);
-          }
-        }
-      }
-    }
-    // Invalidate targets and values.
-    unitTargets.forEach(partition.remove);
-    for (Source dartSource in dartSources) {
-      CacheEntry entry = partition.get(dartSource);
-      if (entry != null) {
-        // TODO(scheglov) we invalidate too much.
-        // Would be nice to invalidate just URLs resolution.
-        entry.setState(PARSED_UNIT, CacheState.INVALID);
-        entry.setState(IMPORTED_LIBRARIES, CacheState.INVALID);
-        entry.setState(EXPLICITLY_IMPORTED_LIBRARIES, CacheState.INVALID);
-        entry.setState(EXPORTED_LIBRARIES, CacheState.INVALID);
-        entry.setState(INCLUDED_PARTS, CacheState.INVALID);
-        entry.setState(LIBRARY_SPECIFIC_UNITS, CacheState.INVALID);
-        entry.setState(UNITS, CacheState.INVALID);
-      }
-    }
-  }
-
-  /**
-   * Invalidate  [CONTAINING_LIBRARIES] for the given [source].
-   * [CONTAINING_LIBRARIES] does not have dependencies, so we manage it here.
-   * The [source] may be a part, or a library whose contents is updated so
-   * will be a part.
-   */
-  void _invalidateContainingLibraries(Source source) {
-    CacheEntry entry = analysisCache.get(source);
-    if (entry != null) {
-      entry.setState(CONTAINING_LIBRARIES, CacheState.INVALID);
-    }
-  }
-
-  /**
-   * Returns `true` if the given [result] of the given [target] needs
-   * computing, i.e. it is not in the valid and not in the error state.
-   */
-  bool _needsComputing(AnalysisTarget target, ResultDescriptor result) {
-    CacheState state = analysisCache.getState(target, result);
-    return state != CacheState.VALID && state != CacheState.ERROR;
-  }
-
-  /**
-   * The given [library] source was changed or removed.
-   * Update [libraryPartsMap] and [partLibrariesMap].
-   */
-  void _onLibrarySourceChangedOrRemoved(Source library) {
-    List<Source> parts = libraryPartsMap.remove(library);
-    if (parts != null) {
-      for (Source part in parts) {
-        List<Source> libraries = partLibrariesMap[part];
-        if (libraries != null) {
-          libraries.remove(library);
-          _invalidateContainingLibraries(part);
-        }
-      }
-    }
-    _invalidateContainingLibraries(library);
-  }
-
-  /**
-   * Schedule computing [RESOLVED_UNIT] for the given [librarySource].
-   * If errors should be computed, then schedule [LIBRARY_ERRORS_READY] instead,
-   * it also computes [RESOLVED_UNIT] in process.
-   */
-  void _schedulePriorityLibrarySourceAnalysis(Source librarySource) {
-    bool needErrors = _shouldErrorsBeComputed(librarySource);
-    if (needErrors) {
-      addPriorityResult(librarySource, LIBRARY_ERRORS_READY);
-    } else {
-      var target = new LibrarySpecificUnit(librarySource, librarySource);
-      addPriorityResult(target, RESOLVED_UNIT);
-    }
-  }
-
-  bool _shouldErrorsBeComputed(Source source) =>
-      context.shouldErrorsBeAnalyzed(source);
-
-  static bool _isDartSource(AnalysisTarget target) {
-    return target is Source && AnalysisEngine.isDartFileName(target.fullName);
-  }
-}
diff --git a/analyzer/lib/src/task/driver.dart b/analyzer/lib/src/task/driver.dart
index c7f12e2..843041d 100644
--- a/analyzer/lib/src/task/driver.dart
+++ b/analyzer/lib/src/task/driver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/task/general.dart b/analyzer/lib/src/task/general.dart
index 446f14a..5fcb776 100644
--- a/analyzer/lib/src/task/general.dart
+++ b/analyzer/lib/src/task/general.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/task/inputs.dart b/analyzer/lib/src/task/inputs.dart
index d490238..30fd244 100644
--- a/analyzer/lib/src/task/inputs.dart
+++ b/analyzer/lib/src/task/inputs.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/task/manager.dart b/analyzer/lib/src/task/manager.dart
index 40778cb..009afaf 100644
--- a/analyzer/lib/src/task/manager.dart
+++ b/analyzer/lib/src/task/manager.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/task/model.dart b/analyzer/lib/src/task/model.dart
index a84a960..ec62312 100644
--- a/analyzer/lib/src/task/model.dart
+++ b/analyzer/lib/src/task/model.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/task/options.dart b/analyzer/lib/src/task/options.dart
index b195c6c..9bc342b 100644
--- a/analyzer/lib/src/task/options.dart
+++ b/analyzer/lib/src/task/options.dart
@@ -19,22 +19,93 @@
 import 'package:analyzer/src/lint/options_rule_validator.dart';
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:analyzer/src/plugin/options.dart';
-import 'package:analyzer/src/task/api/general.dart';
-import 'package:analyzer/src/task/api/model.dart';
-import 'package:analyzer/src/task/general.dart';
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:source_span/source_span.dart';
 import 'package:yaml/yaml.dart';
 
-/// The errors produced while parsing an analysis options file.
-///
-/// The list will be empty if there were no errors, but will not be `null`.
-final ListResultDescriptor<AnalysisError> ANALYSIS_OPTIONS_ERRORS =
-    new ListResultDescriptor<AnalysisError>(
-        'ANALYSIS_OPTIONS_ERRORS', AnalysisError.NO_ERRORS);
-
 final _OptionsProcessor _processor = new _OptionsProcessor();
 
+List<AnalysisError> analyzeAnalysisOptions(
+    Source source, String content, SourceFactory sourceFactory) {
+  List<AnalysisError> errors = <AnalysisError>[];
+  Source initialSource = source;
+  SourceSpan initialIncludeSpan;
+  AnalysisOptionsProvider optionsProvider =
+      new AnalysisOptionsProvider(sourceFactory);
+
+  // Validate the specified options and any included option files
+  void validate(Source source, YamlMap options) {
+    List<AnalysisError> validationErrors =
+        new OptionsFileValidator(source).validate(options);
+    if (initialIncludeSpan != null && validationErrors.isNotEmpty) {
+      for (AnalysisError error in validationErrors) {
+        var args = [
+          source.fullName,
+          error.offset.toString(),
+          (error.offset + error.length - 1).toString(),
+          error.message,
+        ];
+        errors.add(new AnalysisError(
+            initialSource,
+            initialIncludeSpan.start.column + 1,
+            initialIncludeSpan.length,
+            AnalysisOptionsWarningCode.INCLUDED_FILE_WARNING,
+            args));
+      }
+    } else {
+      errors.addAll(validationErrors);
+    }
+
+    YamlNode node = getValue(options, AnalyzerOptions.include);
+    if (node == null) {
+      return;
+    }
+    SourceSpan span = node.span;
+    initialIncludeSpan ??= span;
+    String includeUri = span.text;
+    Source includedSource = sourceFactory.resolveUri(source, includeUri);
+    if (includedSource == null || !includedSource.exists()) {
+      errors.add(new AnalysisError(
+          initialSource,
+          initialIncludeSpan.start.column + 1,
+          initialIncludeSpan.length,
+          AnalysisOptionsWarningCode.INCLUDE_FILE_NOT_FOUND,
+          [includeUri, source.fullName]));
+      return;
+    }
+    try {
+      YamlMap options =
+          optionsProvider.getOptionsFromString(includedSource.contents.data);
+      validate(includedSource, options);
+    } on OptionsFormatException catch (e) {
+      var args = [
+        includedSource.fullName,
+        e.span.start.offset.toString(),
+        e.span.end.offset.toString(),
+        e.message,
+      ];
+      // Report errors for included option files
+      // on the include directive located in the initial options file.
+      errors.add(new AnalysisError(
+          initialSource,
+          initialIncludeSpan.start.column + 1,
+          initialIncludeSpan.length,
+          AnalysisOptionsErrorCode.INCLUDED_FILE_PARSE_ERROR,
+          args));
+    }
+  }
+
+  try {
+    YamlMap options = optionsProvider.getOptionsFromString(content);
+    validate(source, options);
+  } on OptionsFormatException catch (e) {
+    SourceSpan span = e.span;
+    errors.add(new AnalysisError(source, span.start.column + 1, span.length,
+        AnalysisOptionsErrorCode.PARSE_ERROR, [e.message]));
+  }
+  return errors;
+}
+
 void applyToAnalysisOptions(AnalysisOptionsImpl options, YamlMap optionMap) {
   _processor.applyToAnalysisOptions(options, optionMap);
 }
@@ -50,9 +121,13 @@
   static const String exclude = 'exclude';
   static const String include = 'include';
   static const String language = 'language';
+  static const String optionalChecks = 'optional-checks';
   static const String plugins = 'plugins';
   static const String strong_mode = 'strong-mode';
 
+  // Optional checks options.
+  static const String chromeOsManifestChecks = 'chrome-os-manifest-checks';
+
   // Strong mode options (see AnalysisOptionsImpl for documentation).
   static const String declarationCasts = 'declaration-casts';
   static const String implicitCasts = 'implicit-casts';
@@ -81,6 +156,7 @@
     errors,
     exclude,
     language,
+    optionalChecks,
     plugins,
     strong_mode,
   ];
@@ -97,6 +173,11 @@
     strictInference,
     strictRawTypes
   ];
+
+  // Supported 'analyzer' optional checks options.
+  static const List<String> optionalCecksOptions = const [
+    chromeOsManifestChecks,
+  ];
 }
 
 /// Validates `analyzer` options.
@@ -107,7 +188,8 @@
           new StrongModeOptionValueValidator(),
           new ErrorFilterOptionValidator(),
           new EnabledExperimentsValidator(),
-          new LanguageOptionValidator()
+          new LanguageOptionValidator(),
+          new OptionalChecksValueValidator()
         ]);
 }
 
@@ -273,153 +355,6 @@
   }
 }
 
-/// A task that generates errors for an analysis options file.
-class GenerateOptionsErrorsTask extends SourceBasedAnalysisTask {
-  /// The name of the input whose value is the content of the file.
-  static const String CONTENT_INPUT_NAME = 'CONTENT_INPUT_NAME';
-
-  /// The task descriptor describing this kind of task.
-  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
-      'GenerateOptionsErrorsTask',
-      createTask,
-      buildInputs,
-      <ResultDescriptor>[ANALYSIS_OPTIONS_ERRORS, LINE_INFO],
-      suitabilityFor: suitabilityFor);
-
-  AnalysisOptionsProvider optionsProvider;
-
-  GenerateOptionsErrorsTask(AnalysisContext context, AnalysisTarget target)
-      : super(context, target) {
-    optionsProvider = new AnalysisOptionsProvider(context?.sourceFactory);
-  }
-
-  @override
-  TaskDescriptor get descriptor => DESCRIPTOR;
-
-  Source get source => target.source;
-
-  @override
-  void internalPerform() {
-    String content = getRequiredInput(CONTENT_INPUT_NAME);
-    //
-    // Record outputs.
-    //
-    outputs[ANALYSIS_OPTIONS_ERRORS] =
-        analyzeAnalysisOptions(source, content, context?.sourceFactory);
-    outputs[LINE_INFO] = computeLineInfo(content);
-  }
-
-  static List<AnalysisError> analyzeAnalysisOptions(
-      Source source, String content, SourceFactory sourceFactory) {
-    List<AnalysisError> errors = <AnalysisError>[];
-    Source initialSource = source;
-    SourceSpan initialIncludeSpan;
-    AnalysisOptionsProvider optionsProvider =
-        new AnalysisOptionsProvider(sourceFactory);
-
-    // Validate the specified options and any included option files
-    void validate(Source source, YamlMap options) {
-      List<AnalysisError> validationErrors =
-          new OptionsFileValidator(source).validate(options);
-      if (initialIncludeSpan != null && validationErrors.isNotEmpty) {
-        for (AnalysisError error in validationErrors) {
-          var args = [
-            source.fullName,
-            error.offset.toString(),
-            (error.offset + error.length - 1).toString(),
-            error.message,
-          ];
-          errors.add(new AnalysisError(
-              initialSource,
-              initialIncludeSpan.start.column + 1,
-              initialIncludeSpan.length,
-              AnalysisOptionsWarningCode.INCLUDED_FILE_WARNING,
-              args));
-        }
-      } else {
-        errors.addAll(validationErrors);
-      }
-
-      YamlNode node = getValue(options, AnalyzerOptions.include);
-      if (node == null) {
-        return;
-      }
-      SourceSpan span = node.span;
-      initialIncludeSpan ??= span;
-      String includeUri = span.text;
-      Source includedSource = sourceFactory.resolveUri(source, includeUri);
-      if (includedSource == null || !includedSource.exists()) {
-        errors.add(new AnalysisError(
-            initialSource,
-            initialIncludeSpan.start.column + 1,
-            initialIncludeSpan.length,
-            AnalysisOptionsWarningCode.INCLUDE_FILE_NOT_FOUND,
-            [includeUri, source.fullName]));
-        return;
-      }
-      try {
-        YamlMap options =
-            optionsProvider.getOptionsFromString(includedSource.contents.data);
-        validate(includedSource, options);
-      } on OptionsFormatException catch (e) {
-        var args = [
-          includedSource.fullName,
-          e.span.start.offset.toString(),
-          e.span.end.offset.toString(),
-          e.message,
-        ];
-        // Report errors for included option files
-        // on the include directive located in the initial options file.
-        errors.add(new AnalysisError(
-            initialSource,
-            initialIncludeSpan.start.column + 1,
-            initialIncludeSpan.length,
-            AnalysisOptionsErrorCode.INCLUDED_FILE_PARSE_ERROR,
-            args));
-      }
-    }
-
-    try {
-      YamlMap options = optionsProvider.getOptionsFromString(content);
-      validate(source, options);
-    } on OptionsFormatException catch (e) {
-      SourceSpan span = e.span;
-      errors.add(new AnalysisError(source, span.start.column + 1, span.length,
-          AnalysisOptionsErrorCode.PARSE_ERROR, [e.message]));
-    }
-    return errors;
-  }
-
-  /// Return a map from the names of the inputs of this kind of task to the
-  /// task input descriptors describing those inputs for a task with the
-  /// given [target].
-  static Map<String, TaskInput> buildInputs(AnalysisTarget source) =>
-      <String, TaskInput>{CONTENT_INPUT_NAME: CONTENT.of(source)};
-
-  /// Compute [LineInfo] for the given [content].
-  static LineInfo computeLineInfo(String content) {
-    List<int> lineStarts = StringUtilities.computeLineStarts(content);
-    return new LineInfo(lineStarts);
-  }
-
-  /// Create a task based on the given [target] in the given [context].
-  static GenerateOptionsErrorsTask createTask(
-          AnalysisContext context, AnalysisTarget target) =>
-      new GenerateOptionsErrorsTask(context, target);
-
-  /**
-   * Return an indication of how suitable this task is for the given [target].
-   */
-  static TaskSuitability suitabilityFor(AnalysisTarget target) {
-    if (target is Source &&
-        (target.shortName == AnalysisEngine.ANALYSIS_OPTIONS_FILE ||
-            target.shortName == AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE)) {
-      return TaskSuitability.HIGHEST;
-    }
-    return TaskSuitability.NONE;
-  }
-}
-
 /// Validates `analyzer` language configuration options.
 class LanguageOptionValidator extends OptionsValidator {
   ErrorBuilder builder = new ErrorBuilder(AnalyzerOptions.languageOptions);
@@ -560,6 +495,43 @@
   }
 }
 
+/// Validates `analyzer` optional-checks value configuration options.
+class OptionalChecksValueValidator extends OptionsValidator {
+  ErrorBuilder builder = new ErrorBuilder(AnalyzerOptions.optionalCecksOptions);
+  ErrorBuilder trueOrFalseBuilder = new TrueOrFalseValueErrorBuilder();
+
+  @override
+  void validate(ErrorReporter reporter, YamlMap options) {
+    var analyzer = getValue(options, AnalyzerOptions.analyzer);
+    if (analyzer is YamlMap) {
+      var v = getValue(analyzer, AnalyzerOptions.optionalChecks);
+      if (v is YamlScalar) {
+        var value = toLowerCase(v.value);
+        if (value != AnalyzerOptions.chromeOsManifestChecks) {
+          builder.reportError(
+              reporter, AnalyzerOptions.chromeOsManifestChecks, v);
+        }
+      } else if (v is YamlMap) {
+        v.nodes.forEach((k, v) {
+          String key, value;
+          if (k is YamlScalar) {
+            key = k.value?.toString();
+            if (key != AnalyzerOptions.chromeOsManifestChecks) {
+              builder.reportError(
+                  reporter, AnalyzerOptions.chromeOsManifestChecks, k);
+            } else {
+              value = toLowerCase(v.value);
+              if (!AnalyzerOptions.trueOrFalse.contains(value)) {
+                trueOrFalseBuilder.reportError(reporter, key, v);
+              }
+            }
+          }
+        });
+      }
+    }
+  }
+}
+
 /// Validates `analyzer` top-level options.
 class TopLevelAnalyzerOptionsValidator extends TopLevelOptionValidator {
   TopLevelAnalyzerOptionsValidator()
@@ -648,6 +620,10 @@
         options.enabledExperiments = enabledExperiments;
       }
 
+      // Process optional checks options.
+      var optionalChecks = getValue(analyzer, AnalyzerOptions.optionalChecks);
+      _applyOptionalChecks(options, optionalChecks);
+
       // Process language options.
       var language = getValue(analyzer, AnalyzerOptions.language);
       _applyLanguageOptions(options, language);
@@ -751,6 +727,31 @@
     }
   }
 
+  void _applyOptionalChecksOption(
+      AnalysisOptionsImpl options, String feature, Object value) {
+    bool boolValue = toBool(value);
+    if (boolValue != null) {
+      if (feature == AnalyzerOptions.chromeOsManifestChecks) {
+        options.chromeOsManifestChecks = boolValue;
+      }
+    }
+  }
+
+  void _applyOptionalChecks(AnalysisOptionsImpl options, YamlNode config) {
+    if (config is YamlMap) {
+      config.nodes.forEach((k, v) {
+        if (k is YamlScalar && v is YamlScalar) {
+          _applyOptionalChecksOption(options, k.value?.toString(), v.value);
+        }
+      });
+    }
+    if (config is YamlScalar) {
+      if (config.value?.toString() == AnalyzerOptions.chromeOsManifestChecks) {
+        options.chromeOsManifestChecks = true;
+      }
+    }
+  }
+
   String _toString(YamlNode node) {
     if (node is YamlScalar) {
       var value = node.value;
diff --git a/analyzer/lib/src/task/options_work_manager.dart b/analyzer/lib/src/task/options_work_manager.dart
deleted file mode 100644
index fab4ebe..0000000
--- a/analyzer/lib/src/task/options_work_manager.dart
+++ /dev/null
@@ -1,167 +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.
-
-import 'dart:collection';
-
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/context/cache.dart';
-import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisEngine, AnalysisErrorInfo, CacheState, InternalAnalysisContext;
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/task/api/model.dart';
-import 'package:analyzer/src/task/options.dart';
-
-/// The manager for analysis options specific analysis.
-class OptionsWorkManager implements WorkManager {
-  /// The context for which work is being managed.
-  final InternalAnalysisContext context;
-
-  /// The options file sources.
-  final LinkedHashSet<Source> sourceQueue = new LinkedHashSet<Source>();
-
-  /// The [TargetedResult]s that should be computed with priority.
-  final LinkedHashSet<TargetedResult> priorityResultQueue =
-      new LinkedHashSet<TargetedResult>();
-
-  /// Initialize a newly created manager.
-  OptionsWorkManager(this.context) {
-    analysisCache.onResultInvalidated.listen(onResultInvalidated);
-  }
-
-  /// Returns the correctly typed result of `context.analysisCache`.
-  AnalysisCache get analysisCache => context.analysisCache;
-
-  /// Specifies that the client wants the given [result] of the given [target]
-  /// to be computed with priority.
-  void addPriorityResult(AnalysisTarget target, ResultDescriptor result) {
-    priorityResultQueue.add(new TargetedResult(target, result));
-  }
-
-  @override
-  void applyChange(List<Source> addedSources, List<Source> changedSources,
-      List<Source> removedSources) {
-    addedSources = addedSources.where(_isOptionsSource).toList();
-    changedSources = changedSources.where(_isOptionsSource).toList();
-    removedSources = removedSources.where(_isOptionsSource).toList();
-    // source queue
-    sourceQueue.addAll(addedSources);
-    sourceQueue.addAll(changedSources);
-    sourceQueue.removeAll(removedSources);
-  }
-
-  @override
-  void applyPriorityTargets(List<AnalysisTarget> targets) {
-    // Unschedule the old targets.
-    List<TargetedResult> resultsToUnschedule = <TargetedResult>[];
-    for (TargetedResult result in priorityResultQueue) {
-      if (result.result == ANALYSIS_OPTIONS_ERRORS) {
-        resultsToUnschedule.add(result);
-      }
-    }
-    priorityResultQueue.removeAll(resultsToUnschedule);
-    // Schedule new targets.
-    for (AnalysisTarget target in targets) {
-      if (_isOptionsSource(target)) {
-        addPriorityResult(target, ANALYSIS_OPTIONS_ERRORS);
-      }
-    }
-  }
-
-  @override
-  List<AnalysisError> getErrors(Source source) {
-    if (!_isOptionsSource(source)) {
-      return AnalysisError.NO_ERRORS;
-    }
-    // If analysis is finished, use all the errors.
-    if (analysisCache.getState(source, ANALYSIS_OPTIONS_ERRORS) ==
-        CacheState.VALID) {
-      return analysisCache.getValue(source, ANALYSIS_OPTIONS_ERRORS);
-    }
-    // No partial results.
-    return AnalysisError.NO_ERRORS;
-  }
-
-  @override
-  TargetedResult getNextResult() {
-    // Try to find a priority result to compute.
-    while (priorityResultQueue.isNotEmpty) {
-      TargetedResult result = priorityResultQueue.first;
-      if (!_needsComputing(result.target, result.result)) {
-        priorityResultQueue.remove(result);
-        continue;
-      }
-      return result;
-    }
-    // Try to find a new options file to analyze.
-    while (sourceQueue.isNotEmpty) {
-      Source optionsSource = sourceQueue.first;
-      if (!_needsComputing(optionsSource, ANALYSIS_OPTIONS_ERRORS)) {
-        sourceQueue.remove(optionsSource);
-        continue;
-      }
-      return new TargetedResult(optionsSource, ANALYSIS_OPTIONS_ERRORS);
-    }
-    // No results to compute.
-    return null;
-  }
-
-  @override
-  WorkOrderPriority getNextResultPriority() {
-    if (priorityResultQueue.isNotEmpty) {
-      return WorkOrderPriority.PRIORITY;
-    }
-    if (sourceQueue.isNotEmpty) {
-      return WorkOrderPriority.NORMAL;
-    }
-    return WorkOrderPriority.NONE;
-  }
-
-  @override
-  void onAnalysisOptionsChanged() {
-    // Do nothing.
-  }
-
-  /// Notifies the manager that a result has been invalidated.
-  void onResultInvalidated(InvalidatedResult event) {
-    ResultDescriptor descriptor = event.descriptor;
-    if (descriptor == ANALYSIS_OPTIONS_ERRORS) {
-      sourceQueue.add(event.entry.target);
-    }
-  }
-
-  @override
-  void onSourceFactoryChanged() {
-    // Do nothing.
-  }
-
-  @override
-  void resultsComputed(
-      AnalysisTarget target, Map<ResultDescriptor, dynamic> outputs) {
-    // Update notice.
-    if (_isOptionsSource(target)) {
-      bool shouldSetErrors = false;
-      outputs.forEach((ResultDescriptor descriptor, value) {
-        if (descriptor == ANALYSIS_OPTIONS_ERRORS) {
-          shouldSetErrors = true;
-        }
-      });
-      if (shouldSetErrors) {
-        AnalysisErrorInfo info = context.getErrors(target);
-        context.getNotice(target).setErrors(info.errors, info.lineInfo);
-      }
-    }
-  }
-
-  /// Returns `true` if the given [result] of the given [target] needs
-  /// computing, i.e. it is not in the valid and not in the error state.
-  bool _needsComputing(AnalysisTarget target, ResultDescriptor result) {
-    CacheState state = analysisCache.getState(target, result);
-    return state != CacheState.VALID && state != CacheState.ERROR;
-  }
-
-  /// Return `true` if the given target is an analysis options source.
-  static bool _isOptionsSource(AnalysisTarget target) =>
-      target is Source &&
-      AnalysisEngine.isAnalysisOptionsFileName(target.fullName);
-}
diff --git a/analyzer/lib/src/task/strong/ast_properties.dart b/analyzer/lib/src/task/strong/ast_properties.dart
index d2fea4e..d2891ad 100644
--- a/analyzer/lib/src/task/strong/ast_properties.dart
+++ b/analyzer/lib/src/task/strong/ast_properties.dart
@@ -15,6 +15,9 @@
 const String _hasImplicitCasts = '_hasImplicitCasts';
 const String _implicitCast = '_implicitCast';
 const String _implicitOperationCast = '_implicitAssignmentCast';
+const String _implicitSpreadCast = '_implicitSpreadCast';
+const String _implicitSpreadKeyCast = '_implicitSpreadKeyCast';
+const String _implicitSpreadValueCast = '_implicitSpreadValueCast';
 const String _isDynamicInvoke = '_isDynamicInvoke';
 const String _superclassCovariantParameters = '_superclassCovariantParameters';
 
@@ -48,6 +51,24 @@
   return node.getProperty<DartType>(_implicitOperationCast);
 }
 
+/// If this expression is passed into a spread and the items in the spread need
+/// an implicit cast, return the type the items are coerced to.
+DartType getImplicitSpreadCast(Expression node) {
+  return node.getProperty<DartType>(_implicitSpreadCast);
+}
+
+/// If this expression is a map passed into a spread and the keys in the spread
+/// need an implicit cast, return the type the keys are coerced to.
+DartType getImplicitSpreadKeyCast(Expression node) {
+  return node.getProperty<DartType>(_implicitSpreadKeyCast);
+}
+
+/// If this expression is a map passed into a spread and the values in the
+/// spread need an implicit cast, return the type the values are coerced to.
+DartType getImplicitSpreadValueCast(Expression node) {
+  return node.getProperty<DartType>(_implicitSpreadValueCast);
+}
+
 /// Returns a list of parameters and method type parameters from mixins and
 /// superclasses of this class that need a stub method to check their type at
 /// runtime for soundness.
@@ -94,6 +115,21 @@
   node.setProperty(_implicitOperationCast, type);
 }
 
+/// Sets the result of [getImplicitSpreadCast] for this node.
+void setImplicitSpreadCast(Expression node, DartType type) {
+  node.setProperty(_implicitSpreadCast, type);
+}
+
+/// Sets the result of [getImplicitSpreadKeyCast] for this node.
+void setImplicitSpreadKeyCast(Expression node, DartType type) {
+  node.setProperty(_implicitSpreadKeyCast, type);
+}
+
+/// Sets the result of [getImplicitSpreadValueCast] for this node.
+void setImplicitSpreadValueCast(Expression node, DartType type) {
+  node.setProperty(_implicitSpreadValueCast, type);
+}
+
 /// Sets [isDynamicInvoke] property for this expression.
 void setIsDynamicInvoke(Expression node, bool value) {
   node.setProperty(_isDynamicInvoke, value == true ? true : null);
diff --git a/analyzer/lib/src/task/strong/checker.dart b/analyzer/lib/src/task/strong/checker.dart
index feb81ad..0708ecf 100644
--- a/analyzer/lib/src/task/strong/checker.dart
+++ b/analyzer/lib/src/task/strong/checker.dart
@@ -18,6 +18,7 @@
 import 'package:analyzer/source/error_processor.dart' show ErrorProcessor;
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart' show StrongModeCode;
@@ -102,6 +103,9 @@
     return null;
   }
 
+  // TODO(jmesserly): I'm not sure this method will still return the correct
+  // type. This code may need to use InheritanceManager2.getMember instead,
+  // similar to the fix in _checkImplicitCovarianceCast.
   var name = member.name;
   var baseMember = member is PropertyAccessorElement
       ? (member.isGetter ? type.getGetter(name) : type.getSetter(name))
@@ -114,6 +118,7 @@
 class CodeChecker extends RecursiveAstVisitor {
   final Dart2TypeSystem rules;
   final TypeProvider typeProvider;
+  final InheritanceManager2 inheritance;
   final AnalysisErrorListener reporter;
   final AnalysisOptionsImpl _options;
   _OverrideChecker _overrideChecker;
@@ -123,7 +128,7 @@
   HashSet<ExecutableElement> _covariantPrivateMembers;
 
   CodeChecker(TypeProvider typeProvider, Dart2TypeSystem rules,
-      AnalysisErrorListener reporter, this._options)
+      this.inheritance, AnalysisErrorListener reporter, this._options)
       : typeProvider = typeProvider,
         rules = rules,
         reporter = reporter {
@@ -169,14 +174,28 @@
     if (element is ForElement) {
       checkCollectionElement(element.body, expectedType);
     } else if (element is IfElement) {
+      checkBoolean(element.condition);
       checkCollectionElement(element.thenElement, expectedType);
       checkCollectionElement(element.elseElement, expectedType);
     } else if (element is Expression) {
       checkAssignment(element, expectedType);
     } else if (element is SpreadElement) {
-      DartType iterableType =
-          typeProvider.iterableType.instantiate([expectedType]);
-      checkAssignment(element.expression, iterableType);
+      // Spread expression may be dynamic in which case it's implicitly downcast
+      // to Iterable<dynamic>
+      DartType expressionCastType =
+          typeProvider.iterableType.instantiate([DynamicTypeImpl.instance]);
+      checkAssignment(element.expression, expressionCastType);
+
+      var exprType = element.expression.staticType;
+      var asIterableType = exprType is InterfaceTypeImpl
+          ? exprType.asInstanceOf(typeProvider.iterableType.element)
+          : null;
+      var elementType =
+          asIterableType == null ? null : asIterableType.typeArguments[0];
+      // Items in the spread will then potentially be downcast to the expected
+      // type.
+      _checkImplicitCast(element.expression, expectedType,
+          from: elementType, forSpread: true);
     }
   }
 
@@ -193,15 +212,34 @@
     if (element is ForElement) {
       checkMapElement(element.body, expectedKeyType, expectedValueType);
     } else if (element is IfElement) {
+      checkBoolean(element.condition);
       checkMapElement(element.thenElement, expectedKeyType, expectedValueType);
       checkMapElement(element.elseElement, expectedKeyType, expectedValueType);
     } else if (element is MapLiteralEntry) {
       checkAssignment(element.key, expectedKeyType);
       checkAssignment(element.value, expectedValueType);
     } else if (element is SpreadElement) {
-      DartType mapType = typeProvider.mapType
-          .instantiate([expectedKeyType, expectedValueType]);
-      checkAssignment(element.expression, mapType);
+      // Spread expression may be dynamic in which case it's implicitly downcast
+      // to Map<dynamic, dynamic>
+      DartType expressionCastType = typeProvider.mapType
+          .instantiate([DynamicTypeImpl.instance, DynamicTypeImpl.instance]);
+      checkAssignment(element.expression, expressionCastType);
+
+      var exprType = element.expression.staticType;
+      var asMapType = exprType is InterfaceTypeImpl
+          ? exprType.asInstanceOf(typeProvider.mapType.element)
+          : null;
+
+      var elementKeyType =
+          asMapType == null ? null : asMapType.typeArguments[0];
+      var elementValueType =
+          asMapType == null ? null : asMapType.typeArguments[1];
+      // Keys and values in the spread will then potentially be downcast to
+      // the expected types.
+      _checkImplicitCast(element.expression, expectedKeyType,
+          from: elementKeyType, forSpreadKey: true);
+      _checkImplicitCast(element.expression, expectedValueType,
+          from: elementValueType, forSpreadValue: true);
     }
   }
 
@@ -469,7 +507,7 @@
         }
       }
     }
-    NodeList<CollectionElement> elements = node.elements2;
+    NodeList<CollectionElement> elements = node.elements;
     for (int i = 0; i < elements.length; i++) {
       checkCollectionElement(elements[i], type);
     }
@@ -583,7 +621,7 @@
           }
         }
       }
-      NodeList<CollectionElement> elements = node.elements2;
+      NodeList<CollectionElement> elements = node.elements;
       for (int i = 0; i < elements.length; i++) {
         checkMapElement(elements[i], keyType, valueType);
       }
@@ -603,7 +641,7 @@
           }
         }
       }
-      NodeList<CollectionElement> elements = node.elements2;
+      NodeList<CollectionElement> elements = node.elements;
       for (int i = 0; i < elements.length; i++) {
         checkCollectionElement(elements[i], type);
       }
@@ -651,7 +689,6 @@
   @override
   void visitVariableDeclarationList(VariableDeclarationList node) {
     TypeAnnotation type = node.type;
-
     if (type != null) {
       for (VariableDeclaration variable in node.variables) {
         var initializer = variable.initializer;
@@ -776,11 +813,20 @@
   /// If [expr] does not require an implicit cast because it is not related to
   /// [to] or is already a subtype of it, does nothing.
   void _checkImplicitCast(Expression expr, DartType to,
-      {DartType from, bool opAssign: false}) {
+      {DartType from,
+      bool opAssign: false,
+      bool forSpread: false,
+      bool forSpreadKey: false,
+      bool forSpreadValue: false}) {
     from ??= _getExpressionType(expr);
 
     if (_needsImplicitCast(expr, to, from: from) == true) {
-      _recordImplicitCast(expr, to, from: from, opAssign: opAssign);
+      _recordImplicitCast(expr, to,
+          from: from,
+          opAssign: opAssign,
+          forSpread: forSpread,
+          forSpreadKey: forSpreadKey,
+          forSpreadValue: forSpreadValue);
     }
   }
 
@@ -824,7 +870,10 @@
         _isInstanceMember(element) &&
         targetType is InterfaceType &&
         targetType.typeArguments.isNotEmpty &&
-        !_targetHasKnownGenericTypeArguments(target)) {
+        !_targetHasKnownGenericTypeArguments(target) &&
+        // Make sure we don't overwrite an existing implicit cast based on
+        // the context type. It will be more precise and will ensure soundness.
+        getImplicitCast(node) == null) {
       // Track private setters/method calls. We can sometimes eliminate the
       // parameter check in code generation, if it was never needed.
       // This member will need a check, however, because we are calling through
@@ -834,14 +883,18 @@
             .add(element is ExecutableMember ? element.baseElement : element);
       }
 
-      // Get the lower bound of the declared return type (e.g. `F<Null>`) and
+      // Get the lower bound of the declared return type (e.g. `F<bottom>`) and
       // see if it can be assigned to the expected type (e.g. `F<Object>`).
       //
       // That way we can tell if any lower `T` will work or not.
+
+      // The member may be from a superclass, so we need to ensure the type
+      // parameters are properly substituted.
       var classType = targetType.element.type;
       var classLowerBound = classType.instantiate(new List.filled(
-          classType.typeParameters.length, typeProvider.nullType));
-      var memberLowerBound = _lookUpMember(classLowerBound, element).type;
+          classType.typeParameters.length, typeProvider.bottomType));
+      var memberLowerBound = inheritance.getMember(
+          classLowerBound, Name(element.librarySource.uri, element.name));
       var expectedType = invokeType.returnType;
 
       if (!rules.isSubtypeOf(memberLowerBound.returnType, expectedType)) {
@@ -982,6 +1035,17 @@
   DartType _getExpressionType(Expression expr) =>
       getExpressionType(expr, rules, typeProvider);
 
+  DartType _getInstanceTypeArgument(
+      DartType expressionType, ClassElement instanceType) {
+    if (expressionType is InterfaceTypeImpl) {
+      var asInstanceType = expressionType.asInstanceOf(instanceType);
+      if (asInstanceType != null) {
+        return asInstanceType.typeArguments[0];
+      }
+    }
+    return null;
+  }
+
   /// Given an expression, return its type assuming it is
   /// in the caller position of a call (that is, accounting
   /// for the possibility of a call method).  Returns null
@@ -1007,19 +1071,19 @@
       (e is MethodElement ||
           e is PropertyAccessorElement && e.variable is FieldElement);
 
-  ExecutableElement _lookUpMember(InterfaceType type, ExecutableElement e) {
-    var name = e.name;
-    var library = e.library;
-    return e is PropertyAccessorElement
-        ? (e.isGetter
-            ? type.lookUpInheritedGetter(name, library: library)
-            : type.lookUpInheritedSetter(name, library: library))
-        : type.lookUpInheritedMethod(name, library: library);
-  }
-
-  void _markImplicitCast(Expression expr, DartType to, {bool opAssign: false}) {
+  void _markImplicitCast(Expression expr, DartType to,
+      {bool opAssign: false,
+      bool forSpread: false,
+      bool forSpreadKey: false,
+      bool forSpreadValue: false}) {
     if (opAssign) {
       setImplicitOperationCast(expr, to);
+    } else if (forSpread) {
+      setImplicitSpreadCast(expr, to);
+    } else if (forSpreadKey) {
+      setImplicitSpreadKeyCast(expr, to);
+    } else if (forSpreadValue) {
+      setImplicitSpreadValueCast(expr, to);
     } else {
       setImplicitCast(expr, to);
     }
@@ -1082,66 +1146,80 @@
   /// This will emit the appropriate error/warning/hint message as well as mark
   /// the AST node.
   void _recordImplicitCast(Expression expr, DartType to,
-      {DartType from, bool opAssign: false}) {
+      {DartType from,
+      bool opAssign: false,
+      forSpread: false,
+      forSpreadKey: false,
+      forSpreadValue: false}) {
     // If this is an implicit tearoff, we need to mark the cast, but we don't
     // want to warn if it's a legal subtype.
     if (from is InterfaceType && rules.acceptsFunctionType(to)) {
       var type = rules.getCallMethodType(from);
       if (type != null && rules.isSubtypeOf(type, to)) {
-        _markImplicitCast(expr, to, opAssign: opAssign);
+        _markImplicitCast(expr, to,
+            opAssign: opAssign,
+            forSpread: forSpread,
+            forSpreadKey: forSpreadKey,
+            forSpreadValue: forSpreadValue);
         return;
       }
     }
 
-    // Inference "casts":
-    if (expr is Literal) {
-      // fromT should be an exact type - this will almost certainly fail at
-      // runtime.
-      if (expr is ListLiteral) {
-        _recordMessage(
-            expr, StrongModeCode.INVALID_CAST_LITERAL_LIST, [from, to]);
-      } else if (expr is SetOrMapLiteral) {
-        if (expr.isMap) {
-          _recordMessage(
-              expr, StrongModeCode.INVALID_CAST_LITERAL_MAP, [from, to]);
-        } else {
-          // Ambiguity should be resolved by now
-          assert(expr.isSet);
-          _recordMessage(
-              expr, StrongModeCode.INVALID_CAST_LITERAL_SET, [from, to]);
-        }
-      } else {
-        _recordMessage(
-            expr, StrongModeCode.INVALID_CAST_LITERAL, [expr, from, to]);
-      }
-      return;
-    }
+    if (!forSpread && !forSpreadKey && !forSpreadValue) {
+      // Spreads are special in that they may create downcasts at runtime but
+      // those casts are implied so we don't treat them as strictly.
 
-    if (expr is FunctionExpression) {
-      _recordMessage(
-          expr, StrongModeCode.INVALID_CAST_FUNCTION_EXPR, [from, to]);
-      return;
-    }
-
-    if (expr is InstanceCreationExpression) {
-      ConstructorElement e = expr.staticElement;
-      if (e == null || !e.isFactory) {
+      // Inference "casts":
+      if (expr is Literal) {
         // fromT should be an exact type - this will almost certainly fail at
         // runtime.
-        _recordMessage(expr, StrongModeCode.INVALID_CAST_NEW_EXPR, [from, to]);
+        if (expr is ListLiteral) {
+          _recordMessage(
+              expr, StrongModeCode.INVALID_CAST_LITERAL_LIST, [from, to]);
+        } else if (expr is SetOrMapLiteral) {
+          if (expr.isMap) {
+            _recordMessage(
+                expr, StrongModeCode.INVALID_CAST_LITERAL_MAP, [from, to]);
+          } else {
+            // Ambiguity should be resolved by now
+            assert(expr.isSet);
+            _recordMessage(
+                expr, StrongModeCode.INVALID_CAST_LITERAL_SET, [from, to]);
+          }
+        } else {
+          _recordMessage(
+              expr, StrongModeCode.INVALID_CAST_LITERAL, [expr, from, to]);
+        }
         return;
       }
-    }
 
-    Element e = _getKnownElement(expr);
-    if (e is FunctionElement || e is MethodElement && e.isStatic) {
-      _recordMessage(
-          expr,
-          e is MethodElement
-              ? StrongModeCode.INVALID_CAST_METHOD
-              : StrongModeCode.INVALID_CAST_FUNCTION,
-          [e.name, from, to]);
-      return;
+      if (expr is FunctionExpression) {
+        _recordMessage(
+            expr, StrongModeCode.INVALID_CAST_FUNCTION_EXPR, [from, to]);
+        return;
+      }
+
+      if (expr is InstanceCreationExpression) {
+        ConstructorElement e = expr.staticElement;
+        if (e == null || !e.isFactory) {
+          // fromT should be an exact type - this will almost certainly fail at
+          // runtime.
+          _recordMessage(
+              expr, StrongModeCode.INVALID_CAST_NEW_EXPR, [from, to]);
+          return;
+        }
+      }
+
+      Element e = _getKnownElement(expr);
+      if (e is FunctionElement || e is MethodElement && e.isStatic) {
+        _recordMessage(
+            expr,
+            e is MethodElement
+                ? StrongModeCode.INVALID_CAST_METHOD
+                : StrongModeCode.INVALID_CAST_FUNCTION,
+            [e.name, from, to]);
+        return;
+      }
     }
 
     // Composite cast: these are more likely to fail.
@@ -1175,7 +1253,11 @@
           : StrongModeCode.DOWN_CAST_IMPLICIT;
     }
     _recordMessage(expr, errorCode, [from, to]);
-    _markImplicitCast(expr, to, opAssign: opAssign);
+    _markImplicitCast(expr, to,
+        opAssign: opAssign,
+        forSpread: forSpread,
+        forSpreadKey: forSpreadKey,
+        forSpreadValue: forSpreadValue);
   }
 
   void _recordMessage(AstNode node, ErrorCode errorCode, List arguments) {
@@ -1257,7 +1339,7 @@
     }
     Token awaitKeyword;
     AstNode parent = node.parent;
-    if (parent is ForStatement2) {
+    if (parent is ForStatement) {
       awaitKeyword = parent.awaitKeyword;
     } else if (parent is ForElement) {
       awaitKeyword = parent.awaitKeyword;
@@ -1271,7 +1353,7 @@
         : typeProvider.iterableType;
     var iterableType = _getExpressionType(node.iterable);
     var elementType =
-        rules.mostSpecificTypeArgument(iterableType, sequenceInterface);
+        _getInstanceTypeArgument(iterableType, sequenceInterface.element);
 
     // If the sequence is not an Iterable (or Stream for await for) but is a
     // supertype of it, do an implicit downcast to Iterable<dynamic>. Then
diff --git a/analyzer/lib/src/task/strong_mode.dart b/analyzer/lib/src/task/strong_mode.dart
index fdbc6d4..ed2c5c3 100644
--- a/analyzer/lib/src/task/strong_mode.dart
+++ b/analyzer/lib/src/task/strong_mode.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -16,6 +16,7 @@
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/link.dart'
     show FieldElementForLink_ClassField, ParameterElementForLink;
+import 'package:analyzer/src/summary2/lazy_ast.dart';
 
 /**
  * Sets the type of the field. The types in implicit accessors are updated
@@ -156,6 +157,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
@@ -168,7 +170,14 @@
           parameterType = type;
         }
       } else if (parameterType != type) {
-        if (parameter is ParameterElementForLink) {
+        if (parameter is ParameterElementImpl && parameter.linkedNode != null) {
+          LazyAst.setTypeInferenceError(
+            parameter.linkedNode,
+            TopLevelInferenceErrorBuilder(
+              kind: TopLevelInferenceErrorKind.overrideConflictParameterType,
+            ),
+          );
+        } else if (parameter is ParameterElementForLink) {
           parameter.setInferenceError(new TopLevelInferenceErrorBuilder(
               kind: TopLevelInferenceErrorKind.overrideConflictParameterType));
         }
@@ -410,7 +419,14 @@
     _FieldOverrideInferenceResult typeResult =
         _computeFieldOverrideType(field.getter);
     if (typeResult.isError) {
-      if (field is FieldElementForLink_ClassField) {
+      if (field is FieldElementImpl && field.linkedNode != null) {
+        LazyAst.setTypeInferenceError(
+          field.linkedNode,
+          TopLevelInferenceErrorBuilder(
+            kind: TopLevelInferenceErrorKind.overrideConflictFieldType,
+          ),
+        );
+      } else if (field is FieldElementForLink_ClassField) {
         field.setInferenceError(new TopLevelInferenceErrorBuilder(
             kind: TopLevelInferenceErrorKind.overrideConflictFieldType));
       }
@@ -419,8 +435,12 @@
 
     if (field.hasImplicitType) {
       DartType newType = typeResult.type;
-      if (newType == null && field.initializer != null) {
-        newType = field.initializer.returnType;
+
+      if (newType == null) {
+        var initializer = field.initializer;
+        if (initializer != null) {
+          newType = initializer.returnType;
+        }
       }
 
       if (newType == null || newType.isBottom || newType.isDartCoreNull) {
diff --git a/analyzer/lib/src/task/yaml.dart b/analyzer/lib/src/task/yaml.dart
index 431cf30..56ea51c 100644
--- a/analyzer/lib/src/task/yaml.dart
+++ b/analyzer/lib/src/task/yaml.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/test_utilities/find_element.dart b/analyzer/lib/src/test_utilities/find_element.dart
index 86b3e1f..f8ff22c 100644
--- a/analyzer/lib/src/test_utilities/find_element.dart
+++ b/analyzer/lib/src/test_utilities/find_element.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/test_utilities/find_node.dart b/analyzer/lib/src/test_utilities/find_node.dart
index 90dc42a..ced02d0 100644
--- a/analyzer/lib/src/test_utilities/find_node.dart
+++ b/analyzer/lib/src/test_utilities/find_node.dart
@@ -91,8 +91,8 @@
     return _node(search, (n) => n is FieldFormalParameter);
   }
 
-  ForStatement2 forStatement2(String search) {
-    return _node(search, (n) => n is ForStatement2);
+  ForStatement forStatement(String search) {
+    return _node(search, (n) => n is ForStatement);
   }
 
   FunctionBody functionBody(String search) {
@@ -151,6 +151,10 @@
     return _node(search, (n) => n is MixinDeclaration);
   }
 
+  NamedExpression namedExpression(String search) {
+    return _node(search, (n) => n is NamedExpression);
+  }
+
   ParenthesizedExpression parenthesized(String search) {
     return _node(search, (n) => n is ParenthesizedExpression);
   }
@@ -252,6 +256,10 @@
     return _node(search, (n) => n is VariableDeclaration);
   }
 
+  VariableDeclarationList variableDeclarationList(String search) {
+    return _node(search, (n) => n is VariableDeclarationList);
+  }
+
   WhileStatement whileStatement(String search) {
     return _node(search, (n) => n is WhileStatement);
   }
diff --git a/analyzer/lib/src/test_utilities/function_ast_visitor.dart b/analyzer/lib/src/test_utilities/function_ast_visitor.dart
index f3c951b..df7a2f1 100644
--- a/analyzer/lib/src/test_utilities/function_ast_visitor.dart
+++ b/analyzer/lib/src/test_utilities/function_ast_visitor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/test_utilities/mock_sdk.dart b/analyzer/lib/src/test_utilities/mock_sdk.dart
index f9828f5..917fc1c 100644
--- a/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -143,9 +143,12 @@
 
 void print(Object object) {}
 
-class bool extends Object {
+abstract class bool extends Object {
   external const factory bool.fromEnvironment(String name,
       {bool defaultValue: false});
+  bool operator &(bool other);
+  bool operator |(bool other);
+  bool operator ^(bool other);
 }
 
 abstract class Comparable<T> {
@@ -337,6 +340,7 @@
   external factory String.fromCharCodes(Iterable<int> charCodes,
       [int start = 0, int end]);
   List<int> get codeUnits;
+  int indexOf(Pattern pattern, [int start]);
   bool get isEmpty => false;
   bool get isNotEmpty => false;
   int get length => 0;
diff --git a/analyzer/lib/src/test_utilities/package_mixin.dart b/analyzer/lib/src/test_utilities/package_mixin.dart
index 9ad69d8..9fe449e 100644
--- a/analyzer/lib/src/test_utilities/package_mixin.dart
+++ b/analyzer/lib/src/test_utilities/package_mixin.dart
@@ -22,6 +22,7 @@
 const Immutable immutable = const Immutable();
 const _Literal literal = const _Literal();
 const _MustCallSuper mustCallSuper = const _MustCallSuper();
+const _OptionalTypeArgs optionalTypeArgs = const _OptionalTypeArgs();
 const _Protected protected = const _Protected();
 const Required required = const Required();
 const _Sealed sealed = const _Sealed();
@@ -43,6 +44,9 @@
 class _MustCallSuper {
   const _MustCallSuper();
 }
+class _OptionalTypeArgs {
+  const _OptionalTypeArgs();
+}
 class _Protected {
   const _Protected();
 }
diff --git a/analyzer/lib/src/test_utilities/resource_provider_mixin.dart b/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
index 8f20457..6c0072b 100644
--- a/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
+++ b/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/util/sdk.dart b/analyzer/lib/src/util/sdk.dart
index b89f3d7..abffd58 100644
--- a/analyzer/lib/src/util/sdk.dart
+++ b/analyzer/lib/src/util/sdk.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/lib/src/util/uri.dart b/analyzer/lib/src/util/uri.dart
index 91bbdb2..963dafc 100644
--- a/analyzer/lib/src/util/uri.dart
+++ b/analyzer/lib/src/util/uri.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/util/yaml.dart b/analyzer/lib/src/util/yaml.dart
index 1950bdd..4485072 100644
--- a/analyzer/lib/src/util/yaml.dart
+++ b/analyzer/lib/src/util/yaml.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/lib/src/workspace/basic.dart b/analyzer/lib/src/workspace/basic.dart
index 0b177f0..59ff9e1 100644
--- a/analyzer/lib/src/workspace/basic.dart
+++ b/analyzer/lib/src/workspace/basic.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/workspace/simple.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:package_config/packages.dart';
@@ -68,10 +69,13 @@
   BasicWorkspacePackage(this.root, this.workspace);
 
   @override
-  bool contains(String path) {
+  bool contains(Source source) {
+    // When dealing with a BasicWorkspace, [source] will always have a valid
+    // fullName.
+    String filePath = source.fullName;
     // There is a 1-1 relationship between [BasicWorkspace]s and
     // [BasicWorkspacePackage]s. If a file is in a package's workspace, then it
     // is in the package as well.
-    return workspace.provider.pathContext.isWithin(root, path);
+    return workspace.provider.pathContext.isWithin(root, filePath);
   }
 }
diff --git a/analyzer/lib/src/workspace/bazel.dart b/analyzer/lib/src/workspace/bazel.dart
index 5e90c71..d66c851 100644
--- a/analyzer/lib/src/workspace/bazel.dart
+++ b/analyzer/lib/src/workspace/bazel.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -97,34 +97,8 @@
 
   @override
   Uri restoreAbsolute(Source source) {
-    path.Context context = _workspace.provider.pathContext;
     String filePath = source.fullName;
 
-    Uri restore(String root, String filePath) {
-      if (root != null && context.isWithin(root, filePath)) {
-        String relative = context.relative(filePath, from: root);
-        List<String> components = context.split(relative);
-        if (components.length > 4 &&
-            components[0] == 'third_party' &&
-            components[1] == 'dart' &&
-            components[3] == 'lib') {
-          String packageName = components[2];
-          String pathInLib = components.skip(4).join('/');
-          return Uri.parse('package:$packageName/$pathInLib');
-        } else {
-          for (int i = 2; i < components.length - 1; i++) {
-            String component = components[i];
-            if (component == 'lib') {
-              String packageName = components.getRange(0, i).join('.');
-              String pathInLib = components.skip(i + 1).join('/');
-              return Uri.parse('package:$packageName/$pathInLib');
-            }
-          }
-        }
-      }
-      return null;
-    }
-
     // Search in each root.
     for (String root in [
       _workspace.bin,
@@ -132,14 +106,43 @@
       _workspace.readonly,
       _workspace.root
     ]) {
-      Uri uri = restore(root, filePath);
-      if (uri != null) {
-        return uri;
+      List<String> uriParts = _restoreUriParts(root, filePath);
+      if (uriParts != null) {
+        return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
       }
     }
 
     return null;
   }
+
+  /// Restore [filePath] to its 'package:' URI parts.
+  ///
+  /// Returns `null` if [root] is null or if [filePath] is not within [root].
+  List<String> _restoreUriParts(String root, String filePath) {
+    path.Context context = _workspace.provider.pathContext;
+    if (root != null && context.isWithin(root, filePath)) {
+      String relative = context.relative(filePath, from: root);
+      List<String> components = context.split(relative);
+      if (components.length > 4 &&
+          components[0] == 'third_party' &&
+          components[1] == 'dart' &&
+          components[3] == 'lib') {
+        String packageName = components[2];
+        String pathInLib = components.skip(4).join('/');
+        return [packageName, pathInLib];
+      } else {
+        for (int i = 2; i < components.length - 1; i++) {
+          String component = components[i];
+          if (component == 'lib') {
+            String packageName = components.getRange(0, i).join('.');
+            String pathInLib = components.skip(i + 1).join('/');
+            return [packageName, pathInLib];
+          }
+        }
+      }
+    }
+    return null;
+  }
 }
 
 /**
@@ -276,7 +279,13 @@
 
       if (folder.getChildAssumingFile(_buildFileName).exists) {
         // Found the BUILD file, denoting a Dart package.
-        return BazelWorkspacePackage(folder.path, this);
+        List<String> uriParts = (packageUriResolver as BazelPackageUriResolver)
+            ._restoreUriParts(root, '${folder.path}/lib/__fake__.dart');
+        if (uriParts == null || uriParts.isEmpty) {
+          return BazelWorkspacePackage(null, folder.path, this);
+        } else {
+          return BazelWorkspacePackage(uriParts[0], folder.path, this);
+        }
       }
 
       // Go up a folder.
@@ -299,6 +308,10 @@
    * corresponding readonly workspace root.
    */
   static BazelWorkspace find(ResourceProvider provider, String filePath) {
+    Resource resource = provider.getResource(filePath);
+    if (resource is File && resource.parent != null) {
+      filePath = resource.parent.path;
+    }
     path.Context context = provider.pathContext;
     Folder folder = provider.getFolder(filePath);
     while (true) {
@@ -373,24 +386,33 @@
  * a given package in a BazelWorkspace.
  */
 class BazelWorkspacePackage extends WorkspacePackage {
+  /// A prefix for any URI of a path in this package.
+  final String _uriPrefix;
+
   final String root;
 
   final BazelWorkspace workspace;
 
-  BazelWorkspacePackage(this.root, this.workspace);
+  BazelWorkspacePackage(String packageName, this.root, this.workspace)
+      : this._uriPrefix = 'package:$packageName/';
 
   @override
-  bool contains(String path) {
-    if (workspace.findFile(path) == null) {
+  bool contains(Source source) {
+    if (source.uri.isScheme('package')) {
+      return source.uri.toString().startsWith(_uriPrefix);
+    }
+    String filePath = source.fullName;
+    if (filePath == null) return false;
+    if (workspace.findFile(filePath) == null) {
       return false;
     }
-    if (!workspace.provider.pathContext.isWithin(root, path)) {
+    if (!workspace.provider.pathContext.isWithin(root, filePath)) {
       return false;
     }
 
-    // Just because [path] is within [root] does not mean it is in this
+    // Just because [filePath] is within [root] does not mean it is in this
     // package; it could be in a "subpackage." Must go through the work of
-    // learning exactly which package [path] is contained in.
-    return workspace.findPackageFor(path).root == root;
+    // learning exactly which package [filePath] is contained in.
+    return workspace.findPackageFor(filePath).root == root;
   }
 }
diff --git a/analyzer/lib/src/workspace/gn.dart b/analyzer/lib/src/workspace/gn.dart
index 191c421..7244b90 100644
--- a/analyzer/lib/src/workspace/gn.dart
+++ b/analyzer/lib/src/workspace/gn.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -267,15 +267,14 @@
    * that file cannot be found, looks for standard output directory locations.
    */
   static Folder _getOutDirectory(String root, ResourceProvider provider) {
+    const String fuchsiaDirConfigFile = '.fx-build-dir';
+
     path.Context pathContext = provider.pathContext;
-    File config = provider.getFile(pathContext.join(root, '.config'));
-    if (config.exists) {
-      String content = config.readAsStringSync();
-      Match match =
-          new RegExp(r'^FUCHSIA_BUILD_DIR=["\x27](.+)["\x27]$', multiLine: true)
-              .firstMatch(content);
-      if (match != null) {
-        String buildDirPath = match.group(1);
+    File configFile =
+        provider.getFile(pathContext.join(root, fuchsiaDirConfigFile));
+    if (configFile.exists) {
+      String buildDirPath = configFile.readAsStringSync().trim();
+      if (buildDirPath.isNotEmpty) {
         if (pathContext.isRelative(buildDirPath)) {
           buildDirPath = pathContext.join(root, buildDirPath);
         }
@@ -314,17 +313,19 @@
   GnWorkspacePackage(this.root, this.workspace);
 
   @override
-  bool contains(String path) {
-    if (workspace.findFile(path) == null) {
+  bool contains(Source source) {
+    String filePath = filePathFromSource(source);
+    if (filePath == null) return false;
+    if (workspace.findFile(filePath) == null) {
       return false;
     }
-    if (!workspace.provider.pathContext.isWithin(root, path)) {
+    if (!workspace.provider.pathContext.isWithin(root, filePath)) {
       return false;
     }
 
-    // Just because [path] is within [root] does not mean it is in this
+    // Just because [filePath] is within [root] does not mean it is in this
     // package; it could be in a "subpackage." Must go through the work of
-    // learning exactly which package [path] is contained in.
-    return workspace.findPackageFor(path).root == root;
+    // learning exactly which package [filePath] is contained in.
+    return workspace.findPackageFor(filePath).root == root;
   }
 }
diff --git a/analyzer/lib/src/workspace/package_build.dart b/analyzer/lib/src/workspace/package_build.dart
index c5c7467..7e5bcbd 100644
--- a/analyzer/lib/src/workspace/package_build.dart
+++ b/analyzer/lib/src/workspace/package_build.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -106,19 +106,27 @@
     String filePath = source.fullName;
 
     if (_context.isWithin(_workspace.root, filePath)) {
-      String relative = _context.relative(filePath, from: _workspace.root);
-      List<String> components = _context.split(relative);
-      if (components.length > 4 &&
-          components[0] == 'build' &&
-          components[1] == 'generated' &&
-          components[3] == 'lib') {
-        String packageName = components[2];
-        String pathInLib = components.skip(4).join('/');
-        return Uri.parse('package:$packageName/$pathInLib');
+      List<String> uriParts = _restoreUriParts(filePath);
+      if (uriParts != null) {
+        return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
       }
     }
     return source.uri;
   }
+
+  List<String> _restoreUriParts(String filePath) {
+    String relative = _context.relative(filePath, from: _workspace.root);
+    List<String> components = _context.split(relative);
+    if (components.length > 4 &&
+        components[0] == 'build' &&
+        components[1] == 'generated' &&
+        components[3] == 'lib') {
+      String packageName = components[2];
+      String pathInLib = components.skip(4).join('/');
+      return [packageName, pathInLib];
+    }
+    return null;
+  }
 }
 
 /**
@@ -279,7 +287,15 @@
   WorkspacePackage findPackageFor(String filePath) {
     final Folder folder = provider.getFolder(filePath);
     if (provider.pathContext.isWithin(root, folder.path)) {
-      _theOnlyPackage ??= new PackageBuildWorkspacePackage(root, this);
+      List<String> uriParts =
+          (packageUriResolver as PackageBuildPackageUriResolver)
+              ._restoreUriParts('${folder.path}/lib/__fake__.dart');
+      if (uriParts == null || uriParts.isEmpty) {
+        _theOnlyPackage ??= new PackageBuildWorkspacePackage(null, root, this);
+      } else {
+        _theOnlyPackage ??=
+            new PackageBuildWorkspacePackage(uriParts[0], root, this);
+      }
       return _theOnlyPackage;
     } else {
       return null;
@@ -330,14 +346,23 @@
  * a given package in a PackageBuildWorkspace.
  */
 class PackageBuildWorkspacePackage extends WorkspacePackage {
+  /// A prefix for any URI of a path in this package.
+  final String _uriPrefix;
+
   final String root;
 
   final PackageBuildWorkspace workspace;
 
-  PackageBuildWorkspacePackage(this.root, this.workspace);
+  PackageBuildWorkspacePackage(String packageName, this.root, this.workspace)
+      : this._uriPrefix = 'package:$packageName/';
 
   @override
-  bool contains(String filePath) {
+  bool contains(Source source) {
+    if (source.uri.isScheme('package')) {
+      return source.uri.toString().startsWith(_uriPrefix);
+    }
+    String filePath = source.fullName;
+    if (filePath == null) return false;
     // There is a 1-1 relationship between PackageBuildWorkspaces and
     // PackageBuildWorkspacePackages. If a file is in a package's workspace,
     // then it is in the package as well.
diff --git a/analyzer/lib/src/workspace/pub.dart b/analyzer/lib/src/workspace/pub.dart
index 3cfbe59..65347eb 100644
--- a/analyzer/lib/src/workspace/pub.dart
+++ b/analyzer/lib/src/workspace/pub.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/workspace/simple.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:package_config/packages.dart';
@@ -71,10 +72,12 @@
   PubWorkspacePackage(this.root, this.workspace);
 
   @override
-  bool contains(String path) {
+  bool contains(Source source) {
+    String filePath = filePathFromSource(source);
+    if (filePath == null) return false;
     // There is a 1-1 relationship between [PubWorkspace]s and
     // [PubWorkspacePackage]s. If a file is in a package's workspace, then it
     // is in the package as well.
-    return workspace.provider.pathContext.isWithin(root, path);
+    return workspace.provider.pathContext.isWithin(root, filePath);
   }
 }
diff --git a/analyzer/lib/src/workspace/workspace.dart b/analyzer/lib/src/workspace/workspace.dart
index be58cdb..7b74cb5 100644
--- a/analyzer/lib/src/workspace/workspace.dart
+++ b/analyzer/lib/src/workspace/workspace.dart
@@ -62,5 +62,18 @@
 
   Workspace get workspace;
 
-  bool contains(String path);
+  bool contains(Source source);
+
+  /// Return a file path for the location of [source].
+  ///
+  /// If [source]'s URI scheme is package, it's fullName might be unusable (for
+  /// example, the case of a [InSummarySource]). In this case, use
+  /// [workspace]'s package URI resolver to fetch the file path.
+  String filePathFromSource(Source source) {
+    if (source.uri.scheme == 'package') {
+      return workspace.packageUriResolver.resolveAbsolute(source.uri)?.fullName;
+    } else {
+      return source.fullName;
+    }
+  }
 }
diff --git a/analyzer/lib/task/model.dart b/analyzer/lib/task/model.dart
index 1b33bf4..6768ca2 100644
--- a/analyzer/lib/task/model.dart
+++ b/analyzer/lib/task/model.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
diff --git a/analyzer/pubspec.yaml b/analyzer/pubspec.yaml
index 81048a3..1723adb 100644
--- a/analyzer/pubspec.yaml
+++ b/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.35.4
+version: 0.36.3
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
@@ -11,9 +11,10 @@
   collection: ^1.10.1
   convert: ^2.0.0
   crypto: '>=1.1.1 <3.0.0'
-  front_end: 0.1.14
+  front_end: 0.1.18
   glob: ^1.0.3
-  kernel: 0.3.14
+  html: '>=0.13.4+1 <0.15.0'
+  kernel: 0.3.18
   meta: ^1.0.2
   package_config: '>=0.1.5 <2.0.0'
   path: '>=0.9.0 <2.0.0'
diff --git a/analyzer/tool/analysis_driver/inspect_exception.dart b/analyzer/tool/analysis_driver/inspect_exception.dart
index 9813944..b15b904 100644
--- a/analyzer/tool/analysis_driver/inspect_exception.dart
+++ b/analyzer/tool/analysis_driver/inspect_exception.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/tool/summary/check_test.dart b/analyzer/tool/summary/check_test.dart
index ff689ba..af669fb 100644
--- a/analyzer/tool/summary/check_test.dart
+++ b/analyzer/tool/summary/check_test.dart
@@ -13,7 +13,10 @@
  * user to run generate.dart.
  */
 main() async {
-  String pkgPath = normalize(join(package_root.packageRoot, 'analyzer'));
-  await GeneratedContent.checkAll(
-      pkgPath, 'tool/summary/generate.dart', allTargets);
+  var idlFolderPath = normalize(
+      join(package_root.packageRoot, 'analyzer', 'lib', 'src', 'summary'));
+  var idlPath = normalize(join(idlFolderPath, 'idl.dart'));
+  await GeneratedContent.checkAll(idlFolderPath,
+      'pkg/analyzer/tool/summary/generate.dart', getAllTargets(idlPath),
+      args: [idlPath]);
 }
diff --git a/analyzer/tool/summary/dump_inferred_types.dart b/analyzer/tool/summary/dump_inferred_types.dart
index ffc71af..ee6bb64 100644
--- a/analyzer/tool/summary/dump_inferred_types.dart
+++ b/analyzer/tool/summary/dump_inferred_types.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -176,9 +176,9 @@
     } else {
       result = param.name;
     }
-    if (param.kind == UnlinkedParamKind.named) {
+    if (param.kind == UnlinkedParamKind.optionalNamed) {
       result = '{$result}';
-    } else if (param.kind == UnlinkedParamKind.positional) {
+    } else if (param.kind == UnlinkedParamKind.optionalPositional) {
       result = '[$result]';
     }
     return result;
diff --git a/analyzer/tool/summary/generate.dart b/analyzer/tool/summary/generate.dart
index f3426c1..798e369 100644
--- a/analyzer/tool/summary/generate.dart
+++ b/analyzer/tool/summary/generate.dart
@@ -2,56 +2,55 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * This file contains code to generate serialization/deserialization logic for
- * summaries based on an "IDL" description of the summary format (written in
- * stylized Dart).
- *
- * For each class in the "IDL" input, two corresponding classes are generated:
- * - A class with the same name which represents deserialized summary data in
- *   memory.  This class has read-only semantics.
- * - A "builder" class which can be used to generate serialized summary data.
- *   This class has write-only semantics.
- *
- * Each of the "builder" classes has a single `finish` method which writes
- * the entity being built into the given FlatBuffer and returns the `Offset`
- * reference to it.
- */
+/// This file contains code to generate serialization/deserialization logic for
+/// summaries based on an "IDL" description of the summary format (written in
+/// stylized Dart).
+///
+/// For each class in the "IDL" input, two corresponding classes are generated:
+/// - A class with the same name which represents deserialized summary data in
+///   memory.  This class has read-only semantics.
+/// - A "builder" class which can be used to generate serialized summary data.
+///   This class has write-only semantics.
+///
+/// Each of the "builder" classes has a single `finish` method which writes
+/// the entity being built into the given FlatBuffer and returns the `Offset`
+/// reference to it.
 import 'dart:convert';
 import 'dart:io';
 
 import 'package:analysis_tool/tools.dart';
 import 'package:front_end/src/fasta/scanner/string_scanner.dart';
 import 'package:front_end/src/scanner/token.dart' show Token;
-import 'package:front_end/src/testing/package_root.dart' as package_root;
-import 'package:path/path.dart';
 
 import 'idl_model.dart' as idlModel;
 import 'mini_ast.dart';
 
-main() async {
-  String pkgPath = normalize(join(package_root.packageRoot, 'analyzer'));
-  await GeneratedContent.generateAll(pkgPath, allTargets);
+main(List<String> args) async {
+  if (args.length != 1) {
+    print('Error: IDL path is required');
+    print('usage: dart generate.dart path/to/idl.dart');
+  }
+  String idlPath = args[0];
+  await GeneratedContent.generateAll(
+      File(idlPath).parent.path, getAllTargets(idlPath));
 }
 
-final List<GeneratedContent> allTargets = <GeneratedContent>[
-  formatTarget,
-  schemaTarget
-];
+List<GeneratedContent> getAllTargets(String idlPath) {
+  final GeneratedFile formatTarget =
+      new GeneratedFile('format.dart', (_) async {
+    _CodeGenerator codeGenerator = new _CodeGenerator(idlPath);
+    codeGenerator.generateFormatCode();
+    return codeGenerator._outBuffer.toString();
+  });
 
-final GeneratedFile formatTarget =
-    new GeneratedFile('lib/src/summary/format.dart', (String pkgPath) async {
-  _CodeGenerator codeGenerator = new _CodeGenerator(pkgPath);
-  codeGenerator.generateFormatCode();
-  return codeGenerator._outBuffer.toString();
-});
+  final GeneratedFile schemaTarget = new GeneratedFile('format.fbs', (_) async {
+    _CodeGenerator codeGenerator = new _CodeGenerator(idlPath);
+    codeGenerator.generateFlatBufferSchema();
+    return codeGenerator._outBuffer.toString();
+  });
 
-final GeneratedFile schemaTarget =
-    new GeneratedFile('lib/src/summary/format.fbs', (String pkgPath) async {
-  _CodeGenerator codeGenerator = new _CodeGenerator(pkgPath);
-  codeGenerator.generateFlatBufferSchema();
-  return codeGenerator._outBuffer.toString();
-});
+  return <GeneratedContent>[formatTarget, schemaTarget];
+}
 
 typedef String _StringToString(String s);
 
@@ -59,24 +58,17 @@
   static const String _throwDeprecated =
       "throw new UnimplementedError('attempt to access deprecated field')";
 
-  /**
-   * Buffer in which generated code is accumulated.
-   */
+  /// Buffer in which generated code is accumulated.
   final StringBuffer _outBuffer = new StringBuffer();
 
-  /**
-   * Current indentation level.
-   */
+  /// Current indentation level.
   String _indentation = '';
 
-  /**
-   * Semantic model of the "IDL" input file.
-   */
+  /// Semantic model of the "IDL" input file.
   idlModel.Idl _idl;
 
-  _CodeGenerator(String pkgPath) {
+  _CodeGenerator(String idlPath) {
     // Parse the input "IDL" file.
-    String idlPath = join(pkgPath, 'lib', 'src', 'summary', 'idl.dart');
     File idlFile = new File(idlPath);
     String idlText =
         idlFile.readAsStringSync().replaceAll(new RegExp('\r\n?'), '\n');
@@ -90,10 +82,8 @@
     checkIdl();
   }
 
-  /**
-   * Perform basic sanity checking of the IDL (over and above that done by
-   * [extractIdl]).
-   */
+  /// Perform basic sanity checking of the IDL (over and above that done by
+  /// [extractIdl]).
   void checkIdl() {
     _idl.classes.forEach((String name, idlModel.ClassDeclaration cls) {
       if (cls.fileIdentifier != null) {
@@ -143,10 +133,8 @@
     });
   }
 
-  /**
-   * Generate a string representing the Dart type which should be used to
-   * represent [type] when deserialized.
-   */
+  /// Generate a string representing the Dart type which should be used to
+  /// represent [type] when deserialized.
   String dartType(idlModel.FieldType type) {
     String baseType = idlPrefix(type.typeName);
     if (type.isList) {
@@ -156,13 +144,11 @@
     }
   }
 
-  /**
-   * Generate a Dart expression representing the default value for a field
-   * having the given [type], or `null` if there is no default value.
-   *
-   * If [builder] is `true`, the returned type should be appropriate for use in
-   * a builder class.
-   */
+  /// Generate a Dart expression representing the default value for a field
+  /// having the given [type], or `null` if there is no default value.
+  ///
+  /// If [builder] is `true`, the returned type should be appropriate for use in
+  /// a builder class.
   String defaultValue(idlModel.FieldType type, bool builder) {
     if (type.isList) {
       if (builder) {
@@ -188,10 +174,8 @@
     }
   }
 
-  /**
-   * Generate a string representing the Dart type which should be used to
-   * represent [type] while building a serialized data structure.
-   */
+  /// Generate a string representing the Dart type which should be used to
+  /// represent [type] while building a serialized data structure.
   String encodedType(idlModel.FieldType type) {
     String typeStr;
     if (_idl.classes.containsKey(type.typeName)) {
@@ -206,10 +190,8 @@
     }
   }
 
-  /**
-   * Process the AST in [idlParsed] and store the resulting semantic model in
-   * [_idl].  Also perform some error checking.
-   */
+  /// Process the AST in [idlParsed] and store the resulting semantic model in
+  /// [_idl].  Also perform some error checking.
   void extractIdl(CompilationUnit idlParsed) {
     _idl = new idlModel.Idl();
     for (CompilationUnitMember decl in idlParsed.declarations) {
@@ -301,10 +283,8 @@
     }
   }
 
-  /**
-   * Generate a string representing the FlatBuffer schema type which should be
-   * used to represent [type].
-   */
+  /// Generate a string representing the FlatBuffer schema type which should be
+  /// used to represent [type].
   String fbsType(idlModel.FieldType type) {
     String typeStr;
     switch (type.typeName) {
@@ -337,9 +317,7 @@
     }
   }
 
-  /**
-   * Entry point to the code generator when generating the "format.fbs" file.
-   */
+  /// Entry point to the code generator when generating the "format.fbs" file.
   void generateFlatBufferSchema() {
     outputHeader();
     for (idlModel.EnumDeclaration enm in _idl.enums.values) {
@@ -392,9 +370,7 @@
     }
   }
 
-  /**
-   * Entry point to the code generator when generating the "format.dart" file.
-   */
+  /// Entry point to the code generator when generating the "format.dart" file.
   void generateFormatCode() {
     outputHeader();
     out('library analyzer.src.summary.format;');
@@ -430,10 +406,8 @@
     }
   }
 
-  /**
-   * Add the prefix `idl.` to a type name, unless that type name is the name of
-   * a built-in type.
-   */
+  /// Add the prefix `idl.` to a type name, unless that type name is the name of
+  /// a built-in type.
   String idlPrefix(String s) {
     switch (s) {
       case 'bool':
@@ -446,9 +420,7 @@
     }
   }
 
-  /**
-   * Execute [callback] with two spaces added to [_indentation].
-   */
+  /// Execute [callback] with two spaces added to [_indentation].
   void indent(void callback()) {
     String oldIndentation = _indentation;
     try {
@@ -459,10 +431,8 @@
     }
   }
 
-  /**
-   * Add the string [s] to the output as a single line, indenting as
-   * appropriate.
-   */
+  /// Add the string [s] to the output as a single line, indenting as
+  /// appropriate.
   void out([String s = '']) {
     if (s == '') {
       _outBuffer.writeln('');
@@ -478,18 +448,18 @@
   }
 
   void outputHeader() {
-    out('// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file');
+    out('// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file');
     out('// for details. All rights reserved. Use of this source code is governed by a');
     out('// BSD-style license that can be found in the LICENSE file.');
     out('//');
     out('// This file has been automatically generated.  Please do not edit it manually.');
-    out('// To regenerate the file, use the script "pkg/analyzer/tool/generate_files".');
+    out('// To regenerate the file, use the SDK script');
+    out('// "pkg/analyzer/tool/summary/generate.dart \$IDL_FILE_PATH",');
+    out('// or "pkg/analyzer/tool/generate_files" for the analyzer package IDL/sources.');
     out();
   }
 
-  /**
-   * Enclose [s] in quotes, escaping as necessary.
-   */
+  /// Enclose [s] in quotes, escaping as necessary.
   String quoted(String s) {
     return json.encode(s);
   }
@@ -711,7 +681,7 @@
           if (field.variantMap != null) {
             for (var logicalName in field.variantMap.keys) {
               var variants = field.variantMap[logicalName];
-              out('void set $logicalName($typeStr value) {');
+              out('set $logicalName($typeStr value) {');
               indent(() {
                 out(_variantAssertStatement(cls, variants));
                 _generateNonNegativeInt(fieldType);
@@ -721,7 +691,7 @@
               out();
             }
           } else {
-            out('void set $fieldName($typeStr value) {');
+            out('set $fieldName($typeStr value) {');
             indent(() {
               _generateNonNegativeInt(fieldType);
               out('this._$fieldName = value;');
@@ -780,9 +750,7 @@
       // Generate flushInformative().
       {
         out();
-        out('/**');
-        out(' * Flush [informative] data recursively.');
-        out(' */');
+        out('/// Flush [informative] data recursively.');
         out('void flushInformative() {');
         indent(() {
           for (idlModel.FieldDeclaration field in cls.fields) {
@@ -804,9 +772,7 @@
       // Generate collectApiSignature().
       {
         out();
-        out('/**');
-        out(' * Accumulate non-[informative] data into [signature].');
-        out(' */');
+        out('/// Accumulate non-[informative] data into [signature].');
         out('void collectApiSignature(api_sig.ApiSignature signature) {');
         indent(() {
           List<idlModel.FieldDeclaration> sortedFields = cls.fields.toList()
@@ -1239,12 +1205,10 @@
     out('}');
   }
 
-  /**
-   * Generate a call to the appropriate method of [ApiSignature] for the type
-   * [typeName], using the data named by [ref].  If [couldBeNull] is `true`,
-   * generate code to handle the possibility that [ref] is `null` (substituting
-   * in the appropriate default value).
-   */
+  /// Generate a call to the appropriate method of [ApiSignature] for the type
+  /// [typeName], using the data named by [ref].  If [couldBeNull] is `true`,
+  /// generate code to handle the possibility that [ref] is `null` (substituting
+  /// in the appropriate default value).
   void _generateSignatureCall(String typeName, String ref, bool couldBeNull) {
     if (_idl.enums.containsKey(typeName)) {
       if (couldBeNull) {
@@ -1289,10 +1253,8 @@
     }
   }
 
-  /**
-   * Return the documentation text of the given [node], or `null` if the [node]
-   * does not have a comment.  Each line is `\n` separated.
-   */
+  /// Return the documentation text of the given [node], or `null` if the [node]
+  /// does not have a comment.  Each line is `\n` separated.
   String _getNodeDoc(AnnotatedNode node) {
     Comment comment = node.documentationComment;
     if (comment != null && comment.isDocumentation) {
diff --git a/analyzer/tool/summary/inspect.dart b/analyzer/tool/summary/inspect.dart
index e1daf10..b968118 100644
--- a/analyzer/tool/summary/inspect.dart
+++ b/analyzer/tool/summary/inspect.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/analyzer/tool/summary/mini_ast.dart b/analyzer/tool/summary/mini_ast.dart
index a4e718e..b218815 100644
--- a/analyzer/tool/summary/mini_ast.dart
+++ b/analyzer/tool/summary/mini_ast.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -454,8 +454,14 @@
   }
 
   @override
-  void endTopLevelFields(Token staticToken, Token covariantToken,
-      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
+  void endTopLevelFields(
+      Token staticToken,
+      Token covariantToken,
+      Token lateToken,
+      Token varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
     // We ignore top level variable declarations; they are present just to make
     // the IDL analyze without warnings.
     debugEvent("TopLevelFields");
diff --git a/build/BUILD.gn b/build/BUILD.gn
index 2cffa88..cbb8b39 100644
--- a/build/BUILD.gn
+++ b/build/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for build-1.1.3
+# This file is generated by importer.py for build-1.1.4
 
 import("//build/dart/dart_library.gni")
 
diff --git a/build/CHANGELOG.md b/build/CHANGELOG.md
index a1ba664..538aa9a 100644
--- a/build/CHANGELOG.md
+++ b/build/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 1.1.4
+
+- Internal cleanup: use "strict raw types".
+- Some return types for interfaces to implement changed from `Future<dynamic>`
+  to `Future<void>`.
+
 ## 1.1.3
 
 - Update the minimum sdk constraint to 2.1.0.
diff --git a/build/lib/src/asset/id.dart b/build/lib/src/asset/id.dart
index 62f66db..a743cf7 100644
--- a/build/lib/src/asset/id.dart
+++ b/build/lib/src/asset/id.dart
@@ -107,7 +107,7 @@
 
   /// Deserializes an [AssetId] from [data], which must be the result of
   /// calling [serialize] on an existing [AssetId].
-  AssetId.deserialize(List data)
+  AssetId.deserialize(List<dynamic> data)
       : package = data[0] as String,
         path = data[1] as String;
 
diff --git a/build/lib/src/asset/writer.dart b/build/lib/src/asset/writer.dart
index 2d25779..68ba81f 100644
--- a/build/lib/src/asset/writer.dart
+++ b/build/lib/src/asset/writer.dart
@@ -14,7 +14,7 @@
   ///
   /// * Throws a `PackageNotFoundException` if `id.package` is not found.
   /// * Throws an `InvalidOutputException` if the output was not valid.
-  Future writeAsBytes(AssetId id, List<int> bytes);
+  Future<void> writeAsBytes(AssetId id, List<int> bytes);
 
   /// Writes [contents] to a text file located at [id] with [encoding].
   ///
@@ -22,7 +22,8 @@
   ///
   /// * Throws a `PackageNotFoundException` if `id.package` is not found.
   /// * Throws an `InvalidOutputException` if the output was not valid.
-  Future writeAsString(AssetId id, String contents, {Encoding encoding = utf8});
+  Future<void> writeAsString(AssetId id, String contents,
+      {Encoding encoding = utf8});
 }
 
 /// An [AssetWriter] which tracks all [assetsWritten] during its lifetime.
@@ -35,13 +36,13 @@
   Iterable<AssetId> get assetsWritten => _assetsWritten;
 
   @override
-  Future writeAsBytes(AssetId id, List<int> bytes) {
+  Future<void> writeAsBytes(AssetId id, List<int> bytes) {
     _assetsWritten.add(id);
     return _delegate.writeAsBytes(id, bytes);
   }
 
   @override
-  Future writeAsString(AssetId id, String contents,
+  Future<void> writeAsString(AssetId id, String contents,
       {Encoding encoding = utf8}) {
     _assetsWritten.add(id);
     return _delegate.writeAsString(id, contents, encoding: encoding);
diff --git a/build/lib/src/builder/build_step.dart b/build/lib/src/builder/build_step.dart
index 2c28830..ae1d64a 100644
--- a/build/lib/src/builder/build_step.dart
+++ b/build/lib/src/builder/build_step.dart
@@ -45,7 +45,7 @@
   /// Future since the runner will be responsible for waiting until all outputs
   /// are written.
   @override
-  Future writeAsBytes(AssetId id, FutureOr<List<int>> bytes);
+  Future<void> writeAsBytes(AssetId id, FutureOr<List<int>> bytes);
 
   /// Writes [contents] to a text file located at [id] with [encoding].
   ///
@@ -58,7 +58,7 @@
   /// Future since the runner will be responsible for waiting until all outputs
   /// are written.
   @override
-  Future writeAsString(AssetId id, FutureOr<String> contents,
+  Future<void> writeAsString(AssetId id, FutureOr<String> contents,
       {Encoding encoding = utf8});
 
   /// A [Resolver] for [inputId].
diff --git a/build/lib/src/builder/build_step_impl.dart b/build/lib/src/builder/build_step_impl.dart
index 63d71c2..380204b 100644
--- a/build/lib/src/builder/build_step_impl.dart
+++ b/build/lib/src/builder/build_step_impl.dart
@@ -42,7 +42,7 @@
   final Set<AssetId> _expectedOutputs;
 
   /// The result of any writes which are starting during this step.
-  final _writeResults = <Future<Result>>[];
+  final _writeResults = <Future<Result<void>>>[];
 
   /// Used internally for reading files.
   final AssetReader _reader;
@@ -109,7 +109,7 @@
   }
 
   @override
-  Future writeAsBytes(AssetId id, FutureOr<List<int>> bytes) {
+  Future<void> writeAsBytes(AssetId id, FutureOr<List<int>> bytes) {
     if (_isComplete) throw BuildStepCompletedException();
     _checkOutput(id);
     var done =
@@ -119,7 +119,7 @@
   }
 
   @override
-  Future writeAsString(AssetId id, FutureOr<String> content,
+  Future<void> writeAsString(AssetId id, FutureOr<String> content,
       {Encoding encoding = utf8}) {
     if (_isComplete) throw BuildStepCompletedException();
     _checkOutput(id);
@@ -140,7 +140,8 @@
   T trackStage<T>(String label, action, {bool isExternal = false}) =>
       _stageTracker.trackStage(label, action, isExternal: isExternal);
 
-  Future _futureOrWrite<T>(FutureOr<T> content, Future write(T content)) =>
+  Future<void> _futureOrWrite<T>(
+          FutureOr<T> content, Future<void> write(T content)) =>
       (content is Future<T>) ? content.then(write) : write(content as T);
 
   /// Waits for work to finish and cleans up resources.
@@ -148,7 +149,7 @@
   /// This method should be called after a build has completed. After the
   /// returned [Future] completes then all outputs have been written and the
   /// [Resolver] for this build step - if any - has been released.
-  Future complete() async {
+  Future<void> complete() async {
     _isComplete = true;
     await Future.wait(_writeResults.map(Result.release));
     (await _resolver)?.release();
diff --git a/build/lib/src/builder/multiplexing_builder.dart b/build/lib/src/builder/multiplexing_builder.dart
index fa08a9c..e91ee15 100644
--- a/build/lib/src/builder/multiplexing_builder.dart
+++ b/build/lib/src/builder/multiplexing_builder.dart
@@ -22,7 +22,7 @@
         .where((builder) =>
             builder.buildExtensions.keys.any(buildStep.inputId.path.endsWith))
         .map((builder) => builder.build(buildStep))
-        .whereType<Future>());
+        .whereType<Future<void>>());
   }
 
   /// Merges output extensions from all builders.
diff --git a/build/lib/src/builder/post_process_build_step.dart b/build/lib/src/builder/post_process_build_step.dart
index 3a58a4f..5fef55f 100644
--- a/build/lib/src/builder/post_process_build_step.dart
+++ b/build/lib/src/builder/post_process_build_step.dart
@@ -29,7 +29,7 @@
   final void Function(AssetId) _deleteAsset;
 
   /// The result of any writes which are starting during this step.
-  final _writeResults = <Future<Result>>[];
+  final _writeResults = <Future<Result<void>>>[];
 
   PostProcessBuildStep._(this.inputId, this._reader, this._writer,
       this._addAsset, this._deleteAsset);
@@ -43,7 +43,7 @@
   Future<String> readInputAsString({Encoding encoding = utf8}) =>
       _reader.readAsString(inputId, encoding: encoding);
 
-  Future writeAsBytes(AssetId id, FutureOr<List<int>> bytes) {
+  Future<void> writeAsBytes(AssetId id, FutureOr<List<int>> bytes) {
     _addAsset(id);
     var done =
         _futureOrWrite(bytes, (List<int> b) => _writer.writeAsBytes(id, b));
@@ -51,7 +51,7 @@
     return done;
   }
 
-  Future writeAsString(AssetId id, FutureOr<String> content,
+  Future<void> writeAsString(AssetId id, FutureOr<String> content,
       {Encoding encoding = utf8}) {
     _addAsset(id);
     var done = _futureOrWrite(content,
@@ -69,10 +69,11 @@
   ///
   /// This method should be called after a build has completed. After the
   /// returned [Future] completes then all outputs have been written.
-  Future complete() async {
+  Future<void> complete() async {
     await Future.wait(_writeResults.map(Result.release));
   }
 }
 
-Future _futureOrWrite<T>(FutureOr<T> content, Future write(T content)) =>
+Future<void> _futureOrWrite<T>(
+        FutureOr<T> content, Future<void> write(T content)) =>
     (content is Future<T>) ? content.then(write) : write(content as T);
diff --git a/build/lib/src/generate/run_builder.dart b/build/lib/src/generate/run_builder.dart
index ed368d8..4adfc0f 100644
--- a/build/lib/src/generate/run_builder.dart
+++ b/build/lib/src/generate/run_builder.dart
@@ -26,7 +26,7 @@
 /// automatically disposed of (its up to the caller to dispose of it later). If
 /// one is not provided then one will be created and disposed at the end of
 /// this function call.
-Future<Null> runBuilder(Builder builder, Iterable<AssetId> inputs,
+Future<void> runBuilder(Builder builder, Iterable<AssetId> inputs,
     AssetReader reader, AssetWriter writer, Resolvers resolvers,
     {Logger logger,
     ResourceManager resourceManager,
@@ -36,7 +36,7 @@
   resourceManager ??= ResourceManager();
   logger ??= Logger('runBuilder');
   //TODO(nbosch) check overlapping outputs?
-  Future<Null> buildForInput(AssetId input) async {
+  Future<void> buildForInput(AssetId input) async {
     var outputs = expectedOutputs(builder, input);
     if (outputs.isEmpty) return;
     var buildStep = BuildStepImpl(input, outputs, reader, writer,
diff --git a/build/lib/src/generate/run_post_process_builder.dart b/build/lib/src/generate/run_post_process_builder.dart
index 881f359..a4945fb 100644
--- a/build/lib/src/generate/run_post_process_builder.dart
+++ b/build/lib/src/generate/run_post_process_builder.dart
@@ -20,7 +20,7 @@
 /// If an asset should not be written this function should throw.
 /// [deleteAsset] should remove the asset from the build system, it will not be
 /// deleted on disk since the `writer` has no mechanism for delete.
-Future<Null> runPostProcessBuilder(PostProcessBuilder builder, AssetId inputId,
+Future<void> runPostProcessBuilder(PostProcessBuilder builder, AssetId inputId,
     AssetReader reader, AssetWriter writer, Logger logger,
     {@required void Function(AssetId) addAsset,
     @required void Function(AssetId) deleteAsset}) async {
diff --git a/build/lib/src/resource/resource.dart b/build/lib/src/resource/resource.dart
index 0af3c63..8e786de 100644
--- a/build/lib/src/resource/resource.dart
+++ b/build/lib/src/resource/resource.dart
@@ -5,8 +5,8 @@
 import 'dart:async';
 
 typedef CreateInstance<T> = FutureOr<T> Function();
-typedef DisposeInstance<T> = FutureOr Function(T instance);
-typedef BeforeExit = FutureOr Function();
+typedef DisposeInstance<T> = FutureOr<void> Function(T instance);
+typedef BeforeExit = FutureOr<void> Function();
 
 /// A [Resource] encapsulates the logic for creating and disposing of some
 /// expensive object which has a lifecycle.
@@ -42,7 +42,7 @@
       _instanceByManager.putIfAbsent(manager, () async => await _create());
 
   /// Disposes the actual instance of this resource for [manager] if present.
-  Future _dispose(ResourceManager manager) {
+  Future<void> _dispose(ResourceManager manager) {
     if (!_instanceByManager.containsKey(manager)) return Future.value(null);
     var oldInstance = _fetch(manager);
     _instanceByManager.remove(manager);
@@ -60,14 +60,14 @@
 /// implementations and not general end users. Instead end users should use
 /// the `buildStep#fetchResource` method to get [Resource]s.
 class ResourceManager {
-  final _resources = Set<Resource>();
+  final _resources = Set<Resource<void>>();
 
   /// The [Resource]s that we need to call `beforeExit` on.
   ///
   /// We have to hang on to these forever, but they should be small in number,
   /// and we don't hold on to the actual created instances, just the [Resource]
   /// instances.
-  final _resourcesWithBeforeExit = Set<Resource>();
+  final _resourcesWithBeforeExit = Set<Resource<void>>();
 
   /// Fetches an instance of [resource].
   Future<T> fetch<T>(Resource<T> resource) async {
diff --git a/build/pubspec.yaml b/build/pubspec.yaml
index bc7aed0..ebf9750 100644
--- a/build/pubspec.yaml
+++ b/build/pubspec.yaml
@@ -1,5 +1,5 @@
 name: build
-version: 1.1.3
+version: 1.1.4
 description: A build system for Dart.
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/build/tree/master/build
@@ -21,6 +21,6 @@
   build_resolvers: ^1.0.0
   build_runner: ^1.0.0
   build_test: ^0.10.0
-  build_vm_compilers: ^0.1.0
+  build_vm_compilers: ">=0.1.0 <2.0.0"
   pedantic: ^1.0.0
   test: ^1.2.0
diff --git a/build_config/BUILD.gn b/build_config/BUILD.gn
index fd60893..60b6d86 100644
--- a/build_config/BUILD.gn
+++ b/build_config/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for build_config-0.3.2
+# This file is generated by importer.py for build_config-0.4.0
 
 import("//build/dart/dart_library.gni")
 
@@ -12,11 +12,10 @@
   disable_analysis = true
 
   deps = [
-    "//third_party/dart-pkg/pub/yaml",
-    "//third_party/dart-pkg/pub/meta",
-    "//third_party/dart-pkg/pub/build",
     "//third_party/dart-pkg/pub/pubspec_parse",
     "//third_party/dart-pkg/pub/path",
+    "//third_party/dart-pkg/pub/meta",
     "//third_party/dart-pkg/pub/json_annotation",
+    "//third_party/dart-pkg/pub/yaml",
   ]
 }
diff --git a/build_config/CHANGELOG.md b/build_config/CHANGELOG.md
index a2b4717..f722884 100644
--- a/build_config/CHANGELOG.md
+++ b/build_config/CHANGELOG.md
@@ -1,3 +1,14 @@
+## 0.4.0
+
+- Breaking for build systems - change type of `BuilderOptions` fields to
+  `Map<String, dynamic>` to drop dependency on `build`. Does not impact packages
+  only depending on `build.yaml` parsing.
+- Breaking for build systems - versioning scheme is changing to match
+  `package:build`. Changes which are breaking to _users_ - those with
+  `build.yaml` files will be indicated with a breaking major version bump.
+  Changed which are breaking to build system _implementors_ - those who use the
+  Dart API for this package, will be indicated with a minor version bump.
+
 ## 0.3.2
 
 - Add an explicit error when `buildExtensions` is configured to overwrite it's
diff --git a/build_config/lib/src/build_target.dart b/build_config/lib/src/build_target.dart
index 45fa9f6..6cf17ec 100644
--- a/build_config/lib/src/build_target.dart
+++ b/build_config/lib/src/build_target.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:build/build.dart';
 import 'package:json_annotation/json_annotation.dart';
 
 import 'builder_definition.dart';
@@ -84,27 +83,26 @@
   ///
   /// Individual keys may be overridden by either [devOptions] or
   /// [releaseOptions].
-  @JsonKey(fromJson: builderOptionsFromJson)
-  final BuilderOptions options;
+  final Map<String, dynamic> options;
 
   /// Overrides for [options] in dev mode.
-  @JsonKey(name: 'dev_options', fromJson: builderOptionsFromJson)
-  final BuilderOptions devOptions;
+  @JsonKey(name: 'dev_options')
+  final Map<String, dynamic> devOptions;
 
   /// Overrides for [options] in release mode.
-  @JsonKey(name: 'release_options', fromJson: builderOptionsFromJson)
-  final BuilderOptions releaseOptions;
+  @JsonKey(name: 'release_options')
+  final Map<String, dynamic> releaseOptions;
 
   TargetBuilderConfig({
     bool isEnabled,
     this.generateFor,
-    BuilderOptions options,
-    BuilderOptions devOptions,
-    BuilderOptions releaseOptions,
+    Map<String, dynamic> options,
+    Map<String, dynamic> devOptions,
+    Map<String, dynamic> releaseOptions,
   })  : isEnabled = isEnabled ?? true,
-        options = options ?? BuilderOptions.empty,
-        devOptions = devOptions ?? BuilderOptions.empty,
-        releaseOptions = releaseOptions ?? BuilderOptions.empty;
+        options = options ?? const {},
+        devOptions = devOptions ?? const {},
+        releaseOptions = releaseOptions ?? const {};
 
   factory TargetBuilderConfig.fromJson(Map json) =>
       _$TargetBuilderConfigFromJson(json);
@@ -113,9 +111,9 @@
   String toString() => {
         'isEnabled': isEnabled,
         'generateFor': generateFor,
-        'options': options.config,
-        'devOptions': devOptions.config,
-        'releaseOptions': releaseOptions.config,
+        'options': options,
+        'devOptions': devOptions,
+        'releaseOptions': releaseOptions,
       }.toString();
 }
 
@@ -129,32 +127,31 @@
   ///
   /// Individual keys may be overridden by either [devOptions] or
   /// [releaseOptions].
-  @JsonKey(fromJson: builderOptionsFromJson)
-  final BuilderOptions options;
+  final Map<String, dynamic> options;
 
   /// Overrides for [options] in dev mode.
-  @JsonKey(name: 'dev_options', fromJson: builderOptionsFromJson)
-  final BuilderOptions devOptions;
+  @JsonKey(name: 'dev_options')
+  final Map<String, dynamic> devOptions;
 
   /// Overrides for [options] in release mode.
-  @JsonKey(name: 'release_options', fromJson: builderOptionsFromJson)
-  final BuilderOptions releaseOptions;
+  @JsonKey(name: 'release_options')
+  final Map<String, dynamic> releaseOptions;
 
   GlobalBuilderConfig({
-    BuilderOptions options,
-    BuilderOptions devOptions,
-    BuilderOptions releaseOptions,
-  })  : options = options ?? BuilderOptions.empty,
-        devOptions = devOptions ?? BuilderOptions.empty,
-        releaseOptions = releaseOptions ?? BuilderOptions.empty;
+    Map<String, dynamic> options,
+    Map<String, dynamic> devOptions,
+    Map<String, dynamic> releaseOptions,
+  })  : options = options ?? const {},
+        devOptions = devOptions ?? const {},
+        releaseOptions = releaseOptions ?? const {};
 
   factory GlobalBuilderConfig.fromJson(Map json) =>
       _$GlobalBuilderConfigFromJson(json);
 
   @override
   String toString() => {
-        'options': options.config,
-        'devOptions': devOptions.config,
-        'releaseOptions': releaseOptions.config,
+        'options': options,
+        'devOptions': devOptions,
+        'releaseOptions': releaseOptions,
       }.toString();
 }
diff --git a/build_config/lib/src/build_target.g.dart b/build_config/lib/src/build_target.g.dart
index 2781b4f..4e6406f 100644
--- a/build_config/lib/src/build_target.g.dart
+++ b/build_config/lib/src/build_target.g.dart
@@ -38,11 +38,11 @@
         generateFor: $checkedConvert(json, 'generate_for',
             (v) => v == null ? null : InputSet.fromJson(v)),
         options: $checkedConvert(json, 'options',
-            (v) => v == null ? null : builderOptionsFromJson(v as Map)),
+            (v) => (v as Map)?.map((k, e) => MapEntry(k as String, e))),
         devOptions: $checkedConvert(json, 'dev_options',
-            (v) => v == null ? null : builderOptionsFromJson(v as Map)),
+            (v) => (v as Map)?.map((k, e) => MapEntry(k as String, e))),
         releaseOptions: $checkedConvert(json, 'release_options',
-            (v) => v == null ? null : builderOptionsFromJson(v as Map)));
+            (v) => (v as Map)?.map((k, e) => MapEntry(k as String, e))));
     return val;
   }, fieldKeyMap: const {
     'isEnabled': 'enabled',
@@ -58,11 +58,11 @@
         allowedKeys: const ['options', 'dev_options', 'release_options']);
     final val = GlobalBuilderConfig(
         options: $checkedConvert(json, 'options',
-            (v) => v == null ? null : builderOptionsFromJson(v as Map)),
+            (v) => (v as Map)?.map((k, e) => MapEntry(k as String, e))),
         devOptions: $checkedConvert(json, 'dev_options',
-            (v) => v == null ? null : builderOptionsFromJson(v as Map)),
+            (v) => (v as Map)?.map((k, e) => MapEntry(k as String, e))),
         releaseOptions: $checkedConvert(json, 'release_options',
-            (v) => v == null ? null : builderOptionsFromJson(v as Map)));
+            (v) => (v as Map)?.map((k, e) => MapEntry(k as String, e))));
     return val;
   }, fieldKeyMap: const {
     'devOptions': 'dev_options',
diff --git a/build_config/lib/src/builder_definition.dart b/build_config/lib/src/builder_definition.dart
index 554d7b9..0abdfc1 100644
--- a/build_config/lib/src/builder_definition.dart
+++ b/build_config/lib/src/builder_definition.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:build/build.dart';
 import 'package:json_annotation/json_annotation.dart';
 import 'package:meta/meta.dart';
 
@@ -176,7 +175,7 @@
   String get key => builderKeyExpando[this];
 
   /// The name of the top-level method in [import] from
-  /// BuilderOptions -> Builder.
+  /// Map<String, dynamic> -> Builder.
   @JsonKey(
       name: 'builder_factory',
       nullable: false,
@@ -229,24 +228,23 @@
   @JsonKey(name: 'generate_for')
   final InputSet generateFor;
 
-  @JsonKey(fromJson: builderOptionsFromJson)
-  final BuilderOptions options;
+  final Map<String, dynamic> options;
 
-  @JsonKey(name: 'dev_options', fromJson: builderOptionsFromJson)
-  final BuilderOptions devOptions;
+  @JsonKey(name: 'dev_options')
+  final Map<String, dynamic> devOptions;
 
-  @JsonKey(name: 'release_options', fromJson: builderOptionsFromJson)
-  final BuilderOptions releaseOptions;
+  @JsonKey(name: 'release_options')
+  final Map<String, dynamic> releaseOptions;
 
   const TargetBuilderConfigDefaults({
     InputSet generateFor,
-    BuilderOptions options,
-    BuilderOptions devOptions,
-    BuilderOptions releaseOptions,
+    Map<String, dynamic> options,
+    Map<String, dynamic> devOptions,
+    Map<String, dynamic> releaseOptions,
   })  : generateFor = generateFor ?? InputSet.anything,
-        options = options ?? BuilderOptions.empty,
-        devOptions = devOptions ?? BuilderOptions.empty,
-        releaseOptions = releaseOptions ?? BuilderOptions.empty;
+        options = options ?? const {},
+        devOptions = devOptions ?? const {},
+        releaseOptions = releaseOptions ?? const {};
 
   factory TargetBuilderConfigDefaults.fromJson(Map json) =>
       _$TargetBuilderConfigDefaultsFromJson(json);
diff --git a/build_config/lib/src/builder_definition.g.dart b/build_config/lib/src/builder_definition.g.dart
index 9a42fd0..48f7a65 100644
--- a/build_config/lib/src/builder_definition.g.dart
+++ b/build_config/lib/src/builder_definition.g.dart
@@ -148,11 +148,11 @@
         generateFor: $checkedConvert(json, 'generate_for',
             (v) => v == null ? null : InputSet.fromJson(v)),
         options: $checkedConvert(json, 'options',
-            (v) => v == null ? null : builderOptionsFromJson(v as Map)),
+            (v) => (v as Map)?.map((k, e) => MapEntry(k as String, e))),
         devOptions: $checkedConvert(json, 'dev_options',
-            (v) => v == null ? null : builderOptionsFromJson(v as Map)),
+            (v) => (v as Map)?.map((k, e) => MapEntry(k as String, e))),
         releaseOptions: $checkedConvert(json, 'release_options',
-            (v) => v == null ? null : builderOptionsFromJson(v as Map)));
+            (v) => (v as Map)?.map((k, e) => MapEntry(k as String, e))));
     return val;
   }, fieldKeyMap: const {
     'generateFor': 'generate_for',
diff --git a/build_config/lib/src/common.dart b/build_config/lib/src/common.dart
index 78a8bb0..bb61045 100644
--- a/build_config/lib/src/common.dart
+++ b/build_config/lib/src/common.dart
@@ -4,11 +4,6 @@
 
 import 'dart:async';
 
-import 'package:build/build.dart';
-
-BuilderOptions builderOptionsFromJson(Map config) =>
-    BuilderOptions(Map<String, dynamic>.from(config));
-
 final _defaultDependenciesZoneKey = Symbol('buildConfigDefaultDependencies');
 final _packageZoneKey = Symbol('buildConfigPackage');
 
diff --git a/build_config/mono_pkg.yaml b/build_config/mono_pkg.yaml
index 314818e..552adb0 100644
--- a/build_config/mono_pkg.yaml
+++ b/build_config/mono_pkg.yaml
@@ -8,7 +8,7 @@
         - dartanalyzer: --fatal-infos --fatal-warnings .
     - dartanalyzer: --fatal-warnings .
       dart:
-        - 2.0.0
+        - 2.2.0
   - unit_test:
     # Run the script directly - running from snapshot has issues for packages
     # that are depended on by build_runner itself.
diff --git a/build_config/pubspec.yaml b/build_config/pubspec.yaml
index f905d7a..03f8995 100644
--- a/build_config/pubspec.yaml
+++ b/build_config/pubspec.yaml
@@ -1,14 +1,13 @@
 name: build_config
-version: 0.3.2
+version: 0.4.0
 description: Support for parsing `build.yaml` configuration.
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/build/tree/master/build_config
 
 environment:
-  sdk: '>=2.0.0 <3.0.0'
+  sdk: '>=2.2.0 <3.0.0'
 
 dependencies:
-  build: '>=0.12.1 <2.0.0'
   json_annotation: '>=1.0.0 <3.0.0'
   meta: ^1.1.0
   path: ^1.4.0
@@ -18,6 +17,19 @@
 dev_dependencies:
   build_runner: ^1.0.0
   build_test: ^0.10.0
-  build_vm_compilers: ^0.1.0
+  build_vm_compilers: ">=0.1.0 <2.0.0"
   json_serializable: ^2.0.0
   test: ^1.0.0
+
+  #dependency_overrides:
+  #  json_serializable: ^2.0.0
+  #  build_runner:
+  #    path: ../build_runner
+  #  build_runner_core:
+  #    path: ../build_runner_core
+  #  build_vm_compilers:
+  #    path: ../build_vm_compilers
+  #  build_modules:
+  #    path: ../build_modules
+  #  build_test:
+  #    path: ../build_test
diff --git a/build_daemon/BUILD.gn b/build_daemon/BUILD.gn
index ef3a19d..5079236 100644
--- a/build_daemon/BUILD.gn
+++ b/build_daemon/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for build_daemon-0.5.0
+# This file is generated by importer.py for build_daemon-0.6.0
 
 import("//build/dart/dart_library.gni")
 
diff --git a/build_daemon/CHANGELOG.md b/build_daemon/CHANGELOG.md
index 1f453a9..aba0241 100644
--- a/build_daemon/CHANGELOG.md
+++ b/build_daemon/CHANGELOG.md
@@ -1,3 +1,13 @@
+## 0.6.0
+
+- Add retry logic to the state file helpers `runningVersion` and `currentOptions`.
+- `DaemonBuilder` is now an abstract class.
+- Significantly increase doc comment coverage.
+
+## 0.5.1
+
+- Support shutting down the daemon with a notification.
+
 ## 0.5.0
 
 - Add OutputLocation to DefaultBuildTarget.
diff --git a/build_daemon/example/example.dart b/build_daemon/example/example.dart
index d39738e..3bd8b84 100644
--- a/build_daemon/example/example.dart
+++ b/build_daemon/example/example.dart
@@ -15,6 +15,8 @@
       p.normalize(p.join(Directory.current.path + '/../example'));
 
   try {
+    // First we connect to the daemon. This will start one if one is not
+    // currently running.
     client = await BuildDaemonClient.connect(
         workingDirectory,
         [
@@ -40,6 +42,10 @@
   }
   if (client == null) throw Exception('Error connecting');
   print('Connected to Dart Build Daemon');
+
+  // Next we register a build target (directory) to build.
+  // Note this will not cause a build to occur unless there are relevant file
+  // changes.
   if (Random().nextBool()) {
     client.registerBuildTarget(DefaultBuildTarget((b) => b
       ..target = 'web'
@@ -59,7 +65,12 @@
 
     print('Registered test target...');
   }
+
+  // Handle events coming from the daemon.
   client.buildResults.listen((status) => print('BUILD STATUS: $status'));
+
+  // Force a build of all registered targets.
   client.startBuild();
+
   await client.finished;
 }
diff --git a/build_daemon/lib/client.dart b/build_daemon/lib/client.dart
index e2076a0..bbad969 100644
--- a/build_daemon/lib/client.dart
+++ b/build_daemon/lib/client.dart
@@ -16,10 +16,11 @@
 import 'data/build_target_request.dart';
 import 'data/serializers.dart';
 import 'data/server_log.dart';
+import 'src/file_wait.dart';
 
-int _existingPort(String workingDirectory) {
+Future<int> _existingPort(String workingDirectory) async {
   var portFile = File(portFilePath(workingDirectory));
-  if (!portFile.existsSync()) throw MissingPortFile();
+  if (!await waitForFile(portFile)) throw MissingPortFile();
   return int.parse(portFile.readAsStringSync());
 }
 
@@ -60,6 +61,12 @@
 bool _isActionMessage(String line) =>
     line == versionSkew || line == readyToConnectLog || line == optionsSkew;
 
+/// A client of the build daemon.
+///
+/// Handles starting and connecting to the build daemon.
+///
+/// Example:
+///   https://pub.dartlang.org/packages/build_daemon#-example-tab-
 class BuildDaemonClient {
   final _buildResults = StreamController<BuildResults>.broadcast();
   final Serializers _serializers;
@@ -96,7 +103,10 @@
   void registerBuildTarget(BuildTarget target) => _channel.sink.add(jsonEncode(
       _serializers.serialize(BuildTargetRequest((b) => b..target = target))));
 
-  /// Builds all registered targets.
+  /// Builds all registered targets, including those not from this client.
+  ///
+  /// Note this will wait for any ongoing build to finish before starting a new
+  /// one.
   void startBuild() {
     var request = BuildRequest();
     _channel.sink.add(jsonEncode(_serializers.serialize(request)));
@@ -104,6 +114,9 @@
 
   Future<void> close() => _channel.sink.close();
 
+  /// Connects to the current daemon instance.
+  ///
+  /// If one is not running, a new daemon instance will be started.
   static Future<BuildDaemonClient> connect(
     String workingDirectory,
     List<String> daemonCommand, {
@@ -129,12 +142,17 @@
     await _handleDaemonStartup(process, logHandler);
 
     return BuildDaemonClient._(
-        _existingPort(workingDirectory), daemonSerializers, logHandler);
+        await _existingPort(workingDirectory), daemonSerializers, logHandler);
   }
 }
 
+/// Thrown when the port file for the running daemon instance can't be found.
 class MissingPortFile implements Exception {}
 
+/// Thrown if the client requests conflicting options with the current daemon
+/// instance.
 class OptionsSkew implements Exception {}
 
+/// Thrown if the current daemon instance version does not match that of the
+/// client.
 class VersionSkew implements Exception {}
diff --git a/build_daemon/lib/constants.dart b/build_daemon/lib/constants.dart
index a0643e0..711fa99 100644
--- a/build_daemon/lib/constants.dart
+++ b/build_daemon/lib/constants.dart
@@ -11,7 +11,7 @@
 const optionsSkew = 'DIFFERENT OPTIONS';
 
 // TODO(grouma) - use pubspec version when this is open sourced.
-const currentVersion = '5.0.0';
+const currentVersion = '6.0.0';
 
 var _username = Platform.environment['USER'] ?? '';
 String daemonWorkspace(String workingDirectory) {
diff --git a/build_daemon/lib/daemon_builder.dart b/build_daemon/lib/daemon_builder.dart
index 10130a7..1d7824c 100644
--- a/build_daemon/lib/daemon_builder.dart
+++ b/build_daemon/lib/daemon_builder.dart
@@ -10,13 +10,16 @@
 import 'data/build_target.dart';
 import 'data/server_log.dart';
 
-class DaemonBuilder {
-  Stream<BuildResults> get builds => Stream.empty();
+/// A builder for the daemon.
+///
+/// Intended to be used as an interface for specific builder implementations
+/// which actually do the building.
+abstract class DaemonBuilder {
+  Stream<BuildResults> get builds;
 
-  Stream<ServerLog> get logs => Stream.empty();
+  Stream<ServerLog> get logs;
 
-  Future<void> build(
-      Set<BuildTarget> targets, Iterable<WatchEvent> changes) async {}
+  Future<void> build(Set<BuildTarget> targets, Iterable<WatchEvent> changes);
 
-  Future<void> stop() async {}
+  Future<void> stop();
 }
diff --git a/build_daemon/lib/data/build_request.dart b/build_daemon/lib/data/build_request.dart
index cbee2a6..0f4c145 100644
--- a/build_daemon/lib/data/build_request.dart
+++ b/build_daemon/lib/data/build_request.dart
@@ -7,6 +7,7 @@
 
 part 'build_request.g.dart';
 
+/// A request to trigger a build of all registered build targets.
 abstract class BuildRequest
     implements Built<BuildRequest, BuildRequestBuilder> {
   static Serializer<BuildRequest> get serializer => _$buildRequestSerializer;
diff --git a/build_daemon/lib/data/build_status.dart b/build_daemon/lib/data/build_status.dart
index 306072d..2758ee5 100644
--- a/build_daemon/lib/data/build_status.dart
+++ b/build_daemon/lib/data/build_status.dart
@@ -20,6 +20,7 @@
   static BuiltSet<BuildStatus> get values => _$values;
 }
 
+/// The build result for a single target.
 abstract class BuildResult {
   BuildStatus get status;
   String get target;
@@ -44,6 +45,13 @@
   DefaultBuildResult._();
 }
 
+/// The group of [BuildResult]s for a single build done by the daemon.
+///
+/// Since the daemon can build multiple targets in parallel, the results are
+/// grouped together.
+///
+/// Build results will only be provided if the client has registered a target
+/// that was built.
 abstract class BuildResults
     implements Built<BuildResults, BuildResultsBuilder> {
   static Serializer<BuildResults> get serializer => _$buildResultsSerializer;
diff --git a/build_daemon/lib/data/build_target.dart b/build_daemon/lib/data/build_target.dart
index 5be4350..ebc2806 100644
--- a/build_daemon/lib/data/build_target.dart
+++ b/build_daemon/lib/data/build_target.dart
@@ -4,6 +4,7 @@
 
 part 'build_target.g.dart';
 
+/// The string representation of a build target, e.g. folder path.
 abstract class BuildTarget {
   String get target;
 }
@@ -20,12 +21,16 @@
 
   DefaultBuildTarget._();
 
+  /// A set of file path patterns to match changes against.
+  ///
+  /// If a change matches a pattern this target will not be built.
   BuiltSet<RegExp> get blackListPatterns;
 
   @nullable
   OutputLocation get outputLocation;
 }
 
+/// The location to write the build outputs.
 abstract class OutputLocation
     implements Built<OutputLocation, OutputLocationBuilder> {
   static Serializer<OutputLocation> get serializer =>
@@ -37,7 +42,17 @@
 
   String get output;
 
+  /// Whether to use symlinks for build outputs.
   bool get useSymlinks;
 
+  /// Whether to hoist the build output.
+  ///
+  /// Hoisted outputs will not contain the build target folder within their
+  /// path.
+  ///
+  /// For example hoisting the build target web:
+  ///   <web>/<web-contents>
+  /// Should result in:
+  ///   <output-folder>/<web-contents>
   bool get hoist;
 }
diff --git a/build_daemon/lib/data/build_target_request.dart b/build_daemon/lib/data/build_target_request.dart
index 102c949..134cf7a 100644
--- a/build_daemon/lib/data/build_target_request.dart
+++ b/build_daemon/lib/data/build_target_request.dart
@@ -8,6 +8,9 @@
 
 part 'build_target_request.g.dart';
 
+/// Registers a build target to be built by the daemon.
+///
+/// Note this does not trigger a build.
 abstract class BuildTargetRequest
     implements Built<BuildTargetRequest, BuildTargetRequestBuilder> {
   static Serializer<BuildTargetRequest> get serializer =>
diff --git a/build_daemon/lib/data/serializers.dart b/build_daemon/lib/data/serializers.dart
index 1b1ad14..7f4f71f 100644
--- a/build_daemon/lib/data/serializers.dart
+++ b/build_daemon/lib/data/serializers.dart
@@ -4,11 +4,13 @@
 
 import 'package:built_collection/built_collection.dart';
 import 'package:built_value/serializer.dart';
+
 import 'build_request.dart';
 import 'build_status.dart';
 import 'build_target.dart';
 import 'build_target_request.dart';
 import 'server_log.dart';
+import 'shutdown_notification.dart';
 
 part 'serializers.g.dart';
 
@@ -21,5 +23,6 @@
   DefaultBuildResult,
   DefaultBuildTarget,
   ServerLog,
+  ShutdownNotification,
 ])
 final Serializers serializers = _$serializers;
diff --git a/build_daemon/lib/data/serializers.g.dart b/build_daemon/lib/data/serializers.g.dart
index 67b5cc9..ba37a28 100644
--- a/build_daemon/lib/data/serializers.g.dart
+++ b/build_daemon/lib/data/serializers.g.dart
@@ -15,6 +15,7 @@
       ..add(DefaultBuildTarget.serializer)
       ..add(OutputLocation.serializer)
       ..add(ServerLog.serializer)
+      ..add(ShutdownNotification.serializer)
       ..addBuilderFactory(
           const FullType(BuiltList, const [const FullType(BuildResult)]),
           () => new ListBuilder<BuildResult>())
diff --git a/build_daemon/lib/data/shutdown_notification.dart b/build_daemon/lib/data/shutdown_notification.dart
new file mode 100644
index 0000000..01341a8
--- /dev/null
+++ b/build_daemon/lib/data/shutdown_notification.dart
@@ -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 file.
+
+import 'package:built_value/built_value.dart';
+import 'package:built_value/serializer.dart';
+
+part 'shutdown_notification.g.dart';
+
+/// An event provided by the daemon to clients immediately before shutdown.
+abstract class ShutdownNotification
+    implements Built<ShutdownNotification, ShutdownNotificationBuilder> {
+  static Serializer<ShutdownNotification> get serializer =>
+      _$shutdownNotificationSerializer;
+
+  factory ShutdownNotification([updates(ShutdownNotificationBuilder b)]) =
+      _$ShutdownNotification;
+
+  String get message;
+
+  ShutdownNotification._();
+}
diff --git a/build_daemon/lib/data/shutdown_notification.g.dart b/build_daemon/lib/data/shutdown_notification.g.dart
new file mode 100644
index 0000000..4a5ecb9
--- /dev/null
+++ b/build_daemon/lib/data/shutdown_notification.g.dart
@@ -0,0 +1,136 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'shutdown_notification.dart';
+
+// **************************************************************************
+// BuiltValueGenerator
+// **************************************************************************
+
+Serializer<ShutdownNotification> _$shutdownNotificationSerializer =
+    new _$ShutdownNotificationSerializer();
+
+class _$ShutdownNotificationSerializer
+    implements StructuredSerializer<ShutdownNotification> {
+  @override
+  final Iterable<Type> types = const [
+    ShutdownNotification,
+    _$ShutdownNotification
+  ];
+  @override
+  final String wireName = 'ShutdownNotification';
+
+  @override
+  Iterable serialize(Serializers serializers, ShutdownNotification object,
+      {FullType specifiedType = FullType.unspecified}) {
+    final result = <Object>[
+      'message',
+      serializers.serialize(object.message,
+          specifiedType: const FullType(String)),
+    ];
+
+    return result;
+  }
+
+  @override
+  ShutdownNotification deserialize(Serializers serializers, Iterable serialized,
+      {FullType specifiedType = FullType.unspecified}) {
+    final result = new ShutdownNotificationBuilder();
+
+    final iterator = serialized.iterator;
+    while (iterator.moveNext()) {
+      final key = iterator.current as String;
+      iterator.moveNext();
+      final dynamic value = iterator.current;
+      switch (key) {
+        case 'message':
+          result.message = serializers.deserialize(value,
+              specifiedType: const FullType(String)) as String;
+          break;
+      }
+    }
+
+    return result.build();
+  }
+}
+
+class _$ShutdownNotification extends ShutdownNotification {
+  @override
+  final String message;
+
+  factory _$ShutdownNotification(
+          [void updates(ShutdownNotificationBuilder b)]) =>
+      (new ShutdownNotificationBuilder()..update(updates)).build();
+
+  _$ShutdownNotification._({this.message}) : super._() {
+    if (message == null) {
+      throw new BuiltValueNullFieldError('ShutdownNotification', 'message');
+    }
+  }
+
+  @override
+  ShutdownNotification rebuild(void updates(ShutdownNotificationBuilder b)) =>
+      (toBuilder()..update(updates)).build();
+
+  @override
+  ShutdownNotificationBuilder toBuilder() =>
+      new ShutdownNotificationBuilder()..replace(this);
+
+  @override
+  bool operator ==(Object other) {
+    if (identical(other, this)) return true;
+    return other is ShutdownNotification && message == other.message;
+  }
+
+  @override
+  int get hashCode {
+    return $jf($jc(0, message.hashCode));
+  }
+
+  @override
+  String toString() {
+    return (newBuiltValueToStringHelper('ShutdownNotification')
+          ..add('message', message))
+        .toString();
+  }
+}
+
+class ShutdownNotificationBuilder
+    implements Builder<ShutdownNotification, ShutdownNotificationBuilder> {
+  _$ShutdownNotification _$v;
+
+  String _message;
+  String get message => _$this._message;
+  set message(String message) => _$this._message = message;
+
+  ShutdownNotificationBuilder();
+
+  ShutdownNotificationBuilder get _$this {
+    if (_$v != null) {
+      _message = _$v.message;
+      _$v = null;
+    }
+    return this;
+  }
+
+  @override
+  void replace(ShutdownNotification other) {
+    if (other == null) {
+      throw new ArgumentError.notNull('other');
+    }
+    _$v = other as _$ShutdownNotification;
+  }
+
+  @override
+  void update(void updates(ShutdownNotificationBuilder b)) {
+    if (updates != null) updates(this);
+  }
+
+  @override
+  _$ShutdownNotification build() {
+    final _$result = _$v ?? new _$ShutdownNotification._(message: message);
+    replace(_$result);
+    return _$result;
+  }
+}
+
+// ignore_for_file: always_put_control_body_on_new_line,always_specify_types,annotate_overrides,avoid_annotating_with_dynamic,avoid_as,avoid_catches_without_on_clauses,avoid_returning_this,lines_longer_than_80_chars,omit_local_variable_types,prefer_expression_function_bodies,sort_constructors_first,test_types_in_equals,unnecessary_const,unnecessary_new
diff --git a/build_daemon/lib/src/daemon.dart b/build_daemon/lib/src/daemon.dart
index 0cb8c3a..e3bfad1 100644
--- a/build_daemon/lib/src/daemon.dart
+++ b/build_daemon/lib/src/daemon.dart
@@ -12,26 +12,34 @@
 import '../constants.dart';
 import '../daemon_builder.dart';
 import '../data/build_target.dart';
+import 'file_wait.dart';
 import 'server.dart';
 
 /// Returns the current version of the running build daemon.
 ///
 /// Null if one isn't running.
-String runningVersion(String workingDirectory) {
+Future<String> runningVersion(String workingDirectory) async {
   var versionFile = File(versionFilePath(workingDirectory));
-  if (!versionFile.existsSync()) return null;
+  if (!await waitForFile(versionFile)) return null;
   return versionFile.readAsStringSync();
 }
 
 /// Returns the current options of the running build daemon.
 ///
 /// Null if one isn't running.
-Set<String> currentOptions(String workingDirectory) {
+Future<Set<String>> currentOptions(String workingDirectory) async {
   var optionsFile = File(optionsFilePath(workingDirectory));
-  if (!optionsFile.existsSync()) return Set();
+  if (!await waitForFile(optionsFile)) return Set();
   return optionsFile.readAsLinesSync().toSet();
 }
 
+/// The long running daemon process.
+///
+/// Obtains a file lock to ensure a single instance and writes various status
+/// files to be used by clients for connection.
+///
+/// Also starts a [Server] to listen for build target registration and event
+/// notification.
 class Daemon {
   final String _workingDirectory;
 
@@ -45,6 +53,8 @@
 
   Future<void> get onDone => _doneCompleter.future;
 
+  Future<void> stop({String message}) => _server.stop(message: message);
+
   Future<void> start(
       Set<String> options, DaemonBuilder builder, Stream<WatchEvent> changes,
       {Serializers serializersOverride,
diff --git a/build_daemon/lib/src/fake_builder.dart b/build_daemon/lib/src/fake_builder.dart
new file mode 100644
index 0000000..988d635
--- /dev/null
+++ b/build_daemon/lib/src/fake_builder.dart
@@ -0,0 +1,26 @@
+// 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 'package:build_daemon/daemon_builder.dart';
+import 'package:build_daemon/data/build_status.dart';
+import 'package:build_daemon/data/build_target.dart';
+import 'package:build_daemon/data/server_log.dart';
+import 'package:watcher/src/watch_event.dart';
+
+class FakeDaemonBuilder implements DaemonBuilder {
+  @override
+  Stream<BuildResults> get builds => Stream.empty();
+
+  @override
+  Stream<ServerLog> get logs => Stream.empty();
+
+  @override
+  Future<void> build(
+      Set<BuildTarget> targets, Iterable<WatchEvent> changes) async {}
+
+  @override
+  Future<void> stop() async {}
+}
diff --git a/build_daemon/lib/src/file_wait.dart b/build_daemon/lib/src/file_wait.dart
new file mode 100644
index 0000000..f318103
--- /dev/null
+++ b/build_daemon/lib/src/file_wait.dart
@@ -0,0 +1,24 @@
+// 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 'dart:io';
+
+const _readDelay = Duration(milliseconds: 100);
+const _maxWait = Duration(seconds: 5);
+
+/// Returns true if the file exists.
+///
+/// If the file does not exist it keeps retrying for a period of time.
+/// Returns false if the file never becomes available.
+///
+/// This reduces the likelihood of race conditions.
+Future<bool> waitForFile(File file) async {
+  final end = DateTime.now().add(_maxWait);
+  while (!DateTime.now().isAfter(end)) {
+    if (file.existsSync()) return true;
+    await Future.delayed(_readDelay);
+  }
+  return file.existsSync();
+}
diff --git a/build_daemon/lib/src/managers/build_target_manager.dart b/build_daemon/lib/src/managers/build_target_manager.dart
index cca2214..965ace2 100644
--- a/build_daemon/lib/src/managers/build_target_manager.dart
+++ b/build_daemon/lib/src/managers/build_target_manager.dart
@@ -30,12 +30,18 @@
 
   Set<BuildTarget> get targets => _buildTargets.keys.toSet();
 
+  /// All the tracked channels.
+  Set<WebSocketChannel> get allChannels =>
+      _buildTargets.values.expand((s) => s).toSet();
+
+  /// Adds a tracked build target with corresponding interested channel.
   void addBuildTarget(BuildTarget target, WebSocketChannel channel) {
     _buildTargets
         .putIfAbsent(target, () => Set<WebSocketChannel>())
         .add(channel);
   }
 
+  /// Returns channels that are interested in the provided target.
   Set<WebSocketChannel> channels(BuildTarget target) =>
       _buildTargets[target] ?? Set();
 
diff --git a/build_daemon/lib/src/server.dart b/build_daemon/lib/src/server.dart
index fa563f5..a668894 100644
--- a/build_daemon/lib/src/server.dart
+++ b/build_daemon/lib/src/server.dart
@@ -19,8 +19,13 @@
 import '../data/build_target.dart';
 import '../data/build_target_request.dart';
 import '../data/serializers.dart';
+import '../data/shutdown_notification.dart';
 import 'managers/build_target_manager.dart';
 
+/// A server which communicates with build daemon clients over websockets.
+///
+/// Handles notifying clients of logs and results for registered build targets.
+/// Note the server will only notify clients of pertinent events.
 class Server {
   final _isDoneCompleter = Completer();
   final BuildTargetManager _buildTargetManager;
@@ -54,6 +59,7 @@
 
   Future<void> get onDone => _isDoneCompleter.future;
 
+  /// Starts listening for build daemon clients.
   Future<int> listen() async {
     var handler = webSocketHandler((WebSocketChannel channel) async {
       channel.stream.listen((message) async {
@@ -77,7 +83,12 @@
     return _server.port;
   }
 
-  Future<void> stop() async {
+  Future<void> stop({String message}) async {
+    if (message?.isNotEmpty ?? false) {
+      for (var connection in _buildTargetManager.allChannels) {
+        connection.sink.add(ShutdownNotification((b) => b.message));
+      }
+    }
     _timeout.cancel();
     await _server?.close(force: true);
     await _builder?.stop();
diff --git a/build_daemon/mono_pkg.yaml b/build_daemon/mono_pkg.yaml
index f6ff9a4..a4571f7 100644
--- a/build_daemon/mono_pkg.yaml
+++ b/build_daemon/mono_pkg.yaml
@@ -6,5 +6,8 @@
     - group:
       - dartfmt: sdk
       - dartanalyzer: --fatal-infos --fatal-warnings .
+    - dartanalyzer: --fatal-warnings .
+      dart:
+        - 2.1.0
   - unit_test:
     - command: pub run test
diff --git a/build_daemon/pubspec.yaml b/build_daemon/pubspec.yaml
index 36c2d00..f937905 100644
--- a/build_daemon/pubspec.yaml
+++ b/build_daemon/pubspec.yaml
@@ -1,5 +1,5 @@
 name: build_daemon
-version: 0.5.0
+version: 0.6.0
 description: A daemon for running Dart builds.
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/build/tree/master/build_daemon
diff --git a/build_modules/BUILD.gn b/build_modules/BUILD.gn
index 500e895..1db1579 100644
--- a/build_modules/BUILD.gn
+++ b/build_modules/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for build_modules-1.0.9
+# This file is generated by importer.py for build_modules-2.1.2
 
 import("//build/dart/dart_library.gni")
 
@@ -15,11 +15,13 @@
     "//third_party/dart-pkg/pub/pedantic",
     "//third_party/dart-pkg/pub/logging",
     "//third_party/dart-pkg/pub/glob",
-    "//third_party/dart-pkg/pub/analyzer",
+    "//third_party/dart-pkg/pub/crypto",
+    "//third_party/dart-pkg/pub/collection",
     "//third_party/dart-pkg/pub/graphs",
+    "//third_party/dart-pkg/pub/build",
     "//third_party/dart-pkg/pub/meta",
     "//third_party/dart-pkg/pub/scratch_space",
-    "//third_party/dart-pkg/pub/build",
+    "//third_party/dart-pkg/pub/analyzer",
     "//third_party/dart-pkg/pub/async",
     "//third_party/dart-pkg/pub/build_config",
     "//third_party/dart-pkg/pub/path",
diff --git a/build_modules/CHANGELOG.md b/build_modules/CHANGELOG.md
index 82418da..6583686 100644
--- a/build_modules/CHANGELOG.md
+++ b/build_modules/CHANGELOG.md
@@ -1,3 +1,47 @@
+## 2.1.2
+
+- Output additional `.module` files for all entrypoints to ease discovery of
+  modules for compilers.
+
+## 2.1.1
+
+- Allow `build_config` `0.4.x`.
+
+## 2.1.0
+
+- Make using the incremental compiler in the `KernelBuilder` configurable.
+
+## 2.0.0
+
+### Breaking Changes
+
+- Remove the `merge` method from `Module` and replace with a static
+  `Module.merge`. Module instances are now immutable.
+- Remove `jsId`, and `jsSourceMapId` from `Module`.
+- `DartPlatform` no longer has hard coded platforms, and its constructor is now
+  public. Anybody is now free to create their own `platform`.
+- Removed the platform specific builder factories from the `builders.dart` file.
+  - Packages that want to target compilation for a platform should create their
+    own builder factories.
+- Removed completely the analyzer based builders - `UnlinkedSummaryBuilder` and
+  `LinkedSummaryBuilder`.
+  - All backends should now be using the `KernelBuilder` instead.
+- Removed the default module builders for each supported platform. These
+  must now be created by the packages that want to add compilation targeting a
+  specific platform.
+  - This will help reduce asset graph bloat caused by platforms that you weren't
+    actually targeting.
+
+### Improvements
+
+- Update the kernel worker to pass input digests, along with
+  `--reuse-compiler-result` and `--use-incremental-compiler`.
+- Increased the upper bound for `package:analyzer` to `<0.37.0`.
+
+## 1.0.10
+
+- Fix a performance issue in the kernel_builder, especially for larger projects.
+
 ## 1.0.9
 
 - Allow configuring the platform SDK directory in the `KernelBuilder` builder.
diff --git a/build_modules/README.md b/build_modules/README.md
index 26ec288..3e98188 100644
--- a/build_modules/README.md
+++ b/build_modules/README.md
@@ -1,5 +1,3 @@
-# build_modules
-
 <p align="center">
   Module builders for web, used by <a href="https://pub.dartlang.org/packages/build_web_compilers"><code>package:build_web_compilers</code></a>.
   <br>
diff --git a/build_modules/build.yaml b/build_modules/build.yaml
index 0f051c4..a73fedf 100644
--- a/build_modules/build.yaml
+++ b/build_modules/build.yaml
@@ -10,58 +10,6 @@
     is_optional: True
     required_inputs: [".dart"]
     applies_builders: ["|module_cleanup"]
-  dartdevc:
-    import: "package:build_modules/builders.dart"
-    builder_factories:
-      - metaModuleBuilderFactoryForPlatform('dartdevc')
-      - metaModuleCleanBuilderFactoryForPlatform('dartdevc')
-      - moduleBuilderFactoryForPlatform('dartdevc')
-      - unlinkedSummaryBuilderForPlatform('dartdevc')
-      - linkedSummaryBuilderForPlatform('dartdevc')
-    build_extensions:
-      $lib$:
-        - .dartdevc.meta_module.raw
-        - .dartdevc.meta_module.clean
-      .dart:
-        - .dartdevc.module
-        - .dartdevc.linked.sum
-        - .dartdevc.unlinked.sum
-    is_optional: True
-    auto_apply: none
-    required_inputs: [".dart", ".module.library"]
-    applies_builders: ["|module_cleanup"]
-  dart2js:
-    import: "package:build_modules/builders.dart"
-    builder_factories:
-      - metaModuleBuilderFactoryForPlatform('dart2js')
-      - metaModuleCleanBuilderFactoryForPlatform('dart2js')
-      - moduleBuilderFactoryForPlatform('dart2js')
-    build_extensions:
-      $lib$:
-        - .dart2js.meta_module.raw
-        - .dart2js.meta_module.clean
-      .dart:
-        - .dart2js.module
-    is_optional: True
-    auto_apply: none
-    required_inputs: [".dart", ".module.library"]
-    applies_builders: ["|module_cleanup"]
-  vm:
-    import: "package:build_modules/builders.dart"
-    builder_factories:
-      - metaModuleBuilderFactoryForPlatform('vm')
-      - metaModuleCleanBuilderFactoryForPlatform('vm')
-      - moduleBuilderFactoryForPlatform('vm')
-    build_extensions:
-      $lib$:
-        - .vm.meta_module.raw
-        - .vm.meta_module.clean
-      .dart:
-        - .vm.module
-    is_optional: True
-    auto_apply: none
-    required_inputs: [".dart", ".module.library"]
-    applies_builders: ["|module_cleanup"]
 post_process_builders:
   module_cleanup:
     import: "package:build_modules/builders.dart"
diff --git a/build_modules/lib/build_modules.dart b/build_modules/lib/build_modules.dart
index 0d91310..809915c 100644
--- a/build_modules/lib/build_modules.dart
+++ b/build_modules/lib/build_modules.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.
 
-export 'src/errors.dart' show MissingModulesException;
+export 'src/errors.dart' show MissingModulesException, UnsupportedModules;
 export 'src/kernel_builder.dart' show KernelBuilder, multiRootScheme;
 export 'src/meta_module_builder.dart'
     show MetaModuleBuilder, metaModuleExtension;
@@ -14,11 +14,4 @@
 export 'src/modules.dart';
 export 'src/platform.dart' show DartPlatform;
 export 'src/scratch_space.dart' show scratchSpace, scratchSpaceResource;
-export 'src/summary_builder.dart'
-    show
-        LinkedSummaryBuilder,
-        UnlinkedSummaryBuilder,
-        linkedSummaryExtension,
-        unlinkedSummaryExtension;
-export 'src/workers.dart'
-    show dart2JsWorkerResource, dartdevcDriverResource, dartdevkDriverResource;
+export 'src/workers.dart' show dart2JsWorkerResource, dartdevkDriverResource;
diff --git a/build_modules/lib/builders.dart b/build_modules/lib/builders.dart
index 00719ea..4366a82 100644
--- a/build_modules/lib/builders.dart
+++ b/build_modules/lib/builders.dart
@@ -4,25 +4,9 @@
 
 import 'package:build/build.dart';
 import 'package:build_modules/build_modules.dart';
-import 'package:build_modules/src/meta_module_builder.dart';
-import 'package:build_modules/src/meta_module_clean_builder.dart';
 import 'package:build_modules/src/module_cleanup.dart';
 import 'package:build_modules/src/module_library_builder.dart';
 
-typedef Builder _BuilderFactory(BuilderOptions options);
-
 Builder moduleLibraryBuilder(_) => const ModuleLibraryBuilder();
 
-_BuilderFactory metaModuleBuilderFactoryForPlatform(String platform) =>
-    (BuilderOptions options) =>
-        MetaModuleBuilder.forOptions(DartPlatform(platform), options);
-_BuilderFactory metaModuleCleanBuilderFactoryForPlatform(String platform) =>
-    (_) => MetaModuleCleanBuilder(DartPlatform(platform));
-_BuilderFactory moduleBuilderFactoryForPlatform(String platform) =>
-    (_) => ModuleBuilder(DartPlatform(platform));
-_BuilderFactory unlinkedSummaryBuilderForPlatform(String platform) =>
-    (BuilderOptions options) => UnlinkedSummaryBuilder(DartPlatform(platform));
-_BuilderFactory linkedSummaryBuilderForPlatform(String platform) =>
-    (BuilderOptions options) => LinkedSummaryBuilder(DartPlatform(platform));
-
 PostProcessBuilder moduleCleanup(_) => const ModuleCleanup();
diff --git a/build_modules/lib/src/analysis_options.default.yaml b/build_modules/lib/src/analysis_options.default.yaml
deleted file mode 100644
index a10d4c5..0000000
--- a/build_modules/lib/src/analysis_options.default.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-analyzer:
-  strong-mode: true
diff --git a/build_modules/lib/src/errors.dart b/build_modules/lib/src/errors.dart
index 3b9ce33..752c36e 100644
--- a/build_modules/lib/src/errors.dart
+++ b/build_modules/lib/src/errors.dart
@@ -8,6 +8,8 @@
 import 'package:analyzer/analyzer.dart';
 import 'package:build/build.dart';
 
+import 'module_library.dart';
+import 'module_library_builder.dart';
 import 'modules.dart';
 
 /// An [Exception] that is thrown when a worker returns an error.
@@ -102,3 +104,36 @@
   var lineInfo = parsed.lineInfo.getLocation(import.offset);
   return '`$import` from $sourceId at $lineInfo';
 }
+
+/// An [Exception] that is thrown when there are some unsupported modules.
+class UnsupportedModules implements Exception {
+  final Set<Module> unsupportedModules;
+
+  UnsupportedModules(this.unsupportedModules);
+
+  Stream<ModuleLibrary> exactLibraries(AssetReader reader) async* {
+    for (var module in unsupportedModules) {
+      for (var source in module.sources) {
+        var libraryId = source.changeExtension(moduleLibraryExtension);
+        ModuleLibrary library;
+        if (await reader.canRead(libraryId)) {
+          library = ModuleLibrary.deserialize(
+              libraryId, await reader.readAsString(libraryId));
+        } else {
+          // A missing .module.library file indicates a part file, which can't
+          // have import statements, so we just skip them.
+          continue;
+        }
+        if (library.sdkDeps
+            .any((lib) => !module.platform.supportsLibrary(lib))) {
+          yield library;
+        }
+      }
+    }
+  }
+
+  @override
+  String toString() =>
+      'Some modules contained libraries that were incompatible '
+      'with the current platform.';
+}
diff --git a/build_modules/lib/src/kernel_builder.dart b/build_modules/lib/src/kernel_builder.dart
index d885452..7abdfe1 100644
--- a/build_modules/lib/src/kernel_builder.dart
+++ b/build_modules/lib/src/kernel_builder.dart
@@ -3,11 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:collection';
 import 'dart:convert';
 import 'dart:io';
 
 import 'package:bazel_worker/bazel_worker.dart';
 import 'package:build/build.dart';
+import 'package:crypto/crypto.dart';
+import 'package:graphs/graphs.dart' show crawlAsync;
 import 'package:meta/meta.dart';
 import 'package:path/path.dart' as p;
 import 'package:scratch_space/scratch_space.dart';
@@ -15,6 +18,7 @@
 import 'common.dart';
 import 'errors.dart';
 import 'module_builder.dart';
+import 'module_cache.dart';
 import 'modules.dart';
 import 'platform.dart';
 import 'scratch_space.dart';
@@ -30,6 +34,8 @@
   @override
   final Map<String, List<String>> buildExtensions;
 
+  final bool useIncrementalCompiler;
+
   final String outputExtension;
 
   final DartPlatform platform;
@@ -57,8 +63,10 @@
       @required this.summaryOnly,
       @required this.sdkKernelPath,
       @required this.outputExtension,
+      bool useIncrementalCompiler,
       String platformSdk})
       : platformSdk = platformSdk ?? sdkDir,
+        useIncrementalCompiler = useIncrementalCompiler ?? false,
         buildExtensions = {
           moduleExtension(platform): [outputExtension]
         };
@@ -74,8 +82,12 @@
           buildStep: buildStep,
           summaryOnly: summaryOnly,
           outputExtension: outputExtension,
+          platform: platform,
           dartSdkDir: platformSdk,
-          sdkKernelPath: sdkKernelPath);
+          sdkKernelPath: sdkKernelPath,
+          useIncrementalCompiler: useIncrementalCompiler);
+    } on MissingModulesException catch (e) {
+      log.severe(e.toString());
     } on KernelException catch (e, s) {
       log.severe(
           'Error creating '
@@ -92,8 +104,10 @@
     @required BuildStep buildStep,
     @required bool summaryOnly,
     @required String outputExtension,
+    @required DartPlatform platform,
     @required String dartSdkDir,
-    @required String sdkKernelPath}) async {
+    @required String sdkKernelPath,
+    @required bool useIncrementalCompiler}) async {
   var request = WorkRequest();
   var scratchSpace = await buildStep.fetchResource(scratchSpaceResource);
   var outputId = module.primarySource.changeExtension(outputExtension);
@@ -101,35 +115,39 @@
 
   File packagesFile;
 
-  {
-    var transitiveDeps = await module.computeTransitiveDependencies(buildStep);
-    var transitiveKernelDeps = <AssetId>[];
-    var transitiveSourceDeps = <AssetId>[];
+  await buildStep.trackStage('CollectDeps', () async {
+    var kernelDeps = <AssetId>[];
+    var sourceDeps = <AssetId>[];
 
-    await Future.wait(transitiveDeps.map((dep) => _addModuleDeps(
-        dep,
-        module,
-        transitiveKernelDeps,
-        transitiveSourceDeps,
-        buildStep,
-        outputExtension)));
+    await _findModuleDeps(
+        module, kernelDeps, sourceDeps, buildStep, outputExtension);
 
     var allAssetIds = Set<AssetId>()
       ..addAll(module.sources)
-      ..addAll(transitiveKernelDeps)
-      ..addAll(transitiveSourceDeps);
+      ..addAll(kernelDeps)
+      ..addAll(sourceDeps);
     await scratchSpace.ensureAssets(allAssetIds, buildStep);
 
     packagesFile = await createPackagesFile(allAssetIds);
 
-    _addRequestArguments(request, module, transitiveKernelDeps, dartSdkDir,
-        sdkKernelPath, outputFile, packagesFile, summaryOnly);
-  }
+    await _addRequestArguments(
+        request,
+        module,
+        kernelDeps,
+        platform,
+        sdkDir,
+        sdkKernelPath,
+        outputFile,
+        packagesFile,
+        summaryOnly,
+        useIncrementalCompiler,
+        buildStep);
+  });
 
   // We need to make sure and clean up the temp dir, even if we fail to compile.
   try {
-    var analyzer = await buildStep.fetchResource(frontendDriverResource);
-    var response = await analyzer.doWork(request,
+    var frontendWorker = await buildStep.fetchResource(frontendDriverResource);
+    var response = await frontendWorker.doWork(request,
         trackWork: (response) => buildStep
             .trackStage('Kernel Generate', () => response, isExternal: true));
     if (response.exitCode != EXIT_CODE_OK || !await outputFile.exists()) {
@@ -148,42 +166,107 @@
   }
 }
 
-/// Adds the source or kernel dependencies for [dependency] to
-/// [transitiveKernelDeps] or [transitiveSourceDeps].
-Future<void> _addModuleDeps(
-    Module dependency,
+/// Finds the transitive dependencies of [root] and categorizes them as
+/// [kernelDeps] or [sourceDeps].
+///
+/// A module will have it's kernel file in [kernelDeps] if it and all of it's
+/// transitive dependencies have readable kernel files. If any module has no
+/// readable kernel file then it, and all of it's dependents will be categorized
+/// as [sourceDeps] which will have all of their [Module.sources].
+Future<void> _findModuleDeps(
     Module root,
-    List<AssetId> transitiveKernelDeps,
-    List<AssetId> transitiveSourceDeps,
+    List<AssetId> kernelDeps,
+    List<AssetId> sourceDeps,
     BuildStep buildStep,
     String outputExtension) async {
-  var kernelId = dependency.primarySource.changeExtension(outputExtension);
-  if (await buildStep.canRead(kernelId)) {
-    // If we can read the kernel file, but it depends on any module in this
-    // package, then we need to only provide sources for that file since its
-    // dependencies in this package will only be providing sources as well.
-    if ((await dependency.computeTransitiveDependencies(buildStep))
-        .any((m) => m.primarySource.package == root.primarySource.package)) {
-      transitiveSourceDeps.addAll(dependency.sources);
+  final resolvedModules = await _resolveTransitiveModules(root, buildStep);
+
+  final sourceOnly = await _parentsOfMissingKernelFiles(
+      resolvedModules, buildStep, outputExtension);
+
+  for (final module in resolvedModules) {
+    if (sourceOnly.contains(module.primarySource)) {
+      sourceDeps.addAll(module.sources);
     } else {
-      transitiveKernelDeps.add(kernelId);
+      kernelDeps.add(module.primarySource.changeExtension(outputExtension));
     }
-  } else {
-    transitiveSourceDeps.addAll(dependency.sources);
   }
 }
 
+/// The transitive dependencies of [root], not including [root] itself.
+Future<List<Module>> _resolveTransitiveModules(
+    Module root, BuildStep buildStep) async {
+  var missing = Set<AssetId>();
+  var modules = await crawlAsync<AssetId, Module>(
+          [root.primarySource],
+          (id) => buildStep.fetchResource(moduleCache).then((c) async {
+                var moduleId =
+                    id.changeExtension(moduleExtension(root.platform));
+                var module = await c.find(moduleId, buildStep);
+                if (module == null) {
+                  missing.add(moduleId);
+                } else if (module.isMissing) {
+                  missing.add(module.primarySource);
+                }
+                return module;
+              }),
+          (id, module) => module.directDependencies)
+      .skip(1) // Skip the root.
+      .toList();
+
+  if (missing.isNotEmpty) {
+    throw await MissingModulesException.create(
+        missing, modules.toList()..add(root), buildStep);
+  }
+
+  return modules;
+}
+
+/// Finds the primary source of all transitive parents of any module which does
+/// not have a readable kernel file.
+///
+/// Inverts the direction of the graph and then crawls to all reachables nodes
+/// from the modules which do not have a readable kernel file
+Future<Set<AssetId>> _parentsOfMissingKernelFiles(
+    List<Module> modules, BuildStep buildStep, String outputExtension) async {
+  final sourceOnly = Set<AssetId>();
+  final parents = <AssetId, Set<AssetId>>{};
+  for (final module in modules) {
+    for (final dep in module.directDependencies) {
+      parents.putIfAbsent(dep, () => Set<AssetId>()).add(module.primarySource);
+    }
+    if (!await buildStep
+        .canRead(module.primarySource.changeExtension(outputExtension))) {
+      sourceOnly.add(module.primarySource);
+    }
+  }
+  final toCrawl = Queue.of(sourceOnly);
+  while (toCrawl.isNotEmpty) {
+    final current = toCrawl.removeFirst();
+    if (!parents.containsKey(current)) continue;
+    for (final next in parents[current]) {
+      if (!sourceOnly.add(next)) {
+        toCrawl.add(next);
+      }
+    }
+  }
+  return sourceOnly;
+}
+
 /// Fills in all the required arguments for [request] in order to compile the
 /// kernel file for [module].
-void _addRequestArguments(
+Future<void> _addRequestArguments(
     WorkRequest request,
     Module module,
     Iterable<AssetId> transitiveKernelDeps,
+    DartPlatform platform,
     String sdkDir,
     String sdkKernelPath,
     File outputFile,
     File packagesFile,
-    bool summaryOnly) {
+    bool summaryOnly,
+    bool useIncrementalCompiler,
+    AssetReader reader) async {
   request.arguments.addAll([
     '--dart-sdk-summary',
     Uri.file(p.join(sdkDir, sdkKernelPath)).toString(),
@@ -195,18 +278,33 @@
     multiRootScheme,
     '--exclude-non-sources',
     summaryOnly ? '--summary-only' : '--no-summary-only',
+    '--libraries-file',
+    p.toUri(p.join(sdkDir, 'lib', 'libraries.json')).toString(),
   ]);
+  if (useIncrementalCompiler) {
+    request.arguments.addAll([
+      '--reuse-compiler-result',
+      '--use-incremental-compiler',
+    ]);
+  }
 
-  // Add all summaries as summary inputs.
-  request.arguments.addAll(transitiveKernelDeps.map((id) {
+  request.inputs.add(Input()
+    ..path = '${Uri.file(p.join(sdkDir, sdkKernelPath))}'
+    // Sdk updates fully invalidate the build anyways.
+    ..digest = md5.convert(utf8.encode(platform.name)).bytes);
+
+  // Add all kernel outlines as summary inputs, with digests.
+  var inputs = await Future.wait(transitiveKernelDeps.map((id) async {
     var relativePath = p.url.relative(scratchSpace.fileFor(id).uri.path,
         from: scratchSpace.tempDir.uri.path);
-    if (summaryOnly) {
-      return '--input-summary=$multiRootScheme:///$relativePath';
-    } else {
-      return '--input-linked=$multiRootScheme:///$relativePath';
-    }
+
+    return Input()
+      ..path = '$multiRootScheme:///$relativePath'
+      ..digest = (await reader.digest(id)).bytes;
   }));
+  request.arguments.addAll(inputs
+      .map((i) => '--input-${summaryOnly ? 'summary' : 'linked'}=${i.path}'));
+  request.inputs.addAll(inputs);
 
   request.arguments.addAll(module.sources.map((id) {
     var uri = id.path.startsWith('lib')
diff --git a/build_modules/lib/src/meta_module.dart b/build_modules/lib/src/meta_module.dart
index 39bff4c..185fef5 100644
--- a/build_modules/lib/src/meta_module.dart
+++ b/build_modules/lib/src/meta_module.dart
@@ -55,11 +55,6 @@
   return Module(primaryId, sources, directDependencies, platform, isSupported);
 }
 
-Map<AssetId, Module> _entryPointModules(
-        Iterable<Module> modules, Set<AssetId> entrypoints) =>
-    Map.fromIterable(modules.where((m) => m.sources.any(entrypoints.contains)),
-        key: (m) => (m as Module).primarySource);
-
 /// Gets the local (same top level dir of the same package) transitive deps of
 /// [module] using [assetsToModules].
 Set<AssetId> _localTransitiveDeps(
@@ -113,22 +108,26 @@
 ///   * Else merge it into with others that are depended on by the same set of
 ///   entrypoints
 List<Module> _mergeModules(Iterable<Module> modules, Set<AssetId> entrypoints) {
-  // Modules which have any entrypoing keyed by primary source.
-  var entrypointModules = _entryPointModules(modules, entrypoints);
+  var entrypointModules =
+      modules.where((m) => m.sources.any(entrypoints.contains)).toList();
+
+  // Groups of modules that can be merged into an existing entrypoint module.
+  var entrypointModuleGroups = Map.fromIterable(entrypointModules,
+      key: (m) => (m as Module).primarySource, value: (m) => [m as Module]);
 
   // Maps modules to entrypoint modules that transitively depend on them.
   var modulesToEntryPoints =
-      _findReverseEntrypointDeps(entrypointModules.values, modules);
+      _findReverseEntrypointDeps(entrypointModules, modules);
 
   // Modules which are not depended on by any entrypoint
   var standaloneModules = <Module>[];
 
   // Modules which are merged with others.
-  var mergedModules = <String, Module>{};
+  var mergedModules = <String, List<Module>>{};
 
   for (var module in modules) {
     // Skip entrypoint modules.
-    if (entrypointModules.containsKey(module.primarySource)) continue;
+    if (entrypointModuleGroups.containsKey(module.primarySource)) continue;
 
     // The entry points that transitively import this module.
     var entrypointIds = modulesToEntryPoints[module.primarySource];
@@ -143,19 +142,16 @@
     // a new shared module. Use `$` to signal that it is a shared module.
     if (entrypointIds.length > 1) {
       var mId = (entrypointIds.toList()..sort()).map((m) => m.path).join('\$');
-      if (mergedModules.containsKey(mId)) {
-        mergedModules[mId].merge(module);
-      } else {
-        mergedModules[mId] = module;
-      }
+      mergedModules.putIfAbsent(mId, () => []).add(module);
     } else {
-      entrypointModules[entrypointIds.single].merge(module);
+      entrypointModuleGroups[entrypointIds.single].add(module);
     }
   }
 
   return mergedModules.values
+      .map(Module.merge)
       .map(_withConsistentPrimarySource)
-      .followedBy(entrypointModules.values)
+      .followedBy(entrypointModuleGroups.values.map(Module.merge))
       .followedBy(standaloneModules)
       .toList();
 }
@@ -208,7 +204,7 @@
   @JsonKey(name: 'm', nullable: false)
   final List<Module> modules;
 
-  MetaModule(this.modules);
+  MetaModule(List<Module> modules) : modules = List.unmodifiable(modules);
 
   /// Generated factory constructor.
   factory MetaModule.fromJson(Map<String, dynamic> json) =>
diff --git a/build_modules/lib/src/meta_module_clean_builder.dart b/build_modules/lib/src/meta_module_clean_builder.dart
index 6530f94..590a6a4 100644
--- a/build_modules/lib/src/meta_module_clean_builder.dart
+++ b/build_modules/lib/src/meta_module_clean_builder.dart
@@ -11,6 +11,7 @@
 
 import 'meta_module.dart';
 import 'meta_module_builder.dart';
+import 'module_cache.dart';
 import 'modules.dart';
 import 'platform.dart';
 
@@ -93,9 +94,8 @@
   var dependentModules = Set<Module>();
   // Ensures we only process a meta file once.
   var seenMetas = Set<AssetId>()..add(metaAsset);
-  var meta = MetaModule.fromJson(
-      jsonDecode(await buildStep.readAsString(buildStep.inputId))
-          as Map<String, dynamic>);
+  var metaModules = await buildStep.fetchResource(metaModuleCache);
+  var meta = await metaModules.find(buildStep.inputId, buildStep);
   var nextModules = List.of(meta.modules);
   while (nextModules.isNotEmpty) {
     var module = nextModules.removeLast();
@@ -122,9 +122,7 @@
             'on it in your pubspec.');
         continue;
       }
-      var depMeta = MetaModule.fromJson(
-          jsonDecode(await buildStep.readAsString(depMetaAsset))
-              as Map<String, dynamic>);
+      var depMeta = await metaModules.find(depMetaAsset, buildStep);
       nextModules.addAll(depMeta.modules);
     }
   }
diff --git a/build_modules/lib/src/module_builder.dart b/build_modules/lib/src/module_builder.dart
index 3f4ca61..2e4403b 100644
--- a/build_modules/lib/src/module_builder.dart
+++ b/build_modules/lib/src/module_builder.dart
@@ -5,43 +5,18 @@
 import 'dart:async';
 import 'dart:convert';
 
-import 'package:async/async.dart';
 import 'package:build/build.dart';
 
-import 'meta_module.dart';
 import 'meta_module_clean_builder.dart';
+import 'module_cache.dart';
+import 'module_library.dart';
+import 'module_library_builder.dart' show moduleLibraryExtension;
 import 'modules.dart';
 import 'platform.dart';
 
 /// The extension for serialized module assets.
 String moduleExtension(DartPlatform platform) => '.${platform.name}.module';
 
-/// A [Resource] that provides a [_CleanMetaModuleCache].
-final _cleanMetaModules = Resource<_CleanMetaModuleCache>(
-    () => _CleanMetaModuleCache(),
-    dispose: (c) => c.dispose());
-
-/// Safely caches deserialized [MetaModule] objects by their [AssetId].
-///
-/// Tracks access to assets via [BuildStep.canRead] calls.
-class _CleanMetaModuleCache {
-  final _modules = <AssetId, Future<Result<MetaModule>>>{};
-
-  void dispose() => _modules.clear();
-
-  Future<MetaModule> find(
-      DartPlatform platform, String package, AssetReader reader) async {
-    var cleanMetaAsset =
-        AssetId(package, 'lib/${metaModuleCleanExtension(platform)}');
-    if (!await reader.canRead(cleanMetaAsset)) return null;
-    var metaResult = _modules.putIfAbsent(
-        cleanMetaAsset,
-        () => Result.capture(reader.readAsString(cleanMetaAsset).then((c) =>
-            MetaModule.fromJson(jsonDecode(c) as Map<String, dynamic>))));
-    return Result.release(metaResult);
-  }
-}
-
 /// Creates `.module` files for any `.dart` file that is the primary dart
 /// source of a [Module].
 class ModuleBuilder implements Builder {
@@ -57,12 +32,24 @@
 
   @override
   Future build(BuildStep buildStep) async {
-    var cleanMetaModules = await buildStep.fetchResource(_cleanMetaModules);
-    var metaModule = await cleanMetaModules.find(
-        _platform, buildStep.inputId.package, buildStep);
-    final outputModule = metaModule.modules.firstWhere(
+    final cleanMetaModules = await buildStep.fetchResource(metaModuleCache);
+    final metaModule = await cleanMetaModules.find(
+        AssetId(buildStep.inputId.package,
+            'lib/${metaModuleCleanExtension(_platform)}'),
+        buildStep);
+    var outputModule = metaModule.modules.firstWhere(
         (m) => m.primarySource == buildStep.inputId,
         orElse: () => null);
+    if (outputModule == null) {
+      final serializedLibrary = await buildStep.readAsString(
+          buildStep.inputId.changeExtension(moduleLibraryExtension));
+      final libraryModule =
+          ModuleLibrary.deserialize(buildStep.inputId, serializedLibrary);
+      if (libraryModule.isEntryPoint) {
+        outputModule = metaModule.modules
+            .firstWhere((m) => m.sources.contains(buildStep.inputId));
+      }
+    }
     if (outputModule == null) return;
     await buildStep.writeAsString(
         buildStep.inputId.changeExtension(moduleExtension(_platform)),
diff --git a/build_modules/lib/src/module_cache.dart b/build_modules/lib/src/module_cache.dart
new file mode 100644
index 0000000..44a54b8
--- /dev/null
+++ b/build_modules/lib/src/module_cache.dart
@@ -0,0 +1,55 @@
+// 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:convert';
+
+import 'package:async/async.dart';
+import 'package:build/build.dart';
+
+import 'meta_module.dart';
+import 'modules.dart';
+
+final metaModuleCache = DecodingCache.resource((m) => MetaModule.fromJson(m));
+
+final moduleCache = DecodingCache.resource((m) => Module.fromJson(m));
+
+/// A cache of objects decoded from written assets suitable for use as a
+/// [Resource].
+///
+/// Instances that are decoded will be cached throughout the duration of a build
+/// and invalidated between builds. Instances that are shared through the cache
+/// should be treated as immutable to avoid leaking any information which was
+/// not loaded from the underlying asset.
+class DecodingCache<T> {
+  /// Create a [Resource] which can decoded instances of [T] serialized via json
+  /// to assets.
+  static Resource<DecodingCache<T>> resource<T>(
+          T Function(Map<String, dynamic>) _fromJson) =>
+      Resource<DecodingCache<T>>(() => DecodingCache._(_fromJson),
+          dispose: (c) => c._dispose());
+
+  final _cached = <AssetId, Future<Result<T>>>{};
+
+  final T Function(Map<String, dynamic>) _fromJson;
+
+  DecodingCache._(this._fromJson);
+
+  void _dispose() => _cached.clear();
+
+  /// Find and deserialize a [T] stored in [id].
+  ///
+  /// If the asset at [id] is unreadable the returned future will resolve to
+  /// `null`. If the instance is cached it will not be decoded again, but the
+  /// content dependencies will be tracked through [reader].
+  Future<T> find(AssetId id, AssetReader reader) async {
+    if (!await reader.canRead(id)) return null;
+    var result = _cached.putIfAbsent(
+        id,
+        () => Result.capture(reader
+            .readAsString(id)
+            .then((c) => jsonDecode(c) as Map<String, dynamic>)
+            .then(_fromJson)));
+    return Result.release(result);
+  }
+}
diff --git a/build_modules/lib/src/module_cleanup.dart b/build_modules/lib/src/module_cleanup.dart
index 8d7f9f5..ff1af73 100644
--- a/build_modules/lib/src/module_cleanup.dart
+++ b/build_modules/lib/src/module_cleanup.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-
 import 'package:build/build.dart';
 
 import 'module_library_builder.dart';
@@ -12,9 +10,8 @@
   const ModuleCleanup();
 
   @override
-  FutureOr<Null> build(PostProcessBuildStep buildStep) {
+  void build(PostProcessBuildStep buildStep) {
     buildStep.deletePrimaryInput();
-    return null;
   }
 
   @override
@@ -23,7 +20,5 @@
     '.meta_module.raw',
     '.meta_module.clean',
     '.module',
-    '.linked.sum',
-    '.unlinked.sum'
   ];
 }
diff --git a/build_modules/lib/src/modules.dart b/build_modules/lib/src/modules.dart
index a6af2e8..efbda5c 100644
--- a/build_modules/lib/src/modules.dart
+++ b/build_modules/lib/src/modules.dart
@@ -3,43 +3,57 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:convert';
+import 'dart:collection';
 
 import 'package:build/build.dart';
+import 'package:collection/collection.dart' show UnmodifiableSetView;
 import 'package:graphs/graphs.dart';
 import 'package:json_annotation/json_annotation.dart';
 
 import 'errors.dart';
 import 'module_builder.dart';
+import 'module_cache.dart';
 import 'platform.dart';
-import 'summary_builder.dart';
 
 part 'modules.g.dart';
 
-/// A collection of Dart libraries in a strongly connected component and the
-/// modules they depend on.
+/// A collection of Dart libraries in a strongly connected component of the
+/// import graph.
 ///
+/// Modules track their sources and the other modules they depend on.
+/// modules they depend on.
 /// Modules can span pub package boundaries when there are import cycles across
 /// packages.
 @JsonSerializable()
 @_AssetIdConverter()
 @_DartPlatformConverter()
 class Module {
-  /// The JS file for this module.
-  AssetId jsId(String jsModuleExtension) =>
-      primarySource.changeExtension(jsModuleExtension);
+  /// Merge the sources and dependencies from [modules] into a single module.
+  ///
+  /// All modules must have the same [platform].
+  /// [primarySource] will be the earliest value from the combined [sources] if
+  /// they were sorted.
+  /// [isMissing] will be true if any input module is missing.
+  /// [isSupported] will be true if all input modules are supported.
+  /// [directDependencies] will be merged for all modules, but if any module
+  /// depended on a source from any other they will be filtered out.
+  static Module merge(List<Module> modules) {
+    assert(modules.isNotEmpty);
+    if (modules.length == 1) return modules.single;
+    assert(modules.every((m) => m.platform == modules.first.platform));
 
-  // The sourcemap for the JS file for this module.
-  AssetId jsSourceMapId(String jsSourceMapExtension) =>
-      primarySource.changeExtension(jsSourceMapExtension);
-
-  /// The linked summary for this module.
-  AssetId get linkedSummaryId =>
-      primarySource.changeExtension(linkedSummaryExtension(platform));
-
-  /// The unlinked summary for this module.
-  AssetId get unlinkedSummaryId =>
-      primarySource.changeExtension(unlinkedSummaryExtension(platform));
+    final allSources = HashSet.of(modules.expand((m) => m.sources));
+    final allDependencies =
+        HashSet.of(modules.expand((m) => m.directDependencies))
+          ..removeAll(allSources);
+    final primarySource =
+        allSources.reduce((a, b) => a.compareTo(b) < 0 ? a : b);
+    final isMissing = modules.any((m) => m.isMissing);
+    final isSupported = modules.every((m) => m.isSupported);
+    return Module(primarySource, allSources, allDependencies,
+        modules.first.platform, isSupported,
+        isMissing: isMissing);
+  }
 
   /// The library which will be used to reference any library in [sources].
   ///
@@ -70,12 +84,12 @@
   /// Libraries `foo` and `bar` form an import cycle so they would be grouped in
   /// the same module. Every Dart library will only be contained in a single
   /// [Module].
-  @JsonKey(name: 's', nullable: false)
+  @JsonKey(name: 's', nullable: false, toJson: _toJsonAssetIds)
   final Set<AssetId> sources;
 
   /// The [primarySource]s of the [Module]s which contain any library imported
   /// from any of the [sources] in this module.
-  @JsonKey(name: 'd', nullable: false)
+  @JsonKey(name: 'd', nullable: false, toJson: _toJsonAssetIds)
   final Set<AssetId> directDependencies;
 
   /// Missing modules are created if a module depends on another non-existent
@@ -105,8 +119,9 @@
   Module(this.primarySource, Iterable<AssetId> sources,
       Iterable<AssetId> directDependencies, this.platform, this.isSupported,
       {bool isMissing})
-      : sources = sources.toSet(),
-        directDependencies = directDependencies.toSet(),
+      : sources = UnmodifiableSetView(HashSet.of(sources)),
+        directDependencies =
+            UnmodifiableSetView(HashSet.of(directDependencies)),
         isMissing = isMissing ?? false;
 
   /// Generated factory constructor.
@@ -119,32 +134,39 @@
   ///
   /// Throws a [MissingModulesException] if there are any missing modules. This
   /// typically means that somebody is trying to import a non-existing file.
-  Future<List<Module>> computeTransitiveDependencies(AssetReader reader) async {
+  ///
+  /// If [throwIfUnsupported] is `true`, then an [UnsupportedModules]
+  /// will be thrown if there are any modules that are not supported.
+  Future<List<Module>> computeTransitiveDependencies(BuildStep buildStep,
+      {bool throwIfUnsupported = false}) async {
+    throwIfUnsupported ??= false;
+    final modules = await buildStep.fetchResource(moduleCache);
     var transitiveDeps = <AssetId, Module>{};
     var modulesToCrawl = directDependencies.toSet();
     var missingModuleSources = Set<AssetId>();
+    var unsupportedModules = Set<Module>();
     while (modulesToCrawl.isNotEmpty) {
       var next = modulesToCrawl.last;
       modulesToCrawl.remove(next);
       if (transitiveDeps.containsKey(next)) continue;
       var nextModuleId = next.changeExtension(moduleExtension(platform));
-      if (!await reader.canRead(nextModuleId)) {
+      var module = await modules.find(nextModuleId, buildStep);
+      if (module == null || module.isMissing) {
         missingModuleSources.add(next);
         continue;
       }
-      var module = Module.fromJson(
-          json.decode(await reader.readAsString(nextModuleId))
-              as Map<String, dynamic>);
-      if (module.isMissing) {
-        missingModuleSources.add(module.primarySource);
-        continue;
+      if (throwIfUnsupported && !module.isSupported) {
+        unsupportedModules.add(module);
       }
       transitiveDeps[next] = module;
       modulesToCrawl.addAll(module.directDependencies);
     }
     if (missingModuleSources.isNotEmpty) {
       throw await MissingModulesException.create(missingModuleSources,
-          transitiveDeps.values.toList()..add(this), reader);
+          transitiveDeps.values.toList()..add(this), buildStep);
+    }
+    if (throwIfUnsupported && unsupportedModules.isNotEmpty) {
+      throw UnsupportedModules(unsupportedModules);
     }
     var orderedModules = stronglyConnectedComponents<Module>(
         transitiveDeps.values,
@@ -153,15 +175,6 @@
         hashCode: (m) => m.primarySource.hashCode);
     return orderedModules.map((c) => c.single).toList();
   }
-
-  /// Add all of [other]'s source and dependencies to this module and keep this
-  /// module's primary source.
-  void merge(Module other) {
-    sources.addAll(other.sources);
-    directDependencies
-      ..addAll(other.directDependencies)
-      ..removeAll(sources);
-  }
 }
 
 class _AssetIdConverter implements JsonConverter<AssetId, List> {
@@ -178,8 +191,13 @@
   const _DartPlatformConverter();
 
   @override
-  DartPlatform fromJson(String json) => DartPlatform(json);
+  DartPlatform fromJson(String json) => DartPlatform.byName(json);
 
   @override
   String toJson(DartPlatform object) => object.name;
 }
+
+/// Ensure sets of asset IDs are sorted before writing them for a consistent
+/// output.
+List<List> _toJsonAssetIds(Set<AssetId> ids) =>
+    (ids.toList()..sort()).map((i) => i.serialize() as List).toList();
diff --git a/build_modules/lib/src/modules.g.dart b/build_modules/lib/src/modules.g.dart
index c6ed2e4..bf0bf70 100644
--- a/build_modules/lib/src/modules.g.dart
+++ b/build_modules/lib/src/modules.g.dart
@@ -20,10 +20,8 @@
 
 Map<String, dynamic> _$ModuleToJson(Module instance) => <String, dynamic>{
       'p': const _AssetIdConverter().toJson(instance.primarySource),
-      's': instance.sources.map(const _AssetIdConverter().toJson).toList(),
-      'd': instance.directDependencies
-          .map(const _AssetIdConverter().toJson)
-          .toList(),
+      's': _toJsonAssetIds(instance.sources),
+      'd': _toJsonAssetIds(instance.directDependencies),
       'm': instance.isMissing,
       'is': instance.isSupported,
       'pf': const _DartPlatformConverter().toJson(instance.platform)
diff --git a/build_modules/lib/src/platform.dart b/build_modules/lib/src/platform.dart
index 7f64f32..c74e47a 100644
--- a/build_modules/lib/src/platform.dart
+++ b/build_modules/lib/src/platform.dart
@@ -2,109 +2,48 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// A supported platform for compilation of Dart libraries, including knowledge
-/// of which core libraries are supported.
+/// A supported "platform" for compilation of Dart libraries.
+///
+/// Each "platform" has its own compilation pipeline and builders, and could
+/// differ from other platforms in many ways:
+///
+/// - The core libs that are supported
+/// - The implementations of the core libs
+/// - The compilation steps that are required (frontends or backends could be
+///   different).
+///
+/// Typically these should correspond to `libraries.json` files in the SDK.
+///
+/// New platforms should be created with [register], and can later be
+/// fetched by name using the [DartPlatform.byName] static method.
 class DartPlatform {
+  /// A list of all registered platforms by name, populated by
+  /// [register].
+  static final _platformsByName = <String, DartPlatform>{};
+
   final List<String> _supportedLibraries;
 
   final String name;
 
-  static const dartdevc = DartPlatform._('dartdevc', [
-    'async',
-    'collection',
-    'convert',
-    'core',
-    'developer',
-    'html',
-    'html_common',
-    'indexed_db',
-    'js',
-    'js_util',
-    'math',
-    'svg',
-    'typed_data',
-    'web_audio',
-    'web_gl',
-    'web_sql',
-  ]);
-  static const dart2js = DartPlatform._('dart2js', [
-    'async',
-    'collection',
-    'convert',
-    'core',
-    'developer',
-    'html',
-    'html_common',
-    'indexed_db',
-    'js',
-    'js_util',
-    'math',
-    'svg',
-    'typed_data',
-    'web_audio',
-    'web_gl',
-    'web_sql',
-  ]);
-  static const dart2jsServer = DartPlatform._('dart2js_server', [
-    'async',
-    'collection',
-    'convert',
-    'core',
-    'developer',
-    'js',
-    'js_util',
-    'math',
-    'typed_data',
-  ]);
-  static const flutter = DartPlatform._('flutter', [
-    'async',
-    'cli',
-    'collection',
-    'convert',
-    'core',
-    'developer',
-    'io',
-    'isolate',
-    'math',
-    'nativewrappers',
-    'profiler',
-    'typed_data',
-    'ui',
-    'vmservice_io',
-  ]);
-  static const vm = DartPlatform._('vm', [
-    'async',
-    'cli',
-    'collection',
-    'convert',
-    'core',
-    'developer',
-    'io',
-    'isolate',
-    'math',
-    'mirrors',
-    'nativewrappers',
-    'profiler',
-    'typed_data',
-    'vmservice_io',
-  ]);
+  /// Returns a [DartPlatform] instance by name.
+  ///
+  /// Throws an [UnrecognizedDartPlatform] if [name] has not been
+  /// registered with [DartPlatform.register].
+  static DartPlatform byName(String name) =>
+      _platformsByName[name] ?? (throw UnrecognizedDartPlatform(name));
 
-  factory DartPlatform(String name) {
-    var platform = _byName[name];
-    if (platform == null) {
-      throw ArgumentError('Unrecognized paltform $name, the recognized '
-          'platforms are ${_byName.keys.join(', ')}.');
+  /// Registers a new [DartPlatform].
+  ///
+  /// Throws a [DartPlatformAlreadyRegistered] if [name] has already
+  /// been registered by somebody else.
+  static DartPlatform register(String name, List<String> supportedLibraries) {
+    if (_platformsByName.containsKey(name)) {
+      throw DartPlatformAlreadyRegistered(name);
     }
-    return platform;
-  }
 
-  static const _byName = {
-    'dart2js': dart2js,
-    'dart2js_server': dart2jsServer,
-    'dartdevc': dartdevc,
-    'flutter': flutter,
-    'vm': vm
-  };
+    return _platformsByName[name] =
+        DartPlatform._(name, List.unmodifiable(supportedLibraries));
+  }
 
   const DartPlatform._(this.name, this._supportedLibraries);
 
@@ -120,3 +59,22 @@
   @override
   bool operator ==(other) => other is DartPlatform && other.name == name;
 }
+
+class DartPlatformAlreadyRegistered implements Exception {
+  final String name;
+
+  const DartPlatformAlreadyRegistered(this.name);
+
+  @override
+  String toString() => 'The platform `$name`, has already been registered.';
+}
+
+class UnrecognizedDartPlatform implements Exception {
+  final String name;
+
+  const UnrecognizedDartPlatform(this.name);
+
+  @override
+  String toString() => 'Unrecognized platform `$name`, it must be registered '
+      'first using `DartPlatform.register`';
+}
diff --git a/build_modules/lib/src/scratch_space.dart b/build_modules/lib/src/scratch_space.dart
index 1e00a10..6149341 100644
--- a/build_modules/lib/src/scratch_space.dart
+++ b/build_modules/lib/src/scratch_space.dart
@@ -29,8 +29,6 @@
 }, beforeExit: () async {
   // The workers are running inside the scratch space, so wait for them to
   // shut down before deleting it.
-  await analyzerWorkersAreDone;
-  await dartdevcWorkersAreDone;
   await dartdevkWorkersAreDone;
   await frontendWorkersAreDone;
   await dart2jsWorkersAreDone;
diff --git a/build_modules/lib/src/summary_builder.dart b/build_modules/lib/src/summary_builder.dart
deleted file mode 100644
index 238cdb5..0000000
--- a/build_modules/lib/src/summary_builder.dart
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:convert';
-
-import 'package:bazel_worker/bazel_worker.dart';
-import 'package:build/build.dart';
-import 'package:scratch_space/scratch_space.dart';
-
-import 'common.dart';
-import 'errors.dart';
-import 'module_builder.dart';
-import 'modules.dart';
-import 'platform.dart';
-import 'scratch_space.dart';
-import 'workers.dart';
-
-String linkedSummaryExtension(DartPlatform platform) =>
-    '.${platform.name}.linked.sum';
-String unlinkedSummaryExtension(DartPlatform platform) =>
-    '.${platform.name}.unlinked.sum';
-
-/// A builder which can output unlinked summaries!
-class UnlinkedSummaryBuilder implements Builder {
-  UnlinkedSummaryBuilder(DartPlatform platform)
-      : buildExtensions = {
-          moduleExtension(platform): [unlinkedSummaryExtension(platform)]
-        };
-
-  @override
-  final Map<String, List<String>> buildExtensions;
-
-  @override
-  Future build(BuildStep buildStep) async {
-    var module = Module.fromJson(
-        json.decode(await buildStep.readAsString(buildStep.inputId))
-            as Map<String, dynamic>);
-    try {
-      await _createUnlinkedSummary(module, buildStep);
-    } on AnalyzerSummaryException catch (e) {
-      log.severe('Error creating ${module.unlinkedSummaryId}:\n$e');
-    }
-  }
-}
-
-/// A builder which can output linked summaries!
-class LinkedSummaryBuilder implements Builder {
-  LinkedSummaryBuilder(DartPlatform platform)
-      : buildExtensions = {
-          moduleExtension(platform): [linkedSummaryExtension(platform)]
-        };
-
-  @override
-  final Map<String, List<String>> buildExtensions;
-
-  @override
-  Future build(BuildStep buildStep) async {
-    var module = Module.fromJson(
-        json.decode(await buildStep.readAsString(buildStep.inputId))
-            as Map<String, dynamic>);
-    try {
-      await _createLinkedSummary(module, buildStep);
-    } on AnalyzerSummaryException catch (e, s) {
-      log.warning('Error creating ${module.linkedSummaryId}:\n$e\n$s');
-    } on MissingModulesException catch (e) {
-      log.severe('$e');
-    }
-  }
-}
-
-/// Creates an unlinked summary for [module].
-Future _createUnlinkedSummary(Module module, BuildStep buildStep,
-    {bool isRoot = false}) async {
-  var scratchSpace = await buildStep.fetchResource(scratchSpaceResource);
-  await scratchSpace.ensureAssets(module.sources, buildStep);
-
-  var summaryOutputFile = scratchSpace.fileFor(module.unlinkedSummaryId);
-  var request = WorkRequest();
-  request.arguments.addAll([
-    '--build-summary-only',
-    '--build-summary-only-unlinked',
-    '--build-summary-output-semantic=${summaryOutputFile.path}',
-    '--strong',
-  ]);
-
-  // Add the default analysis_options.
-  await scratchSpace.ensureAssets([defaultAnalysisOptionsId], buildStep);
-  request.arguments.add(defaultAnalysisOptionsArg(scratchSpace));
-
-  // Add all the files to include in the unlinked summary bundle.
-  request.arguments.addAll(_analyzerSourceArgsForModule(module, scratchSpace));
-
-  var analyzer = await buildStep.fetchResource(analyzerDriverResource);
-  var response = await analyzer.doWork(request,
-      trackWork: (response) =>
-          buildStep.trackStage('Summarize', () => response, isExternal: true));
-  if (response.exitCode == EXIT_CODE_ERROR) {
-    throw AnalyzerSummaryException(module.unlinkedSummaryId, response.output);
-  }
-
-  // Copy the output back using the buildStep.
-  await scratchSpace.copyOutput(module.unlinkedSummaryId, buildStep);
-}
-
-/// Creates a linked summary for [module].
-Future _createLinkedSummary(Module module, BuildStep buildStep,
-    {bool isRoot = false}) async {
-  var transitiveDeps = await module.computeTransitiveDependencies(buildStep);
-  var transitiveUnlinkedSummaryDeps = <AssetId>[];
-  var transitiveLinkedSummaryDeps = <AssetId>[];
-
-  // Provide linked summaries where possible (if created in a previous phase),
-  // otherwise provide unlinked summaries.
-  await Future.wait(transitiveDeps.map((module) async {
-    if (await buildStep.canRead(module.linkedSummaryId)) {
-      transitiveLinkedSummaryDeps.add(module.linkedSummaryId);
-    } else {
-      transitiveUnlinkedSummaryDeps.add(module.unlinkedSummaryId);
-    }
-  }));
-
-  var scratchSpace = await buildStep.fetchResource(scratchSpaceResource);
-
-  var allAssetIds = Set<AssetId>()
-    // TODO: Why can't we just add the unlinked summary?
-    // That would help invalidation.
-    ..addAll(module.sources)
-    ..addAll(transitiveLinkedSummaryDeps)
-    ..addAll(transitiveUnlinkedSummaryDeps);
-  await scratchSpace.ensureAssets(allAssetIds, buildStep);
-  var summaryOutputFile = scratchSpace.fileFor(module.linkedSummaryId);
-  var request = WorkRequest();
-  request.arguments.addAll([
-    '--build-summary-only',
-    '--build-summary-output-semantic=${summaryOutputFile.path}',
-    '--strong',
-  ]);
-
-  // Add the default analysis_options.
-  await scratchSpace.ensureAssets([defaultAnalysisOptionsId], buildStep);
-  request.arguments.add(defaultAnalysisOptionsArg(scratchSpace));
-
-  // Add all the unlinked and linked summaries as build summary inputs.
-  request.arguments.addAll(transitiveUnlinkedSummaryDeps.map((id) =>
-      '--build-summary-unlinked-input=${scratchSpace.fileFor(id).path}'));
-  request.arguments.addAll(transitiveLinkedSummaryDeps
-      .map((id) => '--build-summary-input=${scratchSpace.fileFor(id).path}'));
-
-  // Add all the files to include in the linked summary bundle.
-  request.arguments.addAll(_analyzerSourceArgsForModule(module, scratchSpace));
-
-  // Add the [Input]s with `Digest`s.
-  await Future.wait(allAssetIds.map((input) {
-    return buildStep.digest(input).then((digest) {
-      request.inputs.add(Input()
-        ..digest = digest.bytes
-        ..path = scratchSpace.fileFor(input).path);
-    });
-  }));
-
-  var analyzer = await buildStep.fetchResource(analyzerDriverResource);
-  var response = await analyzer.doWork(request);
-  var summaryFile = scratchSpace.fileFor(module.linkedSummaryId);
-  if (response.exitCode == EXIT_CODE_ERROR || !await summaryFile.exists()) {
-    throw AnalyzerSummaryException(module.linkedSummaryId, response.output);
-  }
-
-  // Copy the output back using the buildStep.
-  await scratchSpace.copyOutput(module.linkedSummaryId, buildStep);
-}
-
-Iterable<String> _analyzerSourceArgsForModule(
-    Module module, ScratchSpace scratchSpace) {
-  return module.sources.map((id) {
-    var uri = canonicalUriFor(id);
-    var file = scratchSpace.fileFor(id);
-    if (!uri.startsWith('package:')) {
-      uri = Uri.file('/${id.path}').toString();
-    }
-    return '$uri|${file.path}';
-  });
-}
diff --git a/build_modules/lib/src/workers.dart b/build_modules/lib/src/workers.dart
index bda1199..9438484 100644
--- a/build_modules/lib/src/workers.dart
+++ b/build_modules/lib/src/workers.dart
@@ -22,30 +22,20 @@
     ? ProcessStartMode.normal
     : ProcessStartMode.detachedWithStdio;
 
-/// Completes once the analyzer workers have been shut down.
-Future<Null> get analyzerWorkersAreDone =>
-    _analyzerWorkersAreDoneCompleter?.future ?? Future.value(null);
-Completer<Null> _analyzerWorkersAreDoneCompleter;
-
-/// Completes once the dartdevc workers have been shut down.
-Future<Null> get dartdevcWorkersAreDone =>
-    _dartdevcWorkersAreDoneCompleter?.future ?? Future.value(null);
-Completer<Null> _dartdevcWorkersAreDoneCompleter;
-
 /// Completes once the dartdevk workers have been shut down.
-Future<Null> get dartdevkWorkersAreDone =>
-    _dartdevkWorkersAreDoneCompleter?.future ?? Future.value(null);
-Completer<Null> _dartdevkWorkersAreDoneCompleter;
+Future<void> get dartdevkWorkersAreDone =>
+    _dartdevkWorkersAreDoneCompleter?.future ?? Future.value();
+Completer<void> _dartdevkWorkersAreDoneCompleter;
 
 /// Completes once the dart2js workers have been shut down.
-Future<Null> get dart2jsWorkersAreDone =>
-    _dart2jsWorkersAreDoneCompleter?.future ?? Future.value(null);
-Completer<Null> _dart2jsWorkersAreDoneCompleter;
+Future<void> get dart2jsWorkersAreDone =>
+    _dart2jsWorkersAreDoneCompleter?.future ?? Future.value();
+Completer<void> _dart2jsWorkersAreDoneCompleter;
 
 /// Completes once the common frontend workers have been shut down.
-Future<Null> get frontendWorkersAreDone =>
-    _frontendWorkersAreDoneCompleter?.future ?? Future.value(null);
-Completer<Null> _frontendWorkersAreDoneCompleter;
+Future<void> get frontendWorkersAreDone =>
+    _frontendWorkersAreDoneCompleter?.future ?? Future.value();
+Completer<void> _frontendWorkersAreDoneCompleter;
 
 final int _defaultMaxWorkers = min((Platform.numberOfProcessors / 2).ceil(), 4);
 
@@ -64,64 +54,9 @@
   return parsed;
 }();
 
-/// Manages a shared set of persistent analyzer workers.
-BazelWorkerDriver get _analyzerDriver {
-  _analyzerWorkersAreDoneCompleter ??= Completer<Null>();
-  return __analyzerDriver ??= BazelWorkerDriver(
-      () => Process.start(
-          p.join(sdkDir, 'bin', 'dart'),
-          [
-            p.join(sdkDir, 'bin', 'snapshots', 'dartanalyzer.dart.snapshot'),
-            '--dart-sdk=$sdkDir',
-            '--build-mode',
-            '--persistent_worker'
-          ],
-          mode: _processMode,
-          workingDirectory: scratchSpace.tempDir.path),
-      maxWorkers: _maxWorkersPerTask);
-}
-
-BazelWorkerDriver __analyzerDriver;
-
-/// Resource for fetching the current [BazelWorkerDriver] for dartanalyzer.
-final analyzerDriverResource =
-    Resource<BazelWorkerDriver>(() => _analyzerDriver, beforeExit: () async {
-  await _analyzerDriver?.terminateWorkers();
-  _analyzerWorkersAreDoneCompleter.complete();
-  _analyzerWorkersAreDoneCompleter = null;
-  __analyzerDriver = null;
-});
-
-/// Manages a shared set of persistent dartdevc workers.
-BazelWorkerDriver get _dartdevcDriver {
-  _dartdevcWorkersAreDoneCompleter ??= Completer<Null>();
-  return __dartdevcDriver ??= BazelWorkerDriver(
-      () => Process.start(
-          p.join(sdkDir, 'bin', 'dart'),
-          [
-            p.join(sdkDir, 'bin', 'snapshots', 'dartdevc.dart.snapshot'),
-            '--dart-sdk=$sdkDir',
-            '--persistent_worker'
-          ],
-          mode: _processMode,
-          workingDirectory: scratchSpace.tempDir.path),
-      maxWorkers: _maxWorkersPerTask);
-}
-
-BazelWorkerDriver __dartdevcDriver;
-
-/// Resource for fetching the current [BazelWorkerDriver] for dartdevc.
-final dartdevcDriverResource =
-    Resource<BazelWorkerDriver>(() => _dartdevcDriver, beforeExit: () async {
-  await _dartdevcDriver?.terminateWorkers();
-  _dartdevcWorkersAreDoneCompleter.complete();
-  _dartdevcWorkersAreDoneCompleter = null;
-  __dartdevcDriver = null;
-});
-
 /// Manages a shared set of persistent dartdevk workers.
 BazelWorkerDriver get _dartdevkDriver {
-  _dartdevkWorkersAreDoneCompleter ??= Completer<Null>();
+  _dartdevkWorkersAreDoneCompleter ??= Completer<void>();
   return __dartdevkDriver ??= BazelWorkerDriver(
       () => Process.start(
           p.join(sdkDir, 'bin', 'dart'),
@@ -148,7 +83,7 @@
 
 /// Manages a shared set of persistent common frontend workers.
 BazelWorkerDriver get _frontendDriver {
-  _frontendWorkersAreDoneCompleter ??= Completer<Null>();
+  _frontendWorkersAreDoneCompleter ??= Completer<void>();
   return __frontendDriver ??= BazelWorkerDriver(
       () => Process.start(
           p.join(sdkDir, 'bin', 'dart'),
@@ -174,7 +109,7 @@
 
 /// Manages a shared set of persistent dart2js workers.
 Dart2JsBatchWorkerPool get _dart2jsWorkerPool {
-  _dart2jsWorkersAreDoneCompleter ??= Completer<Null>();
+  _dart2jsWorkersAreDoneCompleter ??= Completer<void>();
   var librariesSpec = p.joinAll([sdkDir, 'lib', 'libraries.json']);
   return __dart2jsWorkerPool ??= Dart2JsBatchWorkerPool(() => Process.start(
       p.join(sdkDir, 'bin', 'dart'),
@@ -250,7 +185,7 @@
     }();
   }
 
-  Future<Null> terminateWorkers() async {
+  Future<void> terminateWorkers() async {
     var allWorkers = _allWorkers.toList();
     _allWorkers.clear();
     _availableWorkers.clear();
diff --git a/build_modules/mono_pkg.yaml b/build_modules/mono_pkg.yaml
index 76acc9e..86a9810 100644
--- a/build_modules/mono_pkg.yaml
+++ b/build_modules/mono_pkg.yaml
@@ -6,6 +6,9 @@
     - group:
         - dartfmt: sdk
         - dartanalyzer: --fatal-infos --fatal-warnings .
+    - dartanalyzer: --fatal-warnings .
+      dart:
+        - 2.3.0-dev.0.1
   - unit_test:
     # Run the script directly - running from snapshot has issues for packages
     # that are depended on by build_runner itself.
diff --git a/build_modules/pubspec.yaml b/build_modules/pubspec.yaml
index 5289402..30732e8 100644
--- a/build_modules/pubspec.yaml
+++ b/build_modules/pubspec.yaml
@@ -1,21 +1,23 @@
 name: build_modules
-version: 1.0.9
+version: 2.1.2
 description: Builders for Dart modules
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/build/tree/master/build_modules
 
 environment:
-  sdk: ">=2.1.1-dev <3.0.0"
+  sdk: ">=2.3.0-dev.0.1 <3.0.0"
 
 dependencies:
-  analyzer: '>0.30.0 <0.36.0'
-  async: '>=1.13.3 <3.0.0'
+  analyzer: ">0.30.0 <0.37.0"
+  async: ^2.0.0
   bazel_worker: ^0.1.20
-  build: '>=0.12.3 <2.0.0'
-  build_config: '>=0.2.1 <0.4.0'
+  build: ">=0.12.3 <2.0.0"
+  build_config: ">=0.3.0 <0.5.0"
+  collection: ^1.0.0
+  crypto: ^2.0.0
   glob: ^1.0.0
   graphs: ^0.2.0
-  json_annotation: '>=1.2.0 <3.0.0'
+  json_annotation: ">=1.2.0 <3.0.0"
   logging: ^0.11.2
   meta: ^1.1.0
   path: ^1.4.2
@@ -25,10 +27,9 @@
 dev_dependencies:
   build_runner: ^1.0.0
   build_test: ^0.10.0
-  build_vm_compilers: ^0.1.0
+  build_vm_compilers: ^1.0.0
   json_serializable: ^2.0.0
-  source_gen: ^0.9.0
-  test: ^1.3.3
+  test: ^1.6.0
   a:
     path: test/fixtures/a
   b:
diff --git a/build_runner/BUILD.gn b/build_runner/BUILD.gn
index 57add8a..90ec95a 100644
--- a/build_runner/BUILD.gn
+++ b/build_runner/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for build_runner-1.3.3
+# This file is generated by importer.py for build_runner-1.4.0
 
 import("//build/dart/dart_library.gni")
 
diff --git a/build_runner/CHANGELOG.md b/build_runner/CHANGELOG.md
index 266d269..2f04094 100644
--- a/build_runner/CHANGELOG.md
+++ b/build_runner/CHANGELOG.md
@@ -1,3 +1,15 @@
+## 1.4.0
+
+- Add a `run` command to execute VM entrypoints with generated sources.
+
+## 1.3.5
+
+- Use the latest `build_daemon`.
+
+## 1.3.4
+
+- Use the latest `build_config`.
+
 ## 1.3.3
 
 - Use `HttpMultiServer.loopback` for the daemon asset server.
diff --git a/build_runner/README.md b/build_runner/README.md
index 7910a5a..0e17336 100644
--- a/build_runner/README.md
+++ b/build_runner/README.md
@@ -1,5 +1,3 @@
-# build_runner
-
 <p align="center">
   Standalone generator and watcher for Dart using <a href="https://pub.dartlang.org/packages/build"><code>package:build</code></a>.
   <br>
diff --git a/build_runner/bin/build_runner.dart b/build_runner/bin/build_runner.dart
index eb1e0af..7c35683 100644
--- a/build_runner/bin/build_runner.dart
+++ b/build_runner/bin/build_runner.dart
@@ -10,19 +10,22 @@
 import 'package:io/ansi.dart';
 import 'package:io/io.dart';
 import 'package:logging/logging.dart';
-import 'package:path/path.dart' as p;
 
-import 'package:build_runner/src/build_script_generate/build_script_generate.dart';
 import 'package:build_runner/src/build_script_generate/bootstrap.dart';
 import 'package:build_runner/src/entrypoint/runner.dart';
 import 'package:build_runner/src/logging/std_io_logging.dart';
 
-Future<Null> main(List<String> args) async {
+import 'src/commands/clean.dart';
+import 'src/commands/generate_build_script.dart';
+
+Future<void> main(List<String> args) async {
   // Use the actual command runner to parse the args and immediately print the
   // usage information if there is no command provided or the help command was
   // explicitly invoked.
-  var commandRunner = BuildCommandRunner([])
-    ..addCommand(_GenerateBuildScript());
+  var commandRunner = BuildCommandRunner([]);
+  var localCommands = [CleanCommand(), GenerateBuildScript()];
+  var localCommandNames = localCommands.map((c) => c.name).toSet();
+  localCommands.forEach(commandRunner.addCommand);
 
   ArgResults parsedArgs;
   try {
@@ -51,37 +54,11 @@
     return;
   }
 
-  StreamSubscription logListener;
-  if (commandName == _generateCommand) {
+  final logListener = Logger.root.onRecord.listen(stdIOLogListener());
+  if (localCommandNames.contains(commandName)) {
     exitCode = await commandRunner.runCommand(parsedArgs);
-    return;
+  } else {
+    while ((exitCode = await generateAndRun(args)) == ExitCode.tempFail.code) {}
   }
-  logListener = Logger.root.onRecord.listen(stdIOLogListener());
-
-  while ((exitCode = await generateAndRun(args)) == ExitCode.tempFail.code) {}
   await logListener?.cancel();
 }
-
-const _generateCommand = 'generate-build-script';
-
-class _GenerateBuildScript extends Command<int> {
-  @override
-  final description = 'Generate a script to run builds and print the file path '
-      'with no other logging. Useful for wrapping builds with other tools.';
-
-  @override
-  final name = _generateCommand;
-
-  @override
-  bool get hidden => true;
-
-  @override
-  Future<int> run() async {
-    var buildScript = await generateBuildScript();
-    File(scriptLocation)
-      ..createSync(recursive: true)
-      ..writeAsStringSync(buildScript);
-    print(p.absolute(scriptLocation));
-    return 0;
-  }
-}
diff --git a/build_runner/bin/graph_inspector.dart b/build_runner/bin/graph_inspector.dart
index b32ad5a..267109c 100644
--- a/build_runner/bin/graph_inspector.dart
+++ b/build_runner/bin/graph_inspector.dart
@@ -5,9 +5,11 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:args/args.dart';
 import 'package:args/command_runner.dart';
 import 'package:build/build.dart';
 import 'package:glob/glob.dart';
+import 'package:logging/logging.dart';
 import 'package:path/path.dart' as p;
 
 import 'package:build_runner_core/build_runner_core.dart';
@@ -17,57 +19,76 @@
 AssetGraph assetGraph;
 PackageGraph packageGraph;
 
-Future main(List<String> args) async {
-  stdout.writeln(
+final logger = Logger('graph_inspector');
+
+Future<void> main(List<String> args) async {
+  final logSubscription =
+      Logger.root.onRecord.listen((record) => print(record.message));
+  logger.warning(
       'Warning: this tool is unsupported and usage may change at any time, '
       'use at your own risk.');
 
-  if (args.length != 1) {
+  final argParser = ArgParser()
+    ..addOption('graph-file',
+        abbr: 'g', help: 'Specify the asset_graph.json file to inspect.')
+    ..addOption('build-script',
+        abbr: 'b',
+        help: 'Specify the build script to find the asset graph for.',
+        defaultsTo: '.dart_tool/build/entrypoint/build.dart');
+
+  final results = argParser.parse(args);
+
+  if (results.wasParsed('graph-file') && results.wasParsed('build-script')) {
     throw ArgumentError(
-        'Expected exactly one argument, the path to a build script to '
-        'analyze.');
-  }
-  var scriptPath = args.first;
-  var scriptFile = File(scriptPath);
-  if (!scriptFile.existsSync()) {
-    throw ArgumentError(
-        'Expected a build script at $scriptPath but didn\'t find one.');
+        'Expected exactly one of `--graph-file` or `--build-script`.');
   }
 
-  var assetGraphFile =
-      File(assetGraphPathFor(p.url.joinAll(p.split(scriptPath))));
+  var assetGraphFile = File(_findAssetGraph(results));
   if (!assetGraphFile.existsSync()) {
-    throw ArgumentError(
-        'Unable to find AssetGraph for $scriptPath at ${assetGraphFile.path}');
+    throw ArgumentError('Unable to find AssetGraph.');
   }
   stdout.writeln('Loading asset graph at ${assetGraphFile.path}...');
 
   assetGraph = AssetGraph.deserialize(assetGraphFile.readAsBytesSync());
   packageGraph = PackageGraph.forThisPackage();
 
-  var commandRunner =
-      CommandRunner('', 'A tool for inspecting the AssetGraph for your build')
-        ..addCommand(InspectNodeCommand())
-        ..addCommand(GraphCommand());
+  var commandRunner = CommandRunner<bool>(
+      '', 'A tool for inspecting the AssetGraph for your build')
+    ..addCommand(InspectNodeCommand())
+    ..addCommand(GraphCommand())
+    ..addCommand(QuitCommand());
 
   stdout.writeln('Ready, please type in a command:');
 
-  while (true) {
+  var shouldExit = false;
+  while (!shouldExit) {
     stdout
       ..writeln('')
       ..write('> ');
     var nextCommand = stdin.readLineSync();
     stdout.writeln('');
     try {
-      await commandRunner.run(nextCommand.split(' '));
+      shouldExit = await commandRunner.run(nextCommand.split(' '));
     } on UsageException {
       stdout.writeln('Unrecognized option');
       await commandRunner.run(['help']);
     }
   }
+  await logSubscription.cancel();
 }
 
-class InspectNodeCommand extends Command {
+String _findAssetGraph(ArgResults results) {
+  if (results.wasParsed('graph-file')) return results['graph-file'] as String;
+  final scriptPath = results['build-script'] as String;
+  final scriptFile = File(scriptPath);
+  if (!scriptFile.existsSync()) {
+    throw ArgumentError(
+        'Expected a build script at $scriptPath but didn\'t find one.');
+  }
+  return assetGraphPathFor(p.url.joinAll(p.split(scriptPath)));
+}
+
+class InspectNodeCommand extends Command<bool> {
   @override
   String get name => 'inspect';
 
@@ -83,7 +104,7 @@
   }
 
   @override
-  run() {
+  bool run() {
     var stringUris = argResults.rest;
     if (stringUris.isEmpty) {
       stderr.writeln('Expected at least one uri for a node to inspect.');
@@ -121,7 +142,7 @@
         description.writeln('  secondary outputs:');
         node.outputs.difference(node.primaryOutputs).forEach(_printAsset);
 
-        if (node is GeneratedAssetNode) {
+        if (node is NodeWithInputs) {
           description.writeln('  inputs:');
           assetGraph.allNodes
               .where((n) => n.outputs.contains(node.id))
@@ -132,11 +153,11 @@
 
       stdout.write(description);
     }
-    return null;
+    return false;
   }
 }
 
-class GraphCommand extends Command {
+class GraphCommand extends Command<bool> {
   @override
   String get name => 'graph';
 
@@ -160,7 +181,7 @@
   }
 
   @override
-  run() {
+  bool run() {
     var showGenerated = argResults['generated'] as bool;
     var showSources = argResults['original'] as bool;
     Iterable<AssetId> assets;
@@ -186,10 +207,21 @@
     for (var id in assets) {
       _listAsset(id, stdout, indentation: '  ');
     }
-    return null;
+    return false;
   }
 }
 
+class QuitCommand extends Command<bool> {
+  @override
+  String get name => 'quit';
+
+  @override
+  String get description => 'Exit the inspector';
+
+  @override
+  bool run() => true;
+}
+
 AssetId _idFromString(String stringUri) {
   var uri = Uri.parse(stringUri);
   if (uri.scheme == 'package') {
diff --git a/build_runner/bin/src/commands/clean.dart b/build_runner/bin/src/commands/clean.dart
new file mode 100644
index 0000000..70b0113
--- /dev/null
+++ b/build_runner/bin/src/commands/clean.dart
@@ -0,0 +1,34 @@
+// 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 'package:args/args.dart';
+import 'package:args/command_runner.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:logging/logging.dart';
+
+import 'package:build_runner/src/build_script_generate/build_script_generate.dart';
+import 'package:build_runner/src/entrypoint/base_command.dart' show lineLength;
+import 'package:build_runner/src/entrypoint/clean.dart' show cleanFor;
+
+class CleanCommand extends Command<int> {
+  @override
+  final argParser = ArgParser(usageLineLength: lineLength);
+
+  @override
+  String get name => 'clean';
+  final logger = Logger('clean');
+
+  @override
+  String get description =>
+      'Cleans up output from previous builds. Does not clean up --output '
+      'directories.';
+
+  @override
+  Future<int> run() async {
+    await cleanFor(assetGraphPathFor(scriptLocation), logger);
+    return 0;
+  }
+}
diff --git a/build_runner/bin/src/commands/generate_build_script.dart b/build_runner/bin/src/commands/generate_build_script.dart
new file mode 100644
index 0000000..002abc8
--- /dev/null
+++ b/build_runner/bin/src/commands/generate_build_script.dart
@@ -0,0 +1,41 @@
+// 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 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:args/command_runner.dart';
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as p;
+
+import 'package:build_runner/src/build_script_generate/build_script_generate.dart';
+import 'package:build_runner/src/entrypoint/base_command.dart' show lineLength;
+
+class GenerateBuildScript extends Command<int> {
+  @override
+  final argParser = ArgParser(usageLineLength: lineLength);
+
+  @override
+  String get description =>
+      'Generate a script to run builds and print the file path '
+      'with no other logging. Useful for wrapping builds with other tools.';
+
+  @override
+  String get name => 'generate-build-script';
+
+  @override
+  bool get hidden => true;
+
+  @override
+  Future<int> run() async {
+    Logger.root.clearListeners();
+    var buildScript = await generateBuildScript();
+    File(scriptLocation)
+      ..createSync(recursive: true)
+      ..writeAsStringSync(buildScript);
+    print(p.absolute(scriptLocation));
+    return 0;
+  }
+}
diff --git a/build_runner/build.yaml b/build_runner/build.yaml
new file mode 100644
index 0000000..d1e3e0f
--- /dev/null
+++ b/build_runner/build.yaml
@@ -0,0 +1,25 @@
+targets:
+  $default:
+    builders:
+      build_web_compilers:entrypoint:
+        options:
+          compiler: dart2js
+          dart2js_args:
+            - -O4
+        generate_for:
+          - web/graph_viz_main.dart
+          - web/hot_reload_client.dart
+      build_runner:client_js_copy_builder:
+        enabled: true
+builders:
+  client_js_copy_builder:
+    import: "tool/builders.dart"
+    builder_factories:
+        - copyCompiledJs
+    build_extensions:
+      web/graph_viz_main.dart.js:
+        - lib/src/server/graph_viz_main.dart.js
+      web/hot_reload_client.dart.js:
+        - lib/src/server/build_updates_client/hot_reload_client.dart.js
+    auto_apply: none
+    build_to: source
diff --git a/build_runner/lib/src/build_script_generate/build_script_generate.dart b/build_runner/lib/src/build_script_generate/build_script_generate.dart
index 0157cad..ffc4861 100644
--- a/build_runner/lib/src/build_script_generate/build_script_generate.dart
+++ b/build_runner/lib/src/build_script_generate/build_script_generate.dart
@@ -151,15 +151,15 @@
         refer('InputSet', 'package:build_config/build_config.dart')
             .constInstance([], inputSetArgs);
   }
-  if (!identical(definition.defaults?.options, BuilderOptions.empty)) {
+  if (definition.defaults?.options?.isNotEmpty ?? false) {
     namedArgs['defaultOptions'] =
         _constructBuilderOptions(definition.defaults.options);
   }
-  if (!identical(definition.defaults?.devOptions, BuilderOptions.empty)) {
+  if (definition.defaults?.devOptions?.isNotEmpty ?? false) {
     namedArgs['defaultDevOptions'] =
         _constructBuilderOptions(definition.defaults.devOptions);
   }
-  if (!identical(definition.defaults?.releaseOptions, BuilderOptions.empty)) {
+  if (definition.defaults?.releaseOptions?.isNotEmpty ?? false) {
     namedArgs['defaultReleaseOptions'] =
         _constructBuilderOptions(definition.defaults.releaseOptions);
   }
@@ -190,15 +190,15 @@
       inputSetArgs['exclude'] =
           literalConstList(definition.defaults.generateFor.exclude);
     }
-    if (!identical(definition.defaults?.options, BuilderOptions.empty)) {
+    if (definition.defaults?.options?.isNotEmpty ?? false) {
       namedArgs['defaultOptions'] =
           _constructBuilderOptions(definition.defaults.options);
     }
-    if (!identical(definition.defaults?.devOptions, BuilderOptions.empty)) {
+    if (definition.defaults?.devOptions?.isNotEmpty ?? false) {
       namedArgs['defaultDevOptions'] =
           _constructBuilderOptions(definition.defaults.devOptions);
     }
-    if (!identical(definition.defaults?.releaseOptions, BuilderOptions.empty)) {
+    if (definition.defaults?.releaseOptions?.isNotEmpty ?? false) {
       namedArgs['defaultReleaseOptions'] =
           _constructBuilderOptions(definition.defaults.releaseOptions);
     }
@@ -252,6 +252,6 @@
 }
 
 /// An expression creating a [BuilderOptions] from a json string.
-Expression _constructBuilderOptions(BuilderOptions options) =>
+Expression _constructBuilderOptions(Map<String, dynamic> options) =>
     refer('BuilderOptions', 'package:build/build.dart')
-        .newInstance([literalMap(options.config)]);
+        .newInstance([literalMap(options)]);
diff --git a/build_runner/lib/src/entrypoint/base_command.dart b/build_runner/lib/src/entrypoint/base_command.dart
index b48afaa..1fae9d4 100644
--- a/build_runner/lib/src/entrypoint/base_command.dart
+++ b/build_runner/lib/src/entrypoint/base_command.dart
@@ -2,13 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:io';
+
+import 'package:args/args.dart';
 import 'package:args/command_runner.dart';
-import 'package:logging/logging.dart';
 import 'package:build_runner_core/build_runner_core.dart';
+import 'package:logging/logging.dart';
 
 import 'options.dart';
 import 'runner.dart';
 
+final lineLength = stdout.hasTerminal ? stdout.terminalColumns : 80;
+
 abstract class BuildRunnerCommand extends Command<int> {
   Logger get logger => Logger(name);
 
@@ -21,6 +26,9 @@
     _addBaseFlags(symlinksDefault ?? false);
   }
 
+  @override
+  final argParser = ArgParser(usageLineLength: lineLength);
+
   void _addBaseFlags(bool symlinksDefault) {
     argParser
       ..addFlag(deleteFilesByDefaultOption,
diff --git a/build_runner/lib/src/entrypoint/clean.dart b/build_runner/lib/src/entrypoint/clean.dart
index f9c3f8c..9aa4fba 100644
--- a/build_runner/lib/src/entrypoint/clean.dart
+++ b/build_runner/lib/src/entrypoint/clean.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:args/args.dart';
 import 'package:args/command_runner.dart';
 import 'package:build_runner_core/build_runner_core.dart';
 import 'package:build_runner_core/src/asset_graph/graph.dart';
@@ -12,9 +13,13 @@
 import 'package:logging/logging.dart';
 
 import '../logging/std_io_logging.dart';
+import 'base_command.dart';
 
 class CleanCommand extends Command<int> {
   @override
+  final argParser = ArgParser(usageLineLength: lineLength);
+
+  @override
   String get name => 'clean';
 
   @override
@@ -27,43 +32,44 @@
   @override
   Future<int> run() async {
     var logSubscription = Logger.root.onRecord.listen(stdIOLogListener());
-
-    logger.warning('Deleting cache and generated source files.\n'
-        'This shouldn\'t be necessary for most applications, unless you have '
-        'made intentional edits to generated files (i.e. for testing). '
-        'Consider filing a bug at '
-        'https://github.com/dart-lang/build/issues/new if you are using this '
-        'to work around an apparent (and reproducible) bug.');
-
-    await logTimedAsync(logger, 'Cleaning up source outputs', () async {
-      var assetGraphFile = File(assetGraphPath);
-      if (!assetGraphFile.existsSync()) {
-        logger.warning('No asset graph found. '
-            'Skipping cleanup of generated files in source directories.');
-        return;
-      }
-      AssetGraph assetGraph;
-      try {
-        assetGraph = AssetGraph.deserialize(await assetGraphFile.readAsBytes());
-      } catch (_) {
-        logger.warning('Failed to deserialize AssetGraph. '
-            'Skipping cleanup of generated files in source directories.');
-        return;
-      }
-      var packageGraph = PackageGraph.forThisPackage();
-      await cleanUpSourceOutputs(assetGraph, packageGraph);
-    });
-
-    await logTimedAsync(
-        logger, 'Cleaning up cache directory', cleanUpGeneratedDirectory);
-
+    await cleanFor(assetGraphPath, logger);
     await logSubscription.cancel();
-
     return 0;
   }
 }
 
-Future<void> cleanUpSourceOutputs(
+Future<void> cleanFor(String assetGraphPath, Logger logger) async {
+  logger.warning('Deleting cache and generated source files.\n'
+      'This shouldn\'t be necessary for most applications, unless you have '
+      'made intentional edits to generated files (i.e. for testing). '
+      'Consider filing a bug at '
+      'https://github.com/dart-lang/build/issues/new if you are using this '
+      'to work around an apparent (and reproducible) bug.');
+
+  await logTimedAsync(logger, 'Cleaning up source outputs', () async {
+    var assetGraphFile = File(assetGraphPath);
+    if (!assetGraphFile.existsSync()) {
+      logger.warning('No asset graph found. '
+          'Skipping cleanup of generated files in source directories.');
+      return;
+    }
+    AssetGraph assetGraph;
+    try {
+      assetGraph = AssetGraph.deserialize(await assetGraphFile.readAsBytes());
+    } catch (_) {
+      logger.warning('Failed to deserialize AssetGraph. '
+          'Skipping cleanup of generated files in source directories.');
+      return;
+    }
+    var packageGraph = PackageGraph.forThisPackage();
+    await _cleanUpSourceOutputs(assetGraph, packageGraph);
+  });
+
+  await logTimedAsync(
+      logger, 'Cleaning up cache directory', _cleanUpGeneratedDirectory);
+}
+
+Future<void> _cleanUpSourceOutputs(
     AssetGraph assetGraph, PackageGraph packageGraph) async {
   var writer = FileBasedAssetWriter(packageGraph);
   for (var id in assetGraph.outputs) {
@@ -79,7 +85,7 @@
   }
 }
 
-Future<void> cleanUpGeneratedDirectory() async {
+Future<void> _cleanUpGeneratedDirectory() async {
   var generatedDir = Directory(cacheDir);
   if (await generatedDir.exists()) {
     await generatedDir.delete(recursive: true);
diff --git a/build_runner/lib/src/entrypoint/daemon.dart b/build_runner/lib/src/entrypoint/daemon.dart
index 41f954c..c918ca4 100644
--- a/build_runner/lib/src/entrypoint/daemon.dart
+++ b/build_runner/lib/src/entrypoint/daemon.dart
@@ -32,8 +32,8 @@
     var daemon = Daemon(workingDirectory);
     var requestedOptions = argResults.arguments.toSet();
     if (!daemon.tryGetLock()) {
-      var runningOptions = currentOptions(workingDirectory);
-      var version = runningVersion(workingDirectory);
+      var runningOptions = await currentOptions(workingDirectory);
+      var version = await runningVersion(workingDirectory);
       if (version != currentVersion) {
         stdout
           ..writeln('Running Version: $version')
diff --git a/build_runner/lib/src/entrypoint/run.dart b/build_runner/lib/src/entrypoint/run.dart
index 3d76725..ceba164 100644
--- a/build_runner/lib/src/entrypoint/run.dart
+++ b/build_runner/lib/src/entrypoint/run.dart
@@ -10,6 +10,7 @@
 import 'package:io/ansi.dart' as ansi;
 import 'package:io/io.dart' show ExitCode;
 
+import 'clean.dart';
 import 'runner.dart';
 
 /// A common entry point to parse command line arguments and build or serve with
@@ -18,7 +19,7 @@
 /// Returns the exit code that should be set when the calling process exits. `0`
 /// implies success.
 Future<int> run(List<String> args, List<BuilderApplication> builders) async {
-  var runner = BuildCommandRunner(builders);
+  var runner = BuildCommandRunner(builders)..addCommand(CleanCommand());
   try {
     var result = await runner.run(args);
     return result ?? 0;
diff --git a/build_runner/lib/src/entrypoint/run_script.dart b/build_runner/lib/src/entrypoint/run_script.dart
new file mode 100644
index 0000000..3c0412a
--- /dev/null
+++ b/build_runner/lib/src/entrypoint/run_script.dart
@@ -0,0 +1,186 @@
+// 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 'dart:io';
+import 'dart:isolate';
+
+import 'package:args/command_runner.dart';
+import 'package:build_runner/src/logging/std_io_logging.dart';
+import 'package:build_runner_core/build_runner_core.dart';
+import 'package:io/io.dart';
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as p;
+
+import '../generate/build.dart';
+import 'base_command.dart';
+import 'options.dart';
+
+class RunCommand extends BuildRunnerCommand {
+  @override
+  String get name => 'run';
+
+  @override
+  String get description => 'Performs a single build, and executes '
+      'a Dart script with the given arguments.';
+
+  @override
+  String get invocation =>
+      '${super.invocation.replaceFirst('[arguments]', '[build-arguments]')} '
+      '<executable> [-- [script-arguments]]';
+
+  @override
+  SharedOptions readOptions() {
+    // Here we validate that [argResults.rest] is exactly equal to all the
+    // arguments after the `--`.
+
+    var separatorPos = argResults.arguments.indexOf('--');
+
+    if (separatorPos >= 0) {
+      void throwUsageException() {
+        throw UsageException(
+            'The `run` command does not support positional args before the '
+            '`--` separator which should separate build args from script args.',
+            usage);
+      }
+
+      var expectedRest = argResults.arguments.skip(separatorPos + 1).toList();
+
+      // Since we expect the first argument to be the name of a script,
+      // we should skip it when comparing extra arguments.
+      var effectiveRest = argResults.rest.skip(1).toList();
+
+      if (effectiveRest.length != expectedRest.length) {
+        throwUsageException();
+      }
+
+      for (var i = 0; i < effectiveRest.length; i++) {
+        if (expectedRest[i] != effectiveRest[i]) {
+          throwUsageException();
+        }
+      }
+    }
+
+    return SharedOptions.fromParsedArgs(
+        argResults, [], packageGraph.root.name, this);
+  }
+
+  @override
+  FutureOr<int> run() async {
+    var options = readOptions();
+    var logSubscription =
+        Logger.root.onRecord.listen(stdIOLogListener(verbose: options.verbose));
+
+    try {
+      // Ensure that the user passed the name of a file to run.
+      if (argResults.rest.isEmpty) {
+        logger..severe('Must specify an executable to run.')..severe(usage);
+        return ExitCode.usage.code;
+      }
+
+      var scriptName = argResults.rest[0];
+      var passedArgs = argResults.rest.skip(1).toList();
+
+      // Ensure the extension is .dart.
+      if (p.extension(scriptName) != '.dart') {
+        logger.severe('$scriptName is not a valid Dart file '
+            'and cannot be run in the VM.');
+        return ExitCode.usage.code;
+      }
+
+      // Create a temporary directory in which to execute the script.
+      var tempPath = Directory.systemTemp
+          .createTempSync('build_runner_run_script')
+          .absolute
+          .uri
+          .toFilePath();
+
+      // Create two ReceivePorts, so that we can quit when the isolate is done.
+      //
+      // Define these before starting the isolate, so that we can close
+      // them if there is a spawn exception.
+      ReceivePort onExit, onError;
+
+      // Use a completer to determine the exit code.
+      var exitCodeCompleter = Completer<int>();
+
+      try {
+        var buildDirs = (options.buildDirs ?? Set<BuildDirectory>())
+          ..add(BuildDirectory('',
+              outputLocation: OutputLocation(tempPath,
+                  useSymlinks: options.outputSymlinksOnly, hoist: false)));
+        var result = await build(
+          builderApplications,
+          deleteFilesByDefault: options.deleteFilesByDefault,
+          enableLowResourcesMode: options.enableLowResourcesMode,
+          configKey: options.configKey,
+          buildDirs: buildDirs,
+          packageGraph: packageGraph,
+          verbose: options.verbose,
+          builderConfigOverrides: options.builderConfigOverrides,
+          isReleaseBuild: options.isReleaseBuild,
+          trackPerformance: options.trackPerformance,
+          skipBuildScriptCheck: options.skipBuildScriptCheck,
+          logPerformanceDir: options.logPerformanceDir,
+        );
+
+        if (result.status == BuildStatus.failure) {
+          logger.warning('Skipping script run due to build failure');
+          return result.failureType.exitCode;
+        }
+
+        // Find the path of the script to run.
+        var scriptPath = p.join(tempPath, scriptName);
+        var packageConfigPath = p.join(tempPath, '.packages');
+
+        onExit = ReceivePort();
+        onError = ReceivePort();
+
+        // Cleanup after exit.
+        onExit.listen((_) {
+          // If no error was thrown, return 0.
+          if (!exitCodeCompleter.isCompleted) exitCodeCompleter.complete(0);
+        });
+
+        // On an error, kill the isolate, and log the error.
+        onError.listen((e) {
+          onExit.close();
+          onError.close();
+          logger.severe('Unhandled error from script: $scriptName', e[0],
+              StackTrace.fromString(e[1].toString()));
+          if (!exitCodeCompleter.isCompleted) exitCodeCompleter.complete(1);
+        });
+
+        await Isolate.spawnUri(
+          p.toUri(scriptPath),
+          passedArgs,
+          null,
+          errorsAreFatal: true,
+          onExit: onExit.sendPort,
+          onError: onError.sendPort,
+          packageConfig: p.toUri(packageConfigPath),
+        );
+
+        return await exitCodeCompleter.future;
+      } on IsolateSpawnException catch (e) {
+        logger.severe(
+            'Could not spawn isolate. Ensure that your file is in a valid directory (i.e. "bin", "benchmark", "example", "test", "tool").',
+            e);
+        return ExitCode.ioError.code;
+      } finally {
+        // Clean up the output dir.
+        var dir = Directory(tempPath);
+        if (await dir.exists()) await dir.delete(recursive: true);
+
+        onExit?.close();
+        onError?.close();
+        if (!exitCodeCompleter.isCompleted) {
+          exitCodeCompleter.complete(ExitCode.success.code);
+        }
+      }
+    } finally {
+      await logSubscription.cancel();
+    }
+  }
+}
diff --git a/build_runner/lib/src/entrypoint/runner.dart b/build_runner/lib/src/entrypoint/runner.dart
index ae7acfe..4cb309f 100644
--- a/build_runner/lib/src/entrypoint/runner.dart
+++ b/build_runner/lib/src/entrypoint/runner.dart
@@ -4,19 +4,24 @@
 
 import 'dart:convert';
 
+import 'package:args/args.dart';
 import 'package:args/command_runner.dart';
 import 'package:build_runner_core/build_runner_core.dart';
 
+import 'base_command.dart' show lineLength;
 import 'build.dart';
-import 'clean.dart';
 import 'daemon.dart';
 import 'doctor.dart';
+import 'run_script.dart';
 import 'serve.dart';
 import 'test.dart';
 import 'watch.dart';
 
 /// Unified command runner for all build_runner commands.
 class BuildCommandRunner extends CommandRunner<int> {
+  @override
+  final argParser = ArgParser(usageLineLength: lineLength);
+
   final List<BuilderApplication> builderApplications;
 
   final packageGraph = PackageGraph.forThisPackage();
@@ -25,9 +30,9 @@
       : builderApplications = List.unmodifiable(builderApplications),
         super('build_runner', 'Unified interface for running Dart builds.') {
     addCommand(BuildCommand());
-    addCommand(CleanCommand());
     addCommand(DaemonCommand());
     addCommand(DoctorCommand());
+    addCommand(RunCommand());
     addCommand(ServeCommand());
     addCommand(TestCommand(packageGraph));
     addCommand(WatchCommand());
diff --git a/build_runner/lib/src/generate/watch_impl.dart b/build_runner/lib/src/generate/watch_impl.dart
index 7f5f553..69e574f 100644
--- a/build_runner/lib/src/generate/watch_impl.dart
+++ b/build_runner/lib/src/generate/watch_impl.dart
@@ -129,8 +129,8 @@
 
   AssetGraph get assetGraph => _build?.assetGraph;
 
-  final _readyCompleter = Completer<Null>();
-  Future<Null> get ready => _readyCompleter.future;
+  final _readyCompleter = Completer<void>();
+  Future<void> get ready => _readyCompleter.future;
 
   final String _configKey; // may be null
 
@@ -321,7 +321,7 @@
       }
 
       _reader = _build?.finalizedReader;
-      _readyCompleter.complete(null);
+      _readyCompleter.complete();
       // It is possible this is already closed if the user kills the process
       // early, which results in an exception without this check.
       if (!controller.isClosed) controller.add(firstBuild);
diff --git a/build_runner/lib/src/logging/std_io_logging.dart b/build_runner/lib/src/logging/std_io_logging.dart
index 1d96e4c..96231b6 100644
--- a/build_runner/lib/src/logging/std_io_logging.dart
+++ b/build_runner/lib/src/logging/std_io_logging.dart
@@ -26,7 +26,7 @@
   final level = color.wrap('[${record.level}]');
   final eraseLine = ansiOutputEnabled && !verbose ? '\x1b[2K\r' : '';
   var lines = <Object>[
-    '$eraseLine$level ${_loggerName(record, verbose)}${record.message}'
+    '$eraseLine$level ${_recordHeader(record, verbose)}${record.message}'
   ];
 
   if (record.error != null) {
@@ -57,34 +57,11 @@
 void _stdIOLogListener(LogRecord record, {bool verbose}) =>
     stdout.write(colorLog(record, verbose: verbose));
 
-/// Filter out the Logger names known to come from `build_runner` and splits the
-/// header for levels >= WARNING.
-String _loggerName(LogRecord record, bool verbose) {
-  var knownNames = const [
-    'ApplyBuilders',
-    'Bootstrap',
-    'Build',
-    'BuildConfigOverrides',
-    'BuildDefinition',
-    'BuildOptions',
-    'BuildScriptUpdates',
-    'CreateOutputDir',
-    'Entrypoint',
-    'Heartbeat',
-    'IOEnvironment',
-    'Serve',
-    'Watch',
-    'build_runner',
-    // commands
-    'build',
-    'clean',
-    'doctor',
-    'serve',
-    'test',
-    'watch',
-  ];
+/// Filter out the Logger names which aren't coming from specific builders and
+/// splits the header for levels >= WARNING.
+String _recordHeader(LogRecord record, bool verbose) {
   var maybeSplit = record.level >= Level.WARNING ? '\n' : '';
-  return verbose || !knownNames.contains(record.loggerName)
+  return verbose || record.loggerName.contains(' ')
       ? '${record.loggerName}:$maybeSplit'
       : '';
 }
diff --git a/build_runner/lib/src/server/build_updates_client/hot_reload_client.dart.js.map b/build_runner/lib/src/server/build_updates_client/hot_reload_client.dart.js.map
deleted file mode 100644
index 6fc8649..0000000
--- a/build_runner/lib/src/server/build_updates_client/hot_reload_client.dart.js.map
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "version": 3,
-  "engine": "v2",
-  "file": "hot_reload_client.dart.js",
-  "sourceRoot": "",
-  "sources": ["org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/interceptors.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_array.dart","org-dartlang-sdk:///sdk/lib/collection/list.dart","org-dartlang-sdk:///sdk/lib/core/comparable.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_number.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_string.dart","org-dartlang-sdk:///sdk/lib/internal/iterable.dart","org-dartlang-sdk:///sdk/lib/core/errors.dart","org-dartlang-sdk:///sdk/lib/internal/sort.dart","org-dartlang-sdk:///sdk/lib/internal/cast.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/internal_patch.dart","org-dartlang-sdk:///sdk/lib/internal/symbol.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/constant_map.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_rti.dart","org-dartlang-sdk:///sdk/lib/core/exceptions.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/core_patch.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/native_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/string_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_names.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_primitives.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/native_typed_data.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/async_patch.dart","org-dartlang-sdk:///sdk/lib/async/future_impl.dart","org-dartlang-sdk:///sdk/lib/async/schedule_microtask.dart","org-dartlang-sdk:///sdk/lib/async/zone.dart","org-dartlang-sdk:///sdk/lib/async/stream.dart","org-dartlang-sdk:///sdk/lib/async/stream_impl.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/collection_patch.dart","org-dartlang-sdk:///sdk/lib/collection/hash_map.dart","org-dartlang-sdk:///sdk/lib/collection/iterable.dart","org-dartlang-sdk:///sdk/lib/collection/maps.dart","org-dartlang-sdk:///sdk/lib/collection/splay_tree.dart","org-dartlang-sdk:///sdk/lib/collection/queue.dart","org-dartlang-sdk:///sdk/lib/collection/set.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/convert_patch.dart","org-dartlang-sdk:///sdk/lib/convert/json.dart","org-dartlang-sdk:///sdk/lib/core/map.dart","org-dartlang-sdk:///sdk/lib/core/print.dart","org-dartlang-sdk:///sdk/lib/core/date_time.dart","org-dartlang-sdk:///sdk/lib/core/iterable.dart","org-dartlang-sdk:///sdk/lib/core/null.dart","org-dartlang-sdk:///sdk/lib/core/string_buffer.dart","org-dartlang-sdk:///sdk/lib/html/dart2js/html_dart2js.dart","org-dartlang-sdk:///sdk/lib/html/html_common/conversions_dart2js.dart","org-dartlang-sdk:///sdk/lib/html/html_common/conversions.dart","org-dartlang-sdk:///sdk/lib/js/dart2js/js_dart2js.dart","hot_reload_client.dart","org-dartlang-sdk:///sdk/lib/collection/linked_hash_map.dart","module.dart","reloading_manager.dart","reload_handler.dart","../../../../graphs/src/strongly_connected_components.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/math_patch.dart","org-dartlang-sdk:///sdk/lib/async/future.dart"],
-  "names": ["makeDispatchRecord","getNativeInterceptor","Interceptor.==","Interceptor.hashCode","Interceptor.toString","Interceptor.noSuchMethod","JSBool.toString","JSBool.hashCode","JSNull.==","JSNull.toString","JSNull.hashCode","JSNull.noSuchMethod","JavaScriptObject.hashCode","JavaScriptObject.toString","JavaScriptFunction.toString","JSArray.add","JSArray.addAll","JSArray.elementAt","JSArray.setRange","JSArray.setRange[function-entry$3]","JSArray.sort","JSArray.isEmpty","JSArray.isNotEmpty","JSArray.toString","JSArray.iterator","JSArray.hashCode","JSArray.length","JSArray.[]","JSArray.[]=","JSArray.+","JSArray.markFixed","JSArray.markFixedList","JSArray._compareAny","ArrayIterator.current","ArrayIterator.moveNext","JSNumber.compareTo","JSNumber.isNegative","JSNumber.toString","JSNumber.hashCode","JSNumber.+","JSNumber._tdivFast","JSNumber._tdivSlow","JSNumber._shrOtherPositive","JSNumber._shrBothPositive","JSNumber.>","JSString._codeUnitAt","JSString.+","JSString.substring","JSString.substring[function-entry$1]","JSString.isEmpty","JSString.compareTo","JSString.toString","JSString.hashCode","JSString.length","IterableElementError.noElement","IterableElementError.tooFew","Sort.sort","Sort._doSort","Sort._insertionSort","Sort._dualPivotQuicksort","_CastIterableBase.iterator","_CastIterableBase.length","_CastIterableBase.isEmpty","_CastIterableBase.contains","_CastIterableBase.toString","CastIterator.moveNext","CastIterator.current","CastIterable","CastMap.cast","CastMap.containsKey","CastMap.[]","CastMap.[]=","CastMap.forEach","CastMap.keys","CastMap.length","CastMap.isEmpty","CastMap.forEach.<anonymous function>","CastMap_forEach_closure","ListIterable.iterator","ListIterable.isEmpty","ListIterable.contains","ListIterable.toList","ListIterable.toList[function-entry$0]","ListIterator.current","ListIterator.moveNext","MappedListIterable.length","MappedListIterable.elementAt","Symbol.hashCode","Symbol.toString","Symbol.==","ConstantMap._throwUnmodifiable","unminifyOrTag","getType","isJsIndexable","S","Primitives.objectHashCode","Primitives.objectTypeName","Primitives._objectClassName","Primitives.stringFromCharCode","Primitives.lazyAsJsDate","Primitives.getYear","Primitives.getMonth","Primitives.getDay","Primitives.getHours","Primitives.getMinutes","Primitives.getSeconds","Primitives.getMilliseconds","Primitives.functionNoSuchMethod","createUnmangledInvocationMirror","Primitives.applyFunctionWithPositionalArguments","Primitives._genericApplyFunctionWithPositionalArguments","ioore","diagnoseIndexError","argumentErrorValue","checkNum","wrapException","toStringWrapper","throwExpression","throwConcurrentModificationError","unwrapException","getTraceFromException","invokeClosure","Exception","convertDartClosureToJS","Closure.fromTearOff","Closure.cspForwardCall","Closure.forwardCallTo","Closure.cspForwardInterceptedCall","Closure.forwardInterceptedCallTo","closureFromTearOff","stringTypeCast","propertyTypeCastError","interceptedTypeCast","extractFunctionTypeObjectFromInternal","functionTypeTest","_typeDescription","throwCyclicInit","getIsolateAffinityTag","setRuntimeTypeInfo","getRuntimeTypeInfo","getRuntimeTypeArguments","getRuntimeTypeArgumentIntercepted","getRuntimeTypeArgument","getTypeArgumentByIndex","runtimeTypeToString","_runtimeTypeToString","_functionRtiToString","_joinArguments","StringBuffer.write","substitute","checkSubtype","subtypeCast","Primitives.formatType","areSubtypes","computeSignature","isSupertypeOfNullRecursive","checkSubtypeOfRuntimeType","subtypeOfRuntimeTypeCast","_isSubtype","_isFunctionSubtype","namedParametersSubtypeCheck","defineProperty","lookupAndCacheInterceptor","patchProto","patchInteriorProto","makeLeafDispatchRecord","makeDefaultDispatchRecord","initNativeDispatch","initNativeDispatchContinue","initHooks","applyHooksTransformer","stringReplaceFirstUnchecked","stringReplaceRangeUnchecked","ConstantMap.cast","ConstantMap.isEmpty","ConstantMap.toString","ConstantMap.[]=","ConstantStringMap.length","ConstantStringMap.containsKey","ConstantStringMap.[]","ConstantStringMap._fetch","ConstantStringMap.forEach","ConstantStringMap.keys","_ConstantMapKeyIterable.iterator","_ConstantMapKeyIterable.length","JSInvocationMirror.memberName","JSInvocationMirror.positionalArguments","JSInvocationMirror.namedArguments","JsLinkedHashMap.es6","ReflectionInfo.defaultValue","ReflectionInfo","Primitives.functionNoSuchMethod.<anonymous function>","TypeErrorDecoder.matchTypeError","TypeErrorDecoder.extractPattern","TypeErrorDecoder.provokeCallErrorOn","TypeErrorDecoder.provokePropertyErrorOn","NullError.toString","NullError","JsNoSuchMethodError.toString","JsNoSuchMethodError","UnknownJsTypeError.toString","unwrapException.saveStackTrace","_StackTrace.toString","Closure.toString","StaticClosure.toString","BoundClosure.==","BoundClosure.hashCode","BoundClosure.toString","BoundClosure.selfOf","BoundClosure.receiverOf","BoundClosure.computeFieldNamed","CastErrorImplementation.toString","CastErrorImplementation","RuntimeError.toString","RuntimeError","JsLinkedHashMap.length","JsLinkedHashMap.isEmpty","JsLinkedHashMap.keys","JsLinkedHashMap.containsKey","JsLinkedHashMap.internalContainsKey","JsLinkedHashMap.[]","JsLinkedHashMap.internalGet","JsLinkedHashMap.[]=","JsLinkedHashMap.internalSet","JsLinkedHashMap.clear","JsLinkedHashMap.forEach","JsLinkedHashMap._addHashTableEntry","JsLinkedHashMap._modified","JsLinkedHashMap._newLinkedCell","JsLinkedHashMap.internalComputeHashCode","JsLinkedHashMap.internalFindBucketIndex","JsLinkedHashMap.toString","JsLinkedHashMap._getTableCell","JsLinkedHashMap._getTableBucket","JsLinkedHashMap._setTableEntry","JsLinkedHashMap._deleteTableEntry","JsLinkedHashMap._containsTableEntry","JsLinkedHashMap._newHashTable","LinkedHashMapKeyIterable.length","LinkedHashMapKeyIterable.isEmpty","LinkedHashMapKeyIterable.iterator","LinkedHashMapKeyIterator","LinkedHashMapKeyIterable.contains","LinkedHashMapKeyIterator.current","LinkedHashMapKeyIterator.moveNext","initHooks.<anonymous function>","extractKeys","printString","_checkValidIndex","NativeTypedArray.length","NativeTypedArrayOfDouble.[]","NativeTypedArrayOfDouble.[]=","NativeTypedArrayOfInt.[]=","NativeInt16List.[]","NativeInt32List.[]","NativeInt8List.[]","NativeUint16List.[]","NativeUint32List.[]","NativeUint8ClampedList.length","NativeUint8ClampedList.[]","NativeUint8List.length","NativeUint8List.[]","_AsyncRun._initializeScheduleImmediate","_AsyncRun._scheduleImmediateJsOverride","_AsyncRun._scheduleImmediateWithSetImmediate","_AsyncRun._scheduleImmediateWithTimer","_makeAsyncAwaitCompleter","Completer.sync","_Completer.future","_asyncStartSync","_asyncAwait","_asyncReturn","_asyncRethrow","_awaitOnObject","_wrapJsFunctionForAsync","_registerErrorHandler","_microtaskLoop","_startMicrotaskLoop","_scheduleAsyncCallback","_schedulePriorityAsyncCallback","scheduleMicrotask","StreamIterator","_rootHandleUncaughtError","_rootRun","_rootRunUnary","_rootRunBinary","_rootScheduleMicrotask","_AsyncRun._initializeScheduleImmediate.internalCallback","_AsyncRun._initializeScheduleImmediate.<anonymous function>","_AsyncRun._scheduleImmediateJsOverride.internalCallback","_AsyncRun._scheduleImmediateWithSetImmediate.internalCallback","_TimerImpl","_TimerImpl.internalCallback","_AsyncAwaitCompleter.complete","_AsyncAwaitCompleter.completeError","_AsyncAwaitCompleter.complete.<anonymous function>","_AsyncAwaitCompleter.completeError.<anonymous function>","_awaitOnObject.<anonymous function>","_wrapJsFunctionForAsync.<anonymous function>","_Completer.completeError","_nonNullError","_Completer.completeError[function-entry$1]","_AsyncCompleter.complete","_AsyncCompleter.complete[function-entry$0]","_AsyncCompleter._completeError","_SyncCompleter.complete","_SyncCompleter.complete[function-entry$0]","_SyncCompleter._completeError","_FutureListener.matchesErrorTest","_FutureListener.handleError","_Future.then","_Future.then[function-entry$1]","_Future._thenNoZoneRegistration","_Future._addListener","_Future._prependListeners","_Future._removeListeners","_Future._reverseListeners","_Future._complete","_Future._completeError","_Future._setError","_Future._asyncComplete","_Future._chainFuture","_Future._asyncCompleteError","_Future._chainForeignFuture","_Future._chainCoreFuture","_Future._propagateToListeners","_Future._addListener.<anonymous function>","_Future._prependListeners.<anonymous function>","_Future._chainForeignFuture.<anonymous function>","_Future._chainForeignFuture[function-entry$1].<anonymous function>","_Future._asyncComplete.<anonymous function>","_Future._completeWithValue","_Future._chainFuture.<anonymous function>","_Future._asyncCompleteError.<anonymous function>","_Future._propagateToListeners.handleWhenCompleteCallback","_Future._propagateToListeners.handleWhenCompleteCallback.<anonymous function>","_Future._propagateToListeners.handleValueCallback","_Future._propagateToListeners.handleError","AsyncError.toString","_rootHandleUncaughtError.<anonymous function>","_RootZone.runGuarded","_RootZone.runUnaryGuarded","_RootZone.runUnaryGuarded[function-entry$2]","_RootZone.bindCallback","_RootZone.bindCallback[function-entry$1]","_RootZone.bindCallbackGuarded","_RootZone.bindUnaryCallbackGuarded","_RootZone.run","_RootZone.run[function-entry$1]","_RootZone.runUnary","_RootZone.runUnary[function-entry$2]","_RootZone.runBinary","_RootZone.runBinary[function-entry$3]","_RootZone.registerBinaryCallback","_RootZone.registerBinaryCallback[function-entry$1]","_RootZone.bindCallback.<anonymous function>","_RootZone.bindCallbackGuarded.<anonymous function>","_RootZone.bindUnaryCallbackGuarded.<anonymous function>","_RootZone_bindUnaryCallbackGuarded_closure","HashMap","LinkedHashMap","LinkedHashMap._empty","LinkedHashMap._makeEmpty","HashSet","_defaultHashCode","IterableBase.iterableToShortString","IterableBase.iterableToFullString","_isToStringVisiting","_iterablePartsToStrings","MapBase.mapToString","MapBase._fillMapWithIterables","_HashMap.length","_HashMap.isEmpty","_HashMap.keys","_HashMap.containsKey","_HashMap._containsKey","_HashMap.[]","_HashMap._get","_HashMap.[]=","_HashMap._set","_HashMap.forEach","_HashMap._computeKeys","_HashMap._addHashTableEntry","_HashMap._computeHashCode","_HashMap._getBucket","_HashMap._findBucketIndex","_HashMap._getTableEntry","_HashMap._setTableEntry","_HashMap._newHashTable","_CustomHashMap.[]","_CustomHashMap.[]=","_CustomHashMap.containsKey","_CustomHashMap._computeHashCode","_CustomHashMap._findBucketIndex","_CustomHashMap","_CustomHashMap.<anonymous function>","_HashMapKeyIterable.length","_HashMapKeyIterable.isEmpty","_HashMapKeyIterable.iterator","_HashMapKeyIterable.contains","_HashMapKeyIterator.current","_HashMapKeyIterator.moveNext","_HashSet.iterator","_HashSet.length","_HashSet.isEmpty","_HashSet.contains","_HashSet._contains","_HashSet.add","_HashSet._add","_HashSet.remove","_HashSet._remove","_HashSet._computeElements","_HashSet._addHashTableEntry","_HashSet._removeHashTableEntry","_HashSet._computeHashCode","_HashSet._getBucket","_HashSet._findBucketIndex","_HashSet._newHashTable","_CustomHashSet._findBucketIndex","_CustomHashSet._computeHashCode","_CustomHashSet.add","_CustomHashSet.contains","_CustomHashSet.remove","_CustomHashSet","_CustomHashSet.<anonymous function>","_HashSetIterator.current","_HashSetIterator.moveNext","IterableMixin.length","SplayTreeSet.iterator","_SplayTreeIterator","IterableMixin.isEmpty","IterableMixin.toString","ListMixin.iterator","ListMixin.elementAt","ListMixin.isEmpty","ListMixin.isNotEmpty","ListMixin.sort","ListMixin.+","ListMixin.toString","MapBase.mapToString.<anonymous function>","MapMixin.cast","MapMixin.forEach","MapMixin.containsKey","MapMixin.length","MapMixin.isEmpty","MapMixin.toString","_UnmodifiableMapMixin.[]=","MapView.cast","MapView.[]","MapView.containsKey","MapView.forEach","MapView.isEmpty","MapView.length","MapView.keys","MapView.toString","UnmodifiableMapView.cast","ListQueue.iterator","ListQueue.isEmpty","ListQueue.length","ListQueue.elementAt","ListQueue.toString","_ListQueueIterator.current","_ListQueueIterator.moveNext","SetMixin.isEmpty","SetMixin.toString","_SplayTree._splay","_SplayTree._splayMin","_SplayTree._splayMax","_SplayTree._remove","_SplayTree._addNewRoot","_SplayTree._first","_SplayTreeIterator.current","_SplayTreeIterator._findLeftMostDescendent","_SplayTreeIterator.moveNext","_SplayTreeIterator._rebuildWorkList","SplayTreeSet.length","SplayTreeSet.isEmpty","SplayTreeSet.add","SplayTreeSet.remove","SplayTreeSet.addAll","SplayTreeSet.toString","SplayTreeSet","SplayTreeSet._dummy","SplayTreeSet.<anonymous function>","_parseJson","_convertJsonToDartLazy","_defaultToEncodable","_JsonMap.[]","_JsonMap.length","_JsonMap.isEmpty","_JsonMap.keys","_JsonMap.[]=","_JsonMap.containsKey","_JsonMap.forEach","_JsonMap._computeKeys","_JsonMap._upgrade","_JsonMap._process","_JsonMapKeyIterable.length","_JsonMapKeyIterable.elementAt","_JsonMapKeyIterable.iterator","_JsonMapKeyIterable.contains","JsonUnsupportedObjectError.toString","JsonUnsupportedObjectError","JsonCyclicError.toString","JsonCodec.decode","JsonCodec.decode[function-entry$1]","JsonCodec.encode","JsonCodec.encode[function-entry$1]","JsonCodec.encoder","JsonCodec.decoder","_JsonStringifier.writeStringContent","StringBuffer.writeCharCode","_JsonStringStringifier.writeString","_JsonStringifier._checkCycle","_JsonStringifier.writeObject","_JsonStringifier.writeJsonValue","_JsonStringifier.writeList","_JsonStringifier.writeMap","_JsonStringifier.writeMap.<anonymous function>","_JsonStringStringifier._partialResult","_JsonStringStringifier.stringify","_JsonStringStringifier.printOn","_JsonStringStringifier","Error._objectToString","List.from","StackTrace.current","Error.safeToString","Map.castFrom","print","NoSuchMethodError.toString.<anonymous function>","DateTime.==","DateTime.compareTo","DateTime.hashCode","DateTime.toString","DateTime._fourDigits","DateTime._threeDigits","DateTime._twoDigits","NullThrownError.toString","ArgumentError._errorName","ArgumentError._errorExplanation","ArgumentError.toString","ArgumentError","ArgumentError.value","RangeError._errorName","RangeError._errorExplanation","RangeError.value","RangeError.range","RangeError.checkValidRange","IndexError._errorName","IndexError._errorExplanation","IndexError","NoSuchMethodError.toString","NoSuchMethodError","UnsupportedError.toString","UnsupportedError","UnimplementedError.toString","UnimplementedError","StateError.toString","StateError","ConcurrentModificationError.toString","ConcurrentModificationError","StackOverflowError.toString","CyclicInitializationError.toString","_Exception.toString","FormatException.toString","Iterable.contains","Iterable.length","Iterable.isEmpty","Iterable.elementAt","Iterable.toString","Null.hashCode","Null.toString","Object.==","Object.hashCode","Object.toString","Object.noSuchMethod","StringBuffer.length","StringBuffer.toString","StringBuffer.isEmpty","StringBuffer._writeAll","HttpRequest.request","Completer","WebSocket","_convertNativeToDart_XHR_Response","convertNativeToDart_AcceptStructuredClone","convertNativeToDart_SerializedScriptValue","_wrapZone","DomException.toString","EventTarget._addEventListener","HttpRequest.open","HttpRequest.open[function-entry$2$async]","HttpRequest.request.<anonymous function>","Location.origin","Location.toString","Node.toString","_EventStreamSubscription._tryResume","_EventStreamSubscription","_EventStreamSubscription.<anonymous function>","convertNativePromiseToDartFuture","_AcceptStructuredClone.findSlot","_AcceptStructuredClone.walk","DateTime._withValue","convertNativeToDart_DateTime","_AcceptStructuredClone.convertNativeToDart_AcceptStructuredClone","_AcceptStructuredClone.walk.<anonymous function>","_AcceptStructuredCloneDart2Js.forEachJsField","convertNativePromiseToDartFuture.<anonymous function>","_convertDartFunctionFast","_callDartFunctionFast","Function._apply1","allowInterop","keys","_moduleLibraries","JSArray.map","_reloadModule","_reloadPage","main","ReloadingManager","LibraryWrapper.onDestroy","LibraryWrapper.onSelfUpdate","LibraryWrapper.onChildUpdate","_moduleLibraries.<anonymous function>","_reloadModule.<anonymous function>","main.<anonymous function>","Module.onDestroy","Module.onSelfUpdate","Module.onChildUpdate","ReloadHandler.listener","HotReloadFailedException.toString","HotReloadFailedException","ReloadingManager.moduleTopologicalCompare","ReloadingManager.updateGraph","ReloadingManager.reload","_Completer.isCompleted","stronglyConnectedComponents","ListQueue","_defaultEquals","stronglyConnectedComponents.strongConnect","ListQueue.addLast","ListQueue._add","stronglyConnectedComponents_strongConnect","DART_CLOSURE_PROPERTY_NAME","JS_INTEROP_INTERCEPTOR_TAG","TypeErrorDecoder.noSuchMethodPattern","TypeErrorDecoder.notClosurePattern","TypeErrorDecoder.nullCallPattern","TypeErrorDecoder.nullLiteralCallPattern","TypeErrorDecoder.undefinedCallPattern","TypeErrorDecoder.undefinedLiteralCallPattern","TypeErrorDecoder.nullPropertyPattern","TypeErrorDecoder.nullLiteralPropertyPattern","TypeErrorDecoder.undefinedPropertyPattern","TypeErrorDecoder.undefinedLiteralPropertyPattern","_AsyncRun._scheduleImmediateClosure","_toStringVisiting","_hasErrorStackProperty","String","MappedListIterable","main_closure","request","Map","_AsyncCompleter","_Future","_current","int","_empty","","ReloadHandler","stringify","StringBuffer","unwrapException_saveStackTrace","ExceptionAndStackTrace","UnknownJsTypeError","StackOverflowError","Error","extractPattern","TypeErrorDecoder","CyclicInitializationError","provokePropertyErrorOn","provokeCallErrorOn","_SplayTreeKeyIterator","_SplayTreeNode","range","RangeError","ListIterator","value","NullThrownError","safeToString","_objectToString","Closure","objectTypeName","_objectClassName","Object","markFixed","markFixedList","UnknownJavaScriptObject","iterableToShortString","_writeAll","ArrayIterator","iterableToFullString","JsonCyclicError","List","_JsonStringifier_writeMap_closure","Null","stringFromCharCode","_AcceptStructuredCloneDart2Js","BoundClosure","FormatException","_JsonMap","mapToString","MapBase_mapToString_closure","MapMixin","castFrom","CastMap","CastIterator","Function","Future","EfficientLengthIterable","_EfficientLengthCastIterable","_JsonMapKeyIterable","noElement","sort","_doSort","_insertionSort","_dualPivotQuicksort","checkValidRange","tooFew","ListMixin","_Future__asyncComplete_closure","_propagateToListeners","_Future__propagateToListeners_handleWhenCompleteCallback","_Future__propagateToListeners_handleValueCallback","_Future__propagateToListeners_handleError","_chainCoreFuture","AsyncError","_StackTrace","StackTrace","_Future__propagateToListeners_handleWhenCompleteCallback_closure","_FutureListener","_Future__addListener_closure","_Future__prependListeners_closure","_rootHandleUncaughtError_closure","_nextCallback","_lastPriorityCallback","_lastCallback","_AsyncCallbackEntry","_isInCallbackLoop","_initializeScheduleImmediate","_AsyncRun__initializeScheduleImmediate_internalCallback","_AsyncRun__initializeScheduleImmediate_closure","_TimerImpl_internalCallback","_AsyncRun__scheduleImmediateWithSetImmediate_internalCallback","_Exception","_AsyncRun__scheduleImmediateJsOverride_internalCallback","_RootZone_bindCallback_closure","_RootZone_bindCallbackGuarded_closure","_Future__chainFuture_closure","_chainForeignFuture","_Future__chainForeignFuture_closure","_ListQueueIterator","_HashSet","objectHashCode","_newHashTable","_HashSetIterator","_CustomHashSet_closure","bool","_HashMap","_setTableEntry","_getTableEntry","_HashMapKeyIterable","_HashMapKeyIterator","_CustomHashMap_closure","DateTime","_makeEmpty","_AcceptStructuredClone_walk_closure","getYear","_fourDigits","getMonth","_twoDigits","getDay","getHours","getMinutes","getSeconds","getMilliseconds","_threeDigits","lazyAsJsDate","JsLinkedHashMap","LinkedHashMapCell","LinkedHashMapKeyIterable","convertNativePromiseToDartFuture_closure","_Future__asyncCompleteError_closure","ListIterable","_wrapJsFunctionForAsync_closure","_StreamIterator","_awaitOnObject_closure","initNativeDispatchFlag","getTagFunction","dispatchRecordsForInstanceTags","interceptorsForUncacheableTags","alternateTagFunction","JavaScriptIndexingBehavior","prototypeForTagFunction","initHooks_closure","_AsyncAwaitCompleter","_SyncCompleter","_AsyncAwaitCompleter_completeError_closure","_AsyncAwaitCompleter_complete_closure","_EventStreamSubscription_closure","Event","SplayTreeSet_closure","from","HotReloadableLibrary","Library","_moduleLibraries_closure","LibraryWrapper","_fillMapWithIterables","Module","fromTearOff","receiverOf","selfOf","StaticClosure","functionCounter","forwardCallTo","forwardInterceptedCallTo","cspForwardCall","selfFieldNameCache","computeFieldNamed","receiverFieldNameCache","cspForwardInterceptedCall","current","_reloadModule_closure","applyFunctionWithPositionalArguments","_genericApplyFunctionWithPositionalArguments","functionNoSuchMethod","Primitives_functionNoSuchMethod_closure","JSInvocationMirror","Symbol","NoSuchMethodError_toString_closure","ConstantMapView","_throwUnmodifiable","_ConstantMapKeyIterable","UnmodifiableMapView","Document","HttpRequest","HttpRequest_request_closure","JS_CONST","Interceptor","JSBool","JSNull","JavaScriptObject","PlainJavaScriptObject","JavaScriptFunction","JSArray","JSUnmodifiableArray","num","JSNumber","JSInt","JSDouble","JSString","Iterable","_CastIterableBase","FixedLengthListMixin","ConstantMap","ConstantStringMap","noSuchMethodPattern","notClosurePattern","nullCallPattern","nullLiteralCallPattern","undefinedCallPattern","undefinedLiteralCallPattern","nullPropertyPattern","nullLiteralPropertyPattern","undefinedPropertyPattern","undefinedLiteralPropertyPattern","TearOffClosure","NativeTypedData","NativeTypedArray","double","NativeTypedArrayOfDouble","NativeTypedArrayOfInt","NativeInt16List","NativeInt32List","NativeInt8List","NativeUint16List","NativeUint32List","NativeUint8ClampedList","NativeUint8List","_Completer","StreamSubscription","StreamTransformerBase","_Zone","_RootZone","_HashSetBase","IterableMixin","MapBase","_UnmodifiableMapMixin","MapView","SetMixin","SetBase","_SplayTree","Codec","Converter","JsonCodec","JsonEncoder","JsonDecoder","_JsonStringifier","DomException","EventTarget","HttpRequestEventTarget","Location","MessageEvent","Node","ProgressEvent","_AcceptStructuredClone","JsMap","JsError","DartLoader","_NativeTypedArrayOfDouble&NativeTypedArray&ListMixin","_NativeTypedArrayOfDouble&NativeTypedArray&ListMixin&FixedLengthListMixin","_NativeTypedArrayOfInt&NativeTypedArray&ListMixin","_NativeTypedArrayOfInt&NativeTypedArray&ListMixin&FixedLengthListMixin","_SplayTreeSet&_SplayTree&IterableMixin","_SplayTreeSet&_SplayTree&IterableMixin&SetMixin","_UnmodifiableMapView&MapView&_UnmodifiableMapMixin","_compareAny","_scheduleImmediateJsOverride","_scheduleImmediateWithSetImmediate","_scheduleImmediateWithTimer","_scheduleImmediateClosure","$intercepted$get$urlToModuleId$x","getInterceptor$x","hot_reload_client___reloadModule$closure","hot_reload_client___moduleLibraries$closure","hot_reload_client___reloadPage$closure","convert___defaultToEncodable$closure","getInterceptor$","$intercepted$get$length$asx","getInterceptor$asx","$intercepted$elementAt1$ax","getInterceptor$ax","$intercepted$toString0$IJavaScriptFunctionJavaScriptObjectabnsux","$intercepted$get$iterator$ax","$intercepted$get$isNotEmpty$ax","getInterceptor$s","$intercepted$$eq$Iu","$intercepted$$add$ansx","getInterceptor$ansx","$intercepted$get$isEmpty$asx","$intercepted$sort1$ax","_interceptors_JSArray__compareAny$closure","$intercepted$$gt$n","getInterceptor$n","$intercepted$compareTo1$ns","getInterceptor$ns","async___startMicrotaskLoop$closure","async__AsyncRun__scheduleImmediateJsOverride$closure","async__AsyncRun__scheduleImmediateWithSetImmediate$closure","async__AsyncRun__scheduleImmediateWithTimer$closure","strongly_connected_components___defaultEquals$closure","collection___defaultHashCode$closure","$intercepted$get$hashCode$IJavaScriptObjectabnsu","$intercepted$[]=$ax","$intercepted$get1$x","$intercepted$get$moduleParentsGraph$x","$intercepted$_addEventListener3$x","$intercepted$getModuleLibraries1$x","$intercepted$hot$onChildUpdate3$x","$intercepted$hot$onSelfUpdate1$x","$intercepted$hot$onDestroy0$x","$intercepted$forceLoadModule3$x","$intercepted$get$message$x","$intercepted$noSuchMethod1$Iu","$intercepted$keys0$x","functionThatReturnsNull","makeConstantList","_containsKey","reload","_add","_set","toString","_contains","noSuchMethod","_get","_remove","listener","isEmpty","dart.collection#_addNewRoot","encode","runBinary","moduleTopologicalCompare","open","call","remove","getModuleLibraries","registerBinaryCallback","contains","dart.async#_asyncCompleteError","writeMap","dart.collection#_splayMax","onSelfUpdate","dart.async#_thenNoZoneRegistration","_js_helper#_modified","dart.collection#_get","moveNext","iterator","_js_helper#_deleteTableEntry","run","dart.async#_removeListeners","complete","handleError","internalFindBucketIndex","setRange","dart.async#_reverseListeners","walk","internalComputeHashCode","get","updateGraph","compareTo","dart.collection#_contains","namedArguments","dart.collection#_removeHashTableEntry","dart.collection#_getBucket","_js_helper#_getTableBucket","forceLoadModule","dart.collection#_first","isNegative","moduleParentsGraph","runUnary","toJson","_interceptors#_codeUnitAt","addAll","writeList","dart.collection#_containsKey","dart.collection#_addHashTableEntry","completeError","dart.async#_addListener","_js_helper#_newLinkedCell","_js_helper#_getTableCell","cast","dart.convert#_process","urlToModuleId","decoder","bindCallback","dart.convert#_upgrade","_interceptors#_tdivSlow","matchesErrorTest","positionalArguments","dart.convert#_partialResult","dart.core#_errorName","dart.async#_asyncComplete","forEach","bindUnaryCallbackGuarded","dart.convert#_computeKeys","internalGet","dart.async#_complete","dart.collection#_computeHashCode","then","dart.collection#_splayMin","_js_helper#_newHashTable","_interceptors#_shrBothPositive","dart.collection#_remove","encoder","dart.async#_state","dart.collection#_computeKeys","dart.collection#_findBucketIndex","runUnaryGuarded","internalSet","onChildUpdate","writeJsonValue","hashCode","clear","message","dart.dom.html#_addEventListener","decode","dart.collection#_findLeftMostDescendent","_js_helper#_fetch","matchTypeError","runGuarded","dart.dom.html#_tryResume","containsKey","dart.collection#_add","substring","memberName","bindCallbackGuarded","origin","dart.collection#_computeElements","isNotEmpty","hot$onDestroy","hot$onSelfUpdate","length=","dart.async#_chainFuture","writeObject","_interceptors#_tdivFast","_js_helper#_addHashTableEntry","toList","dart.async#_resultOrListeners","defaultValue","dart.collection#_splay","add","forEachJsField","writeStringContent","dart.core#_errorExplanation","dart.collection#_set","dart.async#_completeError","internalContainsKey","dart.async#_prependListeners","dart.core#_contents=","onDestroy","dart.convert#_checkCycle","findSlot","_interceptors#_shrOtherPositive","_js_helper#_containsTableEntry","hot$onChildUpdate","elementAt","_js_helper#_setTableEntry","$indexSet","$index","$eq","$ge","$gt","$lt","$add","lookupInterceptorByConstructor","cacheInterceptorOnConstructor","objectToHumanReadableString","checkGrowable","checkMutable","listToString","compare","_","joinArguments","selfFieldName","receiverFieldName","extractFunctionTypeObjectFrom","isFunctionSubtype","_getRuntimeTypeAsString","write","_writeString","checkArguments","computeTypeName","formatType","isSupertypeOfNull","isSubtype","isJsArray","setDispatchProperty","markUnmodifiableList","es6","unvalidated","internal","_getBucket","_createTimer","_completer","sync","_AsyncAwaitCompleter._completer","future","_setValue","_scheduleImmediate","inSameErrorZone","_zone","_mayAddListener","_chainSource","_isComplete","_cloneResult","_setError","_setErrorObject","_setPendingComplete","_setChained","_hasError","_error","handleUncaughtError","handlesValue","handlesComplete","_removeListeners","_clearPendingComplete","_completeWithValue","handleWhenComplete","handleValue","_rethrow","writeAll","_workList","checkValidIndex","_checkModification","_compare","_rebuildWorkList","_dummy","_isUpgraded","_setProperty","convert","writeStringSlice","writeCharCode","_JsonStringStringifier.writeCharCode","fromCharCode","writeString","_removeSeen","writeNumber","printOn","printToConsole","year","month","day","hour","minute","second","millisecond","checkNotNegative","_writeOne","listen","addEventListener","fromMillisecondsSinceEpoch","_withValue","isJavaScriptSimpleObject","readSlot","writeSlot","apply","_apply1","Function.apply","applyFunction","fromIterables","map","response","_running","_moduleOrdering","replaceFirst","data","MessageEvent.data","isCompleted","_mayComplete","first","addLast","_grow","min","removeLast","provokeCallErrorOnNull","provokeCallErrorOnUndefined","provokePropertyErrorOnNull","provokePropertyErrorOnUndefined"],
-  "mappings": "A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuFAA,kBA6BEA,uBAEFA,C;GAWAC,YACMA;AAEAA;AAAJA,WACEA,eACEA;+BAKJA,YAEeA;AAAbA,UAAoBA,UAuDxBA;AAtDIA,UAAmBA,QAsDvBA;AApDqCA;AAAjCA,SACEA,UAmDNA;AA/CIA,WAKEA,UAAUA,+BAA4CA,cAOTA;AA2CfA;AA1ClCA,WAAyBA,QAkC3BA;AA9BgBA;AACdA,WAAyBA,QA6B3BA;AAvBEA,wBAIEA,UAmBJA;AAhB8BA;AAA5BA,WAEEA,UAcJA;AAXEA,wBAIEA,UAOJA;AALEA,iDAiB4BA;AAf1BA,UAGJA,CADEA,UACFA,C;;EAsIgBC,cAAaA,YAAsBA,C;GAEzCC,YAAYA,OAAWA,OAAoBA,C;QAE5CC,YAAcA,sBCuZLA,WDvZiDA,C;SAgBzDC,cACNA,UAAUA,OAAmCA,QAC9BA,QAAgCA,cACjDA,C;;;EAYOC,YAAcA,gBAAgCA,C;GAU7CC,YAAYA,sBAAwCA,C;;;EAe9CC,cAAaA,cAAsBA,C;EAG1CC,YAAcA,YAAMA,C;GAEnBC,YAAYA,QAACA,C;GAObC,cAAuCA,OAAMA,YAAwBA,C;;;GAsCrEC,YAAYA,QAACA,C;QAOdC,YAAcA,gBAA+BA,C;;;;;;;;;;;;;;;;;EA8B7CC,YACiCA;AACtCA,WAAyBA,OAAaA,UAExCA;AADEA,iCAAkCA,YACpCA,C;;;EEvWKC,cANHA,oBACEA,IAAUA;SAQdA,C;GA2GKC,cACCA;AArHJA,oBACEA,IAAUA;AAsHZA,kCAKFA,C;EA4HEC,cACWA;AAAXA,WACFA,C;GAiDKC,oBAAQA;AAjTXA,sBACEA,IAAUA;AAmTDA;AACEA;AACbA,SAAiBA,MAiCnBA;AApBsCA,cAClCA,UAA2BA;AAE7BA,OAIEA,oBAIwBA;AAAVA,8BAASA;AAATA,iBAIdA,iBACwBA;AAAVA,8BAASA;AAATA,YAIlBA,C;EAtCKC,4C;GAsGAC,cAvZHA,sBACEA,IAAUA;AAwZPA,eAAsBA,SAC7BA,C;GA8DSC,YAAWA,mBAAWA,C;IAEtBC,YAAcA,mBAAQA,C;EAExBC,YAAcA,OC3iBJA,eD2iB+BA,C;GAchCC,YAAYA,OA0G5BA,sBA1GsDA,C;GAE9CC,YAAYA,OAAWA,OAAoBA,C;GAE3CC,YAAUA,eAAiCA,C;GAE/CA,cA1eFA,oBACEA,IAAUA;AA+eZA,OACEA,UAAUA;UAKdA,C;EAEWC,cAETA,oBAAkCA,UAAMA;AACxCA,WACFA,C;EAEcC,gBApgBZA,sBACEA,IAAUA;AAqgBZA,0CAAmBA,UAAMA;AACzBA,oBAAkCA,UAAMA;MAE1CA,C;EAWiBC,cACXA;AAAmBA,iBAAeA;AAC5BA;AACNA;AACFA;AACAA;AAHFA,QAIFA,C;;;;GAljBQC,cACJA,YAA0CA,WAA8BA,C;GAKhEC;AAKVA,QACFA,C;IAwaWC,cAGTA,OEjbgDA,SFkblDA,C;;;GAyLMC,WAAWA,aAAQA,C;EAEpBC,WACCA;AAASA;AAAUA;AAKvBA,cACEA,UAAMA;AAGJA;AAAJA,SACEA;AACAA,QAKJA,CAHEA;AACAA;AACAA,QACFA,C;;GGxsBIC,cACFA;uBAAeA,UAAMA;AACrBA,OACEA,QAmBJA;KAlBSA,OACLA,QAiBJA;KAhBSA,UACLA,UACuBA;AACjBA,mBAA2BA,QAarCA;AAZUA,eAAYA,QAYtBA;AAXMA,QAWNA,CATIA,QASJA,+BANMA,QAMNA;AAJIA,QAIJA,MAFIA,QAEJA,C;IAESC,YAAcA,sBAAuCA,C;EAiMvDC,YACLA,gBACEA,YAIJA;KAFIA,UAEJA,C;GAEQC,YAAYA,mBAAiCA,C;EAInCC,cAEhBA,UACFA,C;GA2CIC,cAEFA,sBAEMA,YACRA,C;GAEIC,cACEA;AACJA,iCAEEA,UAgBJA;AAdEA,QAGEA,WACEA,oBAUNA,MARSA,UAELA,mBAMJA;AAFEA,UAAUA,wCAC6BA,YAA0BA,iBACnEA,C;GA4BIC,cACFA;OACMA;;WADNA,QAOFA,C;GAOIC,cACFA,mBASFA,C;EAsBcC,cACZA,uBAAmBA,UAAMA;AACzBA,UACFA,C;;;;;GCxXIC,cACFA,eAAqBA,UAAMA;AAC3BA,sBACFA,C;EAyBgBC,cACdA,uBAAsBA,UAAUA;AAChCA,UACFA,C;EAqGOC,gBAELA,WAAiCA;AAGjCA,OAA2BA,UAAUA;AACrCA,cAAuBA,UAAUA;AACjCA,uBACFA,C;GAROC,sC;GAuREC,YAAWA,mBAAWA,C;GAI3BC,cACFA;uBAAsBA,UAAMA;;;AAC5BA,QACFA,C;EAGOC,YAAcA,QAAIA,C;GAQjBC,YAGFA;AACJA;AAEoBA;QAGFA;AAEGA;AAArBA,kCACFA,C;GAIQC,YAAUA,eAA4BA,C;;GCua5BC,WAAeA,OCvWjCA,sBDuW6DA,C;GAI3CC,WAAYA,OC3W9BA,4BD2WgEA,C;GE/1BpDC,cACVA,SAAgBA,WAClBA,C;GAqBYC,kBAEVA,WACEA;KAEAA,aAEJA,C;GAEYC,kBAEVA;AAOEA,oBAPFA,UACWA;AAEDA;AAARA,UAA6BA,cAAPA,KAAQA;AACnBA;AAATA,QAAOA;AADDA,IAIRA,WAEJA,C;GAEYC,oBAAsBA;AAKNA;AACbA;AACAA;AACMA;AACNA;AACAA;AAEHA;;AACAA;AACAA;AACAA;AACAA;AAGCA,OAAPA,eAUQA;AAKAA;IAVDA,OAAPA,eAeaA;AAUAA;IApBNA,OAAPA,eAUQA;AALKA;IAANA,OAAPA,eAeQA;AALAA;IALDA,OAAPA,eA+BQA;AA1BKA;IAANA,OAAPA,eAUaA;AAKLA;IAVDA,OAAPA,eAKQA;AAKKA;IALNA,OAAPA,eAWSA;AAMDA;IAZDA,OAAPA,eAOSA;AAMDA;IAFZA;AACAA;AACAA;AAEYA,mCAACA;AAAbA;AACYA,sCAACA;AAAbA;AAEWA;AACCA;AAEoBA,OAAPA,eAiBvBA,kBACWA,8BAACA;AAADA;AACEA;AACXA,SAAeA;AACXA,mCAAKA;AAATA,QACEA,UACSA,8BAACA;AAARA;AACAA,WAEFA,mBAYiBA,mCAACA;AAATA;AACHA,mCAAKA;AAATA,QACEA;AAGAA,cAUOA;;AATFA,QAEEA,uBAACA;AAARA;AACMA;AAAMA,8BAACA;AAAbA;AACAA;;;AACAA,WAGOA,uBAACA;AAARA;AACAA;;AAGAA,SAmFNA,UA5DFA,kBACWA,8BAACA;AAADA;AACSA;AACdA,mCAAYA;AAAhBA,QACEA,UACSA,8BAACA;AAARA;AACAA,WAEFA,SAEkBA;AACdA,mCAAYA;AAAhBA,iBAEuBA,mCAACA;AAATA;AACPA,mCAAKA;AAATA,QACEA;AACAA,OAAeA;AAGfA,cAGeA,8BAACA;AAATA;AACHA,mCAAKA;AAQAA;;AARTA,QAESA,uBAACA;AAARA;AACMA;AAAMA,8BAACA;AAAbA;AACAA;SAGOA,uBAACA;AAARA;AACAA;AAEFA,SA2BRA,KAdQA;AAAFA,8BAACA;AAAXA;AACAA;AACaA;AAAFA,mCAACA;AAAZA;AACAA;AAQAA;AACAA;AAEAA,KAGEA,MAqFJA;AA9EEA,aACEA,UAAeA,8BAACA;AAAFA,QAAPA,uBACLA,IAEFA,UAAeA,mCAACA;AAAFA,QAAPA,uBACLA,IAmBFA,kBACWA,8BAACA;AAADA;AACSA,mBAEhBA,UACSA,8BAACA;AAARA;AACAA,WAEFA,SAEkBA,4BAGKA,mCAACA;AAATA,sBAETA;AACAA,OAAeA;AAGfA,cAGeA,8BAACA;AAATA;AACHA,mCAAKA;AAQAA;;AARTA,QAESA,uBAACA;AAARA;AACMA;AAAMA,8BAACA;AAAbA;AACAA;SAGOA,uBAACA;AAARA;AACAA;AAEFA,QAYVA,oBAOAA,cAEJA,C;;GCpXgBC,YAAYA;OAgD5BA,SAhD2DA,iBAASA,C;GAuB5DC,YAAUA;OAAQA,OAAMA,C;GACvBC,YAAWA;OAAQA,OAAOA,C;EAW9BC,cAA0BA,oBAAuBA,C;EAQ/CC,YAAcA,kBAAkBA,C;;;EAMlCC,WAAcA,iBAAkBA,C;GAC/BC,WAAWA,OAAgBA,KAARA,wBAAYA,C;;GAQ7BC,gBACKA,0BACTA,OAUJA,iBAPAA;AADEA,OANFA,iBAOAA,C;;;;EAwLYC,gBAAkBA,OAF9BA,iBAEkCA,6BAAgCA,C;EAI7DC,YAA2BA,kBAAwBA,C;EAE7CC,cAAkBA,OAAaA,KAAbA,0BAAiBA,C;EAEhCC,gBACZA,WAAYA,oBAAeA,oBAC7BA,C;EAeKC,cACHA,WAAgBA,iBAGlBA,C;GAEgBC,YAAQA;OAAIA,KAA4BA,QAA5BA,wBAAiCA,C;GAIrDC,YAAUA;OAAQA,OAAMA,C;GAEvBC,YAAWA;OAAQA,OAAOA,C;;;;GAXjBC;AACdA,UAAMA,iBAAYA,iBACnBA,C;GAFeC;gD;;;GH3PFC,YAAYA,OAqS5BA,cAEyBA,gBAvS4BA,C;GAY5CC,YAAWA,wBAAWA,C;EAkB1BC,cACCA;AAAcA;AAClBA,iBACMA,sBAAyBA,QAMjCA;AALuBA,qBACjBA,UAAUA,WAGdA,QACFA,C;GA0IQC,cACEA;AAEMA;AAAIA,SAASA;AAI3BA,QAAoBA,gBAApBA,KACcA;AAAZA,8BAAMA;AAANA,OAEFA,QACFA,C;GAXQC,iC;;GAyHFC,WAAWA,aAAQA,C;EAEpBC,WACCA;AAASA;AAAUA;;AACvBA,cACEA,UAAUA;AAERA;AAAJA,SACEA;AACAA,QAKJA,CAHaA;AAEXA,QACFA,C;;GAmEQC,YAAUA,OAAQA,WAAMA,C;EAC9BC,cAAwBA,iBAAGA,eAAyBA,C;;;;;;GI5Y9CC,YACFA;AACJA,WAAkBA,QAKpBA;AAH8CA;;AAE5CA,QACFA,C;EAGAC,YAAcA,iBAAUA,gBAAQA,C;ECoFlBC,cAAEA,mBAAkDA;AAAvCA,qCAAuCA,C;;GCvDtDC,WACVA,UAAUA,sCACZA,C;GZ0DKC,YACEA;AACPA,uBAAyBA,QAG3BA;;AAF+BA,QAE/BA,C;IAmGAC,YACEA,oBAEFA,C;GAOKC,cACHA;YAEMA;AAAJA,WAAoBA,QAGxBA,CADEA,QAAcA,WAChBA,C;EAEOC,YACLA;uBAAqBA,QAgBvBA;AAfEA,wBACEA,SAEEA,UAYNA,MAVSA,UACLA,YASJA;KARSA,UACLA,aAOJA;KANSA,WACLA,YAKJA;AAHYA;AACVA,uBAAoBA,UAAMA;AAC1BA,QACFA,C;GA8RaC,YACLA;AACJA;kBAIAA,QACFA,C;GAuHcC,YAGZA,OAFmBA,Qa7UdA,Kb8U4BA,cAEnCA,C;GAEcC,YACRA;AAAcA;AASuBA;AAAzCA,yBAEMA;kCAKFA;;AAAJA,yBAkBWA;;AACTA,iBAK2CA;AAAzCA,qCAGuBA;AACjBA;6CAMRA,QAaJA,CAJMA;AAGJA,OAAOA,iBAH0BA,iBACxBA,cAGXA,C;EA6GcC,YACZA;AACEA,YACEA,6BAYNA;AATIA,eACaA;AAGXA,kCADqBA,+BAM3BA,CADEA,UAAUA,4BACZA,C;EAyFOC,YACLA;AAIAA,aACFA,C;GAmBOC,YAEwCA;AAD7CA,QAGFA,C;GAKOC,YAEwCA;AAD7CA,QAGFA,C;GAKOC,YAEyCA;AAD9CA,QAGFA,C;GAKOC,YAE0CA;AAD/CA,QAGFA,C;GAKOC,YAE4CA;AADjDA,QAGFA,C;GAKOC,YAE4CA;AADjDA,QAGFA,C;GAKOC,YAGgDA;AAFrDA,QAIFA,C;GAkCOC,gBAEDA;AAFCA;AAEDA;AAMFA;AAqBEA;AAvBJA,YACuCA;AACrCA,YAGKA;AACuCA,qBAC5CA,MAAuBA;AAWzBA,OAAOA,OA3vBTC,qCAkwBAD,C;GAwNOE,cAEAA;AAELA,WAIoBA;;AAMNA;AAAdA,UAEEA,UACEA,aAiCNA,MA/BSA,UAELA,UACEA,iBA4BNA,MA1BSA,UAELA,UACEA,sBAuBNA,MApBSA,UAELA,UACEA,2BAiBNA,MAdSA,UAELA,UACEA,gCAWNA,MARSA,SAELA,UACEA,qCAKNA;AADEA,OAAOA,SACTA,C;GAEOC,cAEDA;AAA0BA;AAI1BA;AAAJA,YACoBA;AAIlBA,WACEA,OAAOA,cAoBbA;AAlB8BA;AACOA;AAE7BA;AACJA,iBAGEA,OAAOA,cAWbA;AAToBA;AAChBA,gBACEA,sBAA0BA,UAM9BA,mBACFA,C;EAwGFC,cACEA,WAA+BA;AAC/BA,UAAMA,UACRA,C;GAOMC,cACJA;0CAAmBA,OOv0CnBA,0BPg1CFA;AARyBA;AAGvBA,aACEA,OAAWA,wBAIfA;AADEA,OAAWA,oBACbA,C;GA+BcC,YACZA,OOh3CAA,uBPi3CFA,C;GAQAC,YACEA,uBAAmBA,UAAMA;AACzBA,QACFA,C;EAwBAC,YACEA;WOj8CAA;APo8CkCA;;AAElCA;;AAcAA,QACFA,C;IAGAC,WAGEA,OAAOA,wBACTA,C;EAQAC,kBACwBA,MACxBA,C;GAmCAC,YACEA,UAAUA,OACZA,C;EAuYAC,YAIEA;AAAcA;AAYdA,WAAgBA,MAkHlBA;AAjHEA,qBACEA,OAAOA,SAgHXA;AA9GEA,uBAA6CA,QA8G/CA;AA5GEA,wBACEA,OAAOA,qBA2GXA;KA1GSA,qBACLA,QAyGJA;AAhFwCA;AAhBtCA,6CAOoBA;;AACMA,4BAKtBA,mBAEIA,OAAOA,KACCA,KAAsBA,8BAgFxCA;mBA7EUA,OAAOA,KACCA,KAAYA,8BA4E9BA,EAvEEA,2BAI8BA;AACMA;AACFA;AACOA;AACNA;AACOA;AACJA;AACOA;AACNA;AACOA;AAC/BA;AAAbA,WACEA,OAAOA,KAAmBA,UAwDhCA;KAvDwBA;AAAbA;AAMLA,OAAOA,KAAmBA,UAiDhCA,MAhDwBA;AAAbA,YACMA;AADNA,YAEMA;AAFNA,YAGMA;AAHNA,YAIMA;AAJNA,YAKMA;AALNA,YAMMA;AANNA,YAOMA;AAPNA;KAQLA,OAAOA,KAAmBA,UAwChCA,EAlCIA,OAAOA,KAtHTA,mCAwJFA,CA9BEA,iFAEIA,OOxjDEA,UPolDRA;yDApBQA;AAGJA,OAAOA,KO1+DTA,4EP2/DFA,CAbEA,gEAIEA,iDACEA,OO5kDEA,UPolDRA;AADEA,QACFA,C;EAuBWC,YACTA;qBACEA,UAOJA;AALEA,WAAuBA,OAUvBA,WALFA;AAHMA;AAAJA,WAAmBA,QAGrBA;AADEA,sBAMAA,WALFA,C;IA4CAC,sBAEEA,iBAEIA,OAAOA,MAWbA;OATMA,OAAOA,OASbA;OAPMA,OAAOA,SAObA;OALMA,OAAOA,WAKbA;OAHMA,OAAOA,aAGbA,CADEA,Uc1sEAC,gEd2sEFD,C;EAMAE,cACEA;WAAqBA,MAkBvBA;AAhByBA;AAAvBA,OAAkCA,QAgBpCA;kEAF0CA;;AACxCA,QACFA,C;GAmDSC,wBAAWA;AAoBgCA;AAwHlBA;AAhHXA;AAESA,iBAuEWA;kBA2VrCA,gDA0BJA;;;KAzYcA;AACeA;;;;;AAU3BA,OACeA;;AA8COA,IAtCtBA;KAeOA,wBACLA;KAcMA;4FAGNA;;;AAOFA,4BACaA;AAGPA;AAAJA,YAC2BA;OAG3BA;;;;AAaFA,QACFA,C;GAEOC,kBAEDA;AAGJA,sBAEIA,iEAsENA;OA5DMA,mEA4DNA;OAlDMA,uEAkDNA;OAxCMA,2EAwCNA;OA9BMA,+EA8BNA;OApBMA,mFAoBNA;QAVMA,+EAUNA,E;GAIOC,gBACLA;KAAmBA,OAAOA,SAmC5BA;AAhCkDA;AAOpBA;AAFYA;AAApBA;AAEPA;AAAbA,KACEA,OAAOA,cAwBXA;AArBEA,UAE2BA;AAAeA;;AAK9BA;;AA+PRA;AAAJA,YACuBA;OApQrBA,8CAKuBA,gBAa3BA;AAPkBA;AAAeA;;AAA/BA;;AAwPIA;AAAJA,YACuBA;OAxPvBA,iCAIkDA,qBAEpDA,C;GAEOC,kBAEDA;AAkBIA;AACAA;AAfRA,sBAIIA,UAAUA;OAEVA,4EA+ENA;OApEMA,+EAoENA;OAzDMA,mFAyDNA;OA9CMA,uFA8CNA;OAnCMA,2FAmCNA;OAxBMA,+FAwBNA;QAbMA;;kCAaNA,E;GAEOC,cACEA;AAiJHA;AAAJA,YACuBA;OAQnBA;AAAJA,YAC2BA;OAtJqBA;AAOpBA;AAFYA;AAApBA;AAEPA;AAAbA,KACEA,OAAOA,cAuBXA;AArBEA,UAKoBA,8CAAWA,gBAAeA;AACrCA;AAAeA;;AALtBA,8BAoBJA,wDA3IEF,AAuIsBE;AACJA,mDAAWA,gBAAeA;AACrCA;AAAeA;;AALtBA,8BAOFA,C;GAmBFC,wBAEEA,OAAeA,uBAQjBA,C;GAmOAC,YACEA,gCAAsCA,QAExCA;AADEA,UAAUA,iBACZA,C;GAmDKC,cAGHA,UAAUA,OAA+BA,KAAcA,iBACzDA,C;GA2CAC,cACEA;WAG2BA;KAH3BA;KAIEA,QAGJA;AADEA,SACFA,C;GA8GAC,YACMA;AACJA,cAEyCA;AAAvCA,sBACEA,oBAMNA;KAJMA,aAINA,CADEA,MACFA,C;GAEAC,cACEA;WAAmBA,QAcrBA;AAbEA,wBAQEA,QAKJA;AA/BSA,OADWA;AA8BlBA,WAAgCA,QAElCA;AADEA,Oa95EOA,mBb+5ETA,C;GAkFOC,YACLA;AAAUA;AAAVA,YAlHOA;AAoHLA,WACEA,OAAOA,OAKbA;AAHIA,eAGJA,CADEA,OAAkBA,OACpBA,C;GAmDKC,YACHA,UO/wFAA,YPgxFFA,C;GAuDOC,YAELA,4BACFA,C;Ea/yGOC;AAILA,QACFA,C;EAMAC,YACEA,WAAoBA,MAGtBA;AADEA,YACFA,C;GAGAC,gBAGEA,OAAOA,WAD2CA,QAClBA,OAClCA,C;GASAC,kBAVSA,iBAD2CA,QAClBA;AAchCA,wBACFA,C;GASAC,gBAxBSA,iBAD2CA,QAClBA;AA0BhCA,wBACFA,C;EAQAC,cACYA;AACVA,wBACFA,C;GAoBOC,YACLA,OAAOA,WACTA,C;EAEOC,cACLA;WACEA,eAiCJA;AA/BEA,UACEA,YA8BJA;AA5BEA,wDAEEA,OArBiBA,uBACCA,WA8CtBA;AAxBEA,wBAEEA,OAAOA,mBAsBXA;AApBEA,UACEA,eAmBJA;AAjBEA,wBAEEA,6BACEA,kCAAmCA,MAczCA;AAZ4CA;AAAOA;AAArCA,4BAAcA;AAAxBA,OAAUA,SAYdA,CAVEA,eAEEA,OAAOA,SAQXA;AANEA,mBAEEA,kBAAmBA,kCAIvBA;AADEA,4BACFA,C;GAaOC,cACEA;AAIPA,kBAQeA;AANbA,YAC2BA;YAEWA;AAEVA;AAC5BA,2BACEA;AAKFA,mCACEA;AACgDA;AAAOA;AAArCA,sBAAcA;AAAhCA;AAEeA;AACfA,oBAEoBA,wBAGtBA,YAoEQA;OA1DSA;AAQnBA,gBAEuBA;AAArBA;AAEmBA,qBAUnBA;AAAmBA,KAFrBA,eAIuBA;AAFrBA;AAEAA;AAEmBA,eAGnBA,OAMFA,iBAIkCA;AAFhCA;AAEoBA,kCAApBA;AAEmBA,uBAEGA,QAGtBA,OAGFA;AASAA,wBACFA,C;GAWOC,gBACLA;WAAmBA,QAerBA;AEqMEA;AF/MAA,8CEiPEC;AF7OID;AAAJA;AAGaA,gBAEfA,UAAUA,UACZA,C;EAyDAE,cACEA,WAA0BA,QAiB5BA;AAbMA;AAAJA,WAA0BA,MAa5BA;AAZEA,wDAKEA,QAOJA;AALEA,wBAEEA,sBAGJA;AADEA,QACFA,C;EAcKC,kBACHA;WAAoBA,QAYtBA;AAXkBA;AAIEA;AAGlBA,cAAwBA,QAI1BA;AADEA,OAmDOA,KAAYA,wBAlDrBA,C;GAaOC,kBACLA,WAAoBA,QAItBA;AAHMA,gBAAgDA,QAGtDA;AADEA,UAAUA,+EAAgCA,CARtCA,qBAlIGC,yCA2ITD,C;GA+CKE,kBAEHA;WAAeA,QAsBjBA;AArBEA;AAEEA,gBACOA,0BACHA,QAiBRA;AAdIA,QAcJA;AANEA,gBACOA,uBACHA,QAINA;AADEA,QACFA,C;GAMAC,gBAIEA,iBApbOA,IAibWA,YAlbgCA,QAClBA,QAqblCA,C;GAsCKC,YACHA;uBAGEA,QAQJA;AANEA,oBAGiCA;AAD/BA,0EACIA,OAGRA,CADEA,QACFA,C;GAsBKC,cACHA;WAAeA,0EAzDuBA,OA0FxCA;AAhCEA,gDAAkBA,QAgCpBA;AA/BEA,uBACEA,mBAUMA,mCAA6CA,QAoBvDA;AAjBIA,eACEA,OAAOA,SAgBbA,CAZoBA;AAERA;AACVA,YAK8BA;;AAGbA,IAAjBA,OAsCOA,kBArCTA,C;GAGOC,cACkBA,uBACrBA,UAAUA,OAAgCA;AAE5CA,QACFA,C;EAgCKC,kBAEHA;SAAuBA,QAmGzBA;AAhGEA,gDAAkBA,QAgGpBA;AA9FEA,UAAuCA,QA8FzCA;AA3FEA,iDACEA,uBAGEA,QAuFNA;AArFIA,mBAGEA,OAAOA,kCAkFbA;AAhFIA,QAgFJA,CA1EEA,uBAEEA,QAwEJA;AAtEEA,uBAAuCA,QAsEzCA;AApEEA,uBAAmBA,QAoErBA;AAlEEA,eACEA,OAAOA,aAiEXA;AA9DEA,eAGEA,2BA2DJA;AA8TeA;AArWaA;AAb1BA,oBAM2CA;AAHzCA,mBAGEA,OAAOA,kCA8CbA;KA7CeA,gBAETA,QA2CNA;KAvCMA,8BAEEA,QAqCRA;AAhCuCA;AAAXA;AAItBA,OAAOA,yEA4BbA,EA8TeA;AA/UMA;AAAnBA,UAEiCA;AAA/BA,4BACEA,QAcNA;2BADMA;AALJA,MACEA,QAKJA;;;AAFEA,OAvSOA,KAAYA,eAySrBA,C;GAQKC,kBAAkBA;AAErBA,kBAA4BA,QA2F9BA;AApFEA,kBACEA,oBAAqCA,QAmFzCA;AAhFuCA;AACAA;AACnCA,uBAA8CA,QA8ElDA,MAxESA,iBACLA,QAuEJA;AAlEOA,yBAAkDA,QAkEzDA;AAtDuBA;AACAA;AAGjBA;AAEAA;AAEAA;AAAiBA;AAIAA;AACAA;AALrBA,OAEEA,QA4CJA;AA1CEA,WAGEA,QAuCJA;AAlCEA,gBACOA,uBAEHA,QA+BNA;AAxBEA,wBACOA,uBAEHA,QAqBNA;AAfEA,oBACOA,uBAEHA,QAYNA;AAHMA;AADAA;AAAJA,WAA8BA,QAIhCA;AAHEA,WAA8BA,QAGhCA;AAFEA,OAAOA,aAETA,C;GAEKC,kBAA2BA;;AAO9BA,4BACaA;oCAETA,QAONA;AAHSA,uBAAsCA,QAG/CA,CADEA,QACFA,C;GG70BKC,qGAQLA,C;GA8EAC,YAAyBA;AAEVA;AAKTA;AAAJA;AAAoBA,UAkEtBA,CAhEMA;AAAJA,WAAyBA,QAgE3BA;AA3DMA;AAAJA,YACQA;AACNA,YAGMA;AAAJA;AAAoBA,UAsD1BA,CApDUA;AAAJA,WAAyBA,QAoD/BA;6BA9CEA,WAQEA,MAsCJA;AA9BoCA;AAD9BA;AAAJA,YACWA;;;AAETA,UA4BJA,CAzBEA;AAEEA,QAuBJA,CApBEA,YACyBA;sBjBzIrBC;AiByIFD,UAmBJA,CAhBEA,WACEA,OAAOA,SAeXA;AAZEA,WAEEA,UAAUA;AAKZA,4BACyBA;sBjBxJrBC;AiBwJFD,UAIJA,MAFIA,OAAOA,SAEXA,C;GAYAE,cAE+CA;yDAAhCA;AAEbA,QACFA,C;GAEAC,YAGEA,OAAOA,wBACTA,C;GAEAC,gBACMA;AAEJA,2BACEA,OAAOA,OAIXA;KAFIA,OAAOA,mBAEXA,C;GAiBKC,WACHA,aAAoCA,MAGtCA;;AADEA,MACFA,C;GAGKC,WAA0BA;;;AAI7BA;AAMiEA;;AAEjEA;;AAGEA,wBACYA;AACEA;AACZA,YAEeA;AACbA;iBAYNA,wBAEyCA;yBAEQA;;;;;YAOnDA,C;GAqCKC,WAECA;AAKgEA;AAY5DA,UAJAA,QAFAA,QADAA,QADAA,QADAA,QAHAA,IAAsBA;AAoB9BA,2DAE2CA;AAAzCA,wBAGyCA;AAAzCA,wBACEA,wBAE2CA;AAAzCA,wBAoBkBA;;;AATPA;AAEbA;AAEAA,gBACNA,C;EAEAC,cAEEA,OAAwBA,OAC1BA,C;GCvLAC,kBAGQA;AAAJA,OAAeA,QAcnBA;AAZIA,OAAOA,sBAYXA,C;GAcOC,kBAEDA;AAEKA;AAAmBA;AAA5BA,YACFA,C;;;EL3OcC,gBAAkBA,OAAIA,sCAA4BA,C;GACrDC,YAAWA,wBAAWA,C;EAIxBC,YAAcA,OAAQA,UAAiBA,C;EAMhCC,gBAAqBA,aAAoBA,C;;;GAgD/CC,YAAUA,aAA4BA,C;EAOzCC,YACHA,uBAAoBA,QAGtBA;AAFEA,mBAAwBA,QAE1BA;AADEA,+BACFA,C;EAEWC,cACJA,cAAkBA,MAEzBA;AADEA,iBACFA,C;GAGAC,YAAeA,gBAAgCA,C;EAE1CC,cAICA;;AACJA,4BACYA;AACVA,OAAOA,YAEXA,C;GAEgBC,YACdA,OA4BFA,eA5BaA,aACbA,C;;GA6BgBC,YAAYA;OXuhB5B/J,sBWvhBoD+J,C;GAE5CC,YAAUA,sBAAsBA,C;;IZ+J7BC,WACyBA;AAAPA,QAE7BA,C;IAiBSC,WACPA;cAAcA,UAShBA;AAPMA;AAAkBA;AACtBA,SAAwBA,UAM1BA;AClQwCA;AD8PtCA,iBACWA,8BAAUA;AAAnBA;;AAEFA,QACFA,C;IAEyBC,WACvBA;cAAgBA,UAWlBA;AAV2BA;AAAoBA;AAEzCA;AAAkBA;AACtBA,SAA6BA,UAO/BA;AANgBA;AkBxUhBC;AlByUED,iBACyCA,8BAAmBA;AAAnBA;AACxBA;AAAXA,mCAAUA;AADdA,MW1QEA,kBX6QJA,OY/WFA,oBZgXAA,C;;GA2FIE,YACFA;AAAIA,mCAAUA;AAAdA,OAAwCA,MAG1CA;AAFEA,oBAEFA,C;;GApDQC,YACDA;AACDA;AAAJA,WAAkBA,MAsBpBA;AArBiBA;AAIkCA;AAKAA;AAIjDA,OAzBFA,gDAiCAA,C;;GA8nB2BC;AACHA;AAClBA;AACAA,oBAEDA,C;;EA6qBLC,YACMA;qBAEAA;AAAJA,WAAmBA,MAmBrBA;AAhBqCA;AAD/BA;AAAJA;AAGIA;AAAJA;AAGIA;AAAJA;AAGIA;AAAJA;AAGIA;AAAJA;AAIAA,QACFA,C;;EAwBOC,YAAcA;AAcYA,qCAMoCA;AAC/DA;AAAJA,WAA2BA;AA2BvBA;AAAWA;AAAeA;AAAMA;AAAQA;AAD5CA,OArHFA,mRAsHwDA,4EACxDA,C;GAMcC,YAmDZA,OAA8BA;mEAChCA,C;GAkCcC,YASZA,OAA8BA,mEAChCA,C;;EAsCOC,YACLA;WAAqBA,4BAA4BA,WAEnDA;AADEA,4DACFA,C;;GANAC,sDACgEA,C;;EAkBzDC,YACLA;AAAIA;AAAJA,WAAqBA,4BAA4BA,WAMnDA;AALMA;AAAJA,WACEA,uDAA0DA,eAI9DA;AAFEA,kEACoDA,eACtDA,C;;GAZAC,cAAmBA;AACHA;;AADhBA,sCAGuEA,C;;EAiBhEC,YAAcA;uCAA+CA,C;;;GAwBpEC,YACYA,gBAERA,0BAC6CA;AAG/CA,QACFA,C;;EA6JOC,YACLA;AAAIA;AAAJA,WAAoBA,QAQtBA;AAL+BA;AAIZA;;AAAVA;AAAPA,QACFA,C;;;EA+hBOC,YAILA,kBAHyBA,WAGPA,UACpBA,C;;;;;EAoBOC,YACEA;AAEPA,WAAkBA,wCAEpBA;AADEA,kBAAmBA,WACrBA,C;;EAsBcC,cAAEA,mBAMhBA;AALEA,YAA4BA,QAK9BA;AAJEA,wBAA4BA,QAI9BA;AAHEA,+CAGFA,C;GAEQC,YACFA;AACAA;AAAJA,WAGgCA;KAIDA,6BAICA;AAEhCA,SAAqCA,iBACvCA,C;EAEAC,YACMA;WAA+BA;AAGnCA,kBAAkBA,qCAvkEJA,YAykEhBA,C;;GAGOC,YAAgCA,UAAaA,C;GAK7CC,YAAoCA,UAAiBA,C;GAwB9CC,YACRA;AAnENA;AAoEsBA;AAEpBA,4BACaA;AACXA,YACEA,QAGNA,E;;EA8bOC,YAAcA,aAAOA,C;;GAJ5BC,4CACoCA,kBACtBA,6CAFdA,AAEyEA,C;;EA2ElEC,YAAcA,uBAAgBA,WAAQA,C;;GAD7CC,8BAA0BA,C;;GkB1yGlBC,YAAUA,aAAOA,C;GAChBC,YAAWA,iBAAYA,C;GAGhBC,YACdA,OAwUFA,eAxUaA,aACbA,C;EAMKC,YACHA;wBACgBA;AACdA,WAAqBA,QASzBA;AARIA,OAAOA,YAQXA,MAFWA;AAAPA,QAEJA,E;GAEKC,YACCA;AACJA,WAAkBA,QAGpBA;AADEA,OAAOA,QAgNAA,UADIA,iBA9MbA,C;EAYWC,cACTA;wBACgBA;AACdA,WAAqBA,MAWzBA;AAV6BA;;AACzBA,QASJA,MARSA,2CACMA;AACXA,WAAkBA,MAMtBA;AAL6BA;;AACzBA,QAIJA,MAFIA,OAAOA,UAEXA,C;GAEEC,YACIA;AAAOA;AACXA,WAAkBA,MAMpBA;AA2KSA,YADIA;AA9KCA;AACZA,OAAeA,MAGjBA;AADEA,aACFA,C;EAEcC,gBACZA;wBACgBA;AACdA,YAA0CA;AAArBA,SACrBA,oBACKA,2CACMA;AACXA,YAAiCA;AAAfA,SAClBA,oBAEAA,YAEJA,C;GAEKC,cACCA;AAAOA;AACXA,YAAiCA;AAAfA,SACPA;AACEA;AACbA,WAEEA,aADyBA;KAGbA;AACZA,QAEOA;YAEoBA,cAI/BA,C;GAkCKC,YACHA,aACsCA;AAATA;AAARA;AAARA;AAAXA;AACAA;AACAA,UAEJA,C;EAEKC,cACeA;AAAOA;AACLA;KACpBA,UAGEA;AACAA,cACEA,UAAUA;AAEAA,MAEhBA,C;GAEKC,gBACsBA;AACzBA,WACEA,YAA2BA;KAEtBA,KAETA,C;GAWKC,WAKHA,wBACFA,C;GAGkBC,cACEA;AA+IpBA;AA9IEA,iBACWA;AAATA,cAEyBA;AACpBA;AACQA;AAAbA;AAGFA;AACAA,QACFA,C;GAiCIC,YAIFA,OAAsCA,gBACxCA,C;GAOIC,cACFA;WAAoBA,QAOtBA;;AALEA,gBAEWA,iBAAuBA,QAGpCA;AADEA,QACFA,C;EAEOC,YAAcA,OAAQA,UAAiBA,C;EAE5BC,cAChBA,WACFA,C;GAEwBC,cACtBA,WACFA,C;GAEKC,sBAGLA,C;GAEKC,yBAELA,C;GAEKC,cAEHA,OADyBA,iBAE3BA,C;GAEAC,WAQiBA;AAAfA;AACAA;AACAA,QACFA,C;;;GAiDQC,YAAUA,eAAYA,C;GACrBC,YAAWA,mBAAiBA,C;GAErBC,YACdA;AAAuCA;AA0BzCA;AACEC;AA3BAD,QACFA,C;EAEKE,cACHA,OAAOA,WACTA,C;;GAyBMC,WAAWA,aAAQA,C;EAEpBC,WACmBA;AAAtBA,gBACEA,UAAUA;KACDA;AAAJA,YACLA;AACAA,QAMJA,MAJIA;AACAA;AACAA,QAEJA,G;;GFbiBC,YAAOA,gBAAoCA,C;;GAExDA,cAAmBA,kBAAmDA,C;;GAEtEA,YAAgBA,gBAAoCA,C;GGjSrDC,YAEHA,OAAWA,8BACbA,C;GCxHKC,YACHA;AAGEA,MAyBJA,CArBEA;AAGEA,MAkBJA,CAdEA,2BACEA,MAaJA;AATEA;AAEEA,MAOJA,4C;ECkyDKC,gBACHA,mBACEA,UAAMA,UAEVA,C;;;GA7mCUC,YAAUA,eAAgCA,C;;;;EA2BlCC,cACdA;AACAA,WACFA,C;EAEcC,gBACZA;MAEFA,C;;;;;;;;EAkBcC,gBACZA;MAEFA,C;;;;;;;EAiGaC,cACXA;AACAA,WACFA,C;;;EAmCaC,cACXA;AACAA,WACFA,C;;;EAmCaC,cACXA;AACAA,WACFA,C;;;EAmCaC,cACXA;AACAA,WACFA,C;;;EAmCaC,cACXA;AACAA,WACFA,C;;;GAoCQC,YAAUA,eAAgCA,C;EAErCC,cACXA;AACAA,WACFA,C;;;GA4CQC,YAAUA,eAAgCA,C;EAErCC,cACXA;AACAA,WACFA,C;;;;;;GCtlCgBC,WAA4BA;AAA5BA;AAEdA,gCACEA,OAAOA,MAiCXA;AA/BEA,qDAewDA;;;AAAVA,0BADxCA,IAPYA;AAUhBA,OAAOA,eAcXA,MALSA,2BACLA,OAAOA,MAIXA;AADEA,OAAOA,MACTA,C;IAEYC,mCAMNA,IALYA,eAMlBA,C;IAEYC,8BAMNA,IALYA,eAMlBA,C;IAEYC,YAoBCA,SAlBbA,C;GAwIWC,YACXA,OAhCAA,SCrJIC,SA8JJC,+BDwBFF,C;GAiBQG,cAENA;AACUA;AACVA,YACFA,C;GAsBQC,cACNA,SACFA,C;GAQQC,cACNA,MACFA,C;GAOQC,cAENA,IACIA,OAAyBA,OAC/BA,C;GASKC,cACMA;AACLA;AAEqBA;AAMdA;AAAXA,WAGEA;KACKA,WACLA;KCnHFA;AAkGEA;AACAA;ADsBAA,kBAEJA,C;GAIkBC;;;AAwBhBA,OAAYA,OAA+BA,YAG7CA,C;GCgZSC,cACUA,mCACfA,OAAOA,OAWXA;AARmBA,gCACRA;AAAPA,QAOJA,CALEA,UAAUA,kIAKZA,C;GCluBKC,WACHA;;AAGwBA;;AACtBA;AACOA,SAEXA,C;IAEKC;IAKDA;;AAIAA,aF3BAA,OAAyBA,GE4BMA,QAGnCA,C;GAQKC,YAtDHA;AAwDAA;;AAEEA,SF3CAA,OAAyBA,GE4CMA,aAGjBA;OAGlBA,C;GAUKC,YACHA;AAAIA;AAAJA,YACEA;AACwBA;AACxBA,MAcJA,CA7FEA;AAkFIA;AAAJA,YACQA;;WAGAA;AACgBA;;AAEtBA,oBAIJA,C;GA2BKC,YACGA;AACNA,YAGEA;AACAA,MAUJA,CAR6CA;AC2uCzCA,gBDpuCkCA,QACtCA,C;GEm6DUC,YAIJA,OCjnCJA,cDinCkCA,C;GDv+B/BC,oBAAwBA;;AAE3BA,KAA+BA,cAKjCA,C;GAIEC,kBACAA;AAASA;AAATA,SAA2BA,OAAOA,MAQpCA;;AANOA;IAEIA;AAAPA,QAIJA,gB;GAEEC,oBAEAA;AAASA;AAATA,SAA2BA,OAAOA,OAQpCA;;AANOA;IAEIA;AAAPA,QAIJA,gB;GAEEC,sBAEAA;AAASA;AAATA,SAA2BA,OAAOA,SAQpCA;;AANOA;IAEIA;AAAPA,QAIJA,gB;EAqBKC,kBAEHA;MAjWEA,MACmCA;AADnCA;AAoWMA,aAEAA,QAKRA,OACFA,C;;IHpnCMC,YACMA;;AAAIA;AACRA;AACAA,MACFA,C;;GAMOC;AAELA;AAI4DA;AACxDA;8CACLA,C;;IASHC,WACEA,WACFA,C;;IAOAC,WACEA,WACFA,C;;GA2CFC,cACEA,gDAQMA,IAPiBA;KASrBA,UAAUA,iCAEdA,C;;GAbAA;;QAaAA,C;;IAXIC,WACEA;;AACKA;AACLA,WACFA,C;;EAkECC,YACHA;UACEA;KACeA,gCACJA;AAAXA,KAAsBA,QAA8BA,iBAEpDA,KAAkBA,iBAItBA,C;EAEKC,cACHA,UACEA;KAEAA,KAAkBA,mBAItBA,C;;GAdsBC,WAChBA,kBACDA,C;;GAQiBC,WAChBA,yBACDA,C;;GA2FDC,YAAYA,qBAA+CA,C;;IAEtCA,cAGvBA,YtBssDFA,csBrsDCA,C;;GA2C0CC,yBAE1CA,C;;;GCpVIC,yBhBqGLC;AgBnGED,gBAA0BA,UAAUA;AACNA;AAK9BA,WACFA,C,CATKE,kC;;EAmBAC,YACHA;WAA0BA,UAAUA;AACpCA,MACFA,C;GAHKC,+B;EAKAC,cACHA,cACFA,C;;GAIKC,YACHA;WAA0BA,UAAUA;AACpCA,OACFA,C,CAHKC,+B;EAKAC,cACHA,aACFA,C;;GAyEKC,YACHA,cAAmBA,QAErBA;AADEA,OAAOA,uBACTA,C;GAEYC,YAAWA;AAEIA;AA1CFA;AA6CLA,mCAChBA,OAAOA,eAMXA;KAFIA,OAAOA,WAEXA,C;;GA4FUC,gBACHA;AACLA,YACMA;AACJA,WAIYA,YAGdA,OAAOA,cACTA,C;GAZUC,uC;GAeAC,gBA/CVA;AAkDEA,QA/KFA;AAgLEA,QACFA,C;GAsEKC,YAAYA;AArGWA;AAuG1BA,SACWA;AACTA,cAEAA,UApCKA;AArEeA;AA8GlBA,QACEA;AACAA,MAURA,CA3BEA;AACAA,WAsBEA;;AE4hCFA,gBF5hC0BA,kBAI5BA,C;GAEKC,YACHA;AADGA;;AACHA,WAAuBA,MA6BzBA;AA5J4BA;AAgI1BA,SACsCA;AACpCA;AACAA,YAEEA,2BAGOA,YAGTA,UApEKA;AArEeA;AA8IlBA,QACEA;AACAA,MAURA,CA3DEA;AACAA,WAqDcA;AACZA;;AE4/BFA,gBF5/B0BA,kBAI5BA,C;EAEgBC,WAIYA;AAC1BA;AACAA,OAAOA,SACTA,C;EAEgBC,YACEA;AAEhBA,gCACiCA;AACvBA,MAIVA,QACFA,C;GA0DKC,YAASA;;AAEFA,wBACEA,uBACRA;KAEAA;KAG0BA;AAvK9BA;AACAA;AAwKEA,YAEJA,C;EAWKC,cAGyBA;AAnL5BC;AE1QFA;AF+bED,WACFA,C;EAEKE,YAAcA;AAaPA,gCACRA;AACAA,MAMJA,CAxOEA;AAqOAA;;AEu3BAA,gBFv3BwBA,iBAG1BA,C;GAEKC,YACHA;AAAUA,+BACRA,YA5OFA;AA+OIA;;AE62BJA,gBF72B4BA,uBAIxBA;AAEFA,MAIJA,CADEA,YACFA,C;GAEKC,cAAmBA;AA3PtBA;AA+PAA;;AE61BAA,gBF71BwBA,mBAG1BA,C;;;GAnIYC,cAAmBA;AA/H7BA;IAsIEA,KAAYA,YAYCA,2BAnBcA;AAuB3BA;AAKAA,KAAkBA,iBAItBA,C;GAIYC,cAAgBA;KAE1BA,aAtJOA;AAyJPA,SAC8BA;AAhI9BA;AACAA;AAiIEA,cAEmCA;AA9NrCA;AACAA;AA+NEA,QAEJA,C;EAuFYC,cACVA;AADUA;;AACVA;AA9ToBA;AAiUlBA,YACEA,MAnQGA;AAqQMA;AAC6BA;AAAkBA;AAD/CA;AE4yBbA,sBFzyBIA,MA2JNA,MAtJIA,mBAGWA;AACTA,WAGmBA;AAAOA;AAQvBA;AACDA;AAKJA;MAvesBA;AAueGA,wBAuGLA;AAvGpBA,MAzecA;AAAOA;AA2enBA,MAAwBA;;AE6OrBA;AAAPA,MACmCA;KFzIbA;AArGlBA;MAGSA;AAC6BA;AAAkBA;AAD/CA;AE0wBbA;AFxwBMA,MA0HRA,CEpa2BA;AF8SrBA;KAmFIA;AAlkBmBA;AAqjBvBA,SA/D+BA,kBAgEHA;KACrBA,MACLA,aA9BsBA,gBA+BDA,UAGrBA,aAzBcA,gBA0BDA;AAKfA;AAIIA;AAAqBA,iBAMrBA,WA1SkBA;AAC1BA;AACOA;AAnEPA;AACAA;AA6WUA;AACAA,cAEAA;AAKJA,MAcRA,EAX8BA;AAxTFA;AAC1BA;AACOA;AAwTAA;AACcA;AADnBA,OA/YFA;AACAA,WAKAA;AACAA,MA+YEA;IAEJA,C;;GA7W4BC,WACtBA,kBACDA,C;;GA8BuBC,WACtBA,oBACDA,C;;GAoCWC;AAjIdA;AAuIIA,OACDA,C;;IAKYA,cAEXA,aACDA,C,CAHYC,mC;;GASKD,WAChBA,uBACDA,C;;GAwEqBE;AACtBA;AAhC0BA;AAjL5BC;AACAA;AAkLAD,QA+BCA,C;;GAQ2BE,WACtBA,mBACDA,C;;GAcmBC,WACtBA,uBACDA,C;;GA6DGC,WAA+BA;;IAQVA;AA3clBA,yBAmc4BA;AAS3BA;AACAA,WAAwCA;AAAOA;AAA/BA;AAAhBA;;KACEA;KExjBZA;AF4jBUA;AACAA,MAkBJA,CAhBqBA,iBAtYHA,iCACFA;AA+DbA;AA0UKA,OAGFA,MASNA,CAJyBA;;AACEA,SAAoBA;AAC3CA,OAEJA,C;;GAH+CC,YAAOA,aAAcA,C;;GAKpEC,WAAwBA;IAEGA;AAjgBxBA,uCA+fqBA;AAGpBA;;AEplBVA;AFslBUA,OAEJA,C;;GAEAC,WAAgBA;IAEDA;AACPA;;AAEqBA;AACvBA,iBANUA;AAQZA;AAzWDA;AA0W6BA;AAAOA;;AAAnCA,yBACEA;KEpmBZA;AFwmBUA,OAEJA,C;;;;;;EExmBCC,YAAcA,OAAEA,WAAMA,C;;;;GAwiCEC;;AAC7BA;YlB/9BFA;AkB+9BEA;;AACIA;AAAJA,WAAwBA;AHzYlBA;AACyBA;OG0YhCA,C;;GAyLIC,YAAUA;IAEXA,cACEA;AACAA,MAMNA,CAJIA,gCANWA;AAOXA;AA4DFA,yBAzDFA,C;GAEKC,cAAkBA;IAEnBA,cACEA;AACAA,MAMNA,CAJIA,kCANmBA;AAOnBA;AAgDFA,yBA7CFA,C;GAVKC,uC;GAwBWC,YACdA,OAAOA,gBACTA,C;GAFgBC,mC;GAaAC,YACdA,OAAOA,gBACTA,C;GAEiBC,cACfA,OAAOA,kBACTA,C;GAmBEC,YACAA,aAAyCA,OAAOA,MAElDA;AADEA,OAAOA,sBACTA,C;GAHEC,mC;GAKAC,cACAA,aAAyCA,OAAOA,OAElDA;AADEA,OAAOA,wBACTA,C;GAHEC,4C;GAKAC,gBACAA,aAAyCA,OAAOA,SAElDA;AADEA,OAAOA,0BACTA,C;GAHEC,qD;GAS4BC,YAE1BA,QAACA,C;GAFyBC,6C;;GAxDrBC,WAAMA,OAAKA,iBAASA,C;;GAapBC,WAAMA,OAAKA,iBAAaA,C;;IAIxBC,YAASA,OAAKA,mBAAuBA,C;GAArCC,+C;GG9yCDC,oBAMFA,WACEA,OAgDRA,iBA3BAA;AAnBiBA;AAkBfA,OAAWA,eACbA,C;GA6bQC,oBAOAA,OVhdR5K,mBUqeA4K,C;GAeQC,cACNA,OVrfF7K,mBUsfA6K,C;GAOOC,WAAgBA,OV7fvBA,yBU6f4CA,C;GAuPpCC,kBAMFA,WACEA,OAiDRA,eA5BAA;AAnBiBA;AAkBfA,OAAWA,aACbA,C;ICjzBEC,YAAuBA,OAAEA,MAAQA,C;GC8NrBC,gBAEZA;AAAIA,YACFA,oBAEEA,aAgBNA;AAdIA,gBAcJA,CAZ+BA;AAC7BA;;IAEEA,kBAGAA,+BAAkBA;AAAlBA,QfkUUA;AehUZA,6BAIFA,C;GAccC,gBAEZA;AAAIA,WACFA,gBAYJA;Af8QAA;AevREA;;IAEEA;AfsSFA,KAAYA,KAAUA,wBenSpBA,+BAAkBA;AAAlBA,QAEFA;AfkTA1N,KAA6CA;AAHD0N;Ae9S5CA,6BACFA,C;GAOGC,YACHA;QAAoBA,oBAApBA,IACEA,YAAwCA,QAG5CA;AADEA,QACFA,C;GAKKC,cAOOA;AAkBaA;AAGhBA;AAAwBA;AAA/BA;AACOA,UAAeA,MAoFxBA;AAnFwBA;AACpBA;AACAA,cACAA,IAUGA,WACHA,QAAoCA,MAqExCA;AApEqBA,+BAAMA;AAANA;AACGA,+BAAMA;AAANA,eAEHA,SACjBA;AACKA,WACHA,SACEA,OAAYA;AACZA,MA4DRA,CA1DyBA;AACCA,+BAAMA;AAANA;AACpBA,mBAEcA,SACdA;KAGOA,MAAPA,SAEgBA,SACdA;AACAA,UAQEA;AAEYA,+BAAMA;AAANA,oBACVA,IAEFA;AACAA,MAgCVA,EA7B4BA;AACHA;AACnBA,wBAOJA,iBAEEA;;AAMFA;AACYA,+BAAMA;AAANA;AACVA,YAEEA;SAGJA,WACEA;AAEFA;AACAA,SACFA,C;GCpYgBC,YAEZA;AAFYA;AAERA,WACFA,aAwBJA;AhBqfAA;IgBxgBIA,OAAkBA;AAClBA;AhByiBF7N,KAA6CA;AgBxiBtC6N;AACLA,MAAUA;AASVA;AhB8hBF7N,KAA6CA,oBgB3hB3C6N;+BAAkBA;AAAlBA,QhBwhB0CA;AgBrhB5CA,6BACFA,C;GA0BYC,gBACDA;A9BqnBX1V;AK5XAsD,aAEyBA;AyBxPLoS;AACEA;AAEpBA;AACEA;AACaA;AACEA,QAGjBA,QACEA,UAAUA,2CAEdA,C;;GHTQC,YAAUA,aAAOA,C;GAChBC,YAAWA,iBAAYA,C;GAGhBC,YACdA,OAmWFA,eAnWaA,aACbA,C;EAMKC,YACHA;yCACgBA;AACdA,4BAOJA,MANSA,2CACMA;AACXA,4BAIJA,MAFIA,OAAOA,UAEXA,C;SAEKC,YACCA;AACJA,WAAkBA,QAGpBA;AADEA,OAAOA,OADMA,iBAEfA,C;EAYWC,cACTA;yCACgBA;AAC8BA;AAA5CA,QAOJA,MANSA,2CACMA;AAC8BA;AAAzCA,QAIJA,MAFIA,OAAOA,UAEXA,C;SAEEC,YACIA;AAAOA;AACXA,WAAkBA,MAIpBA;AAHeA;AACDA;AACZA,sBACFA,C;EAEcC,gBACZA;yCACgBA;AACdA,YAA0CA;AAArBA,SACrBA,oBACKA,2CACMA;AACXA,YAAiCA;AAAfA,SAClBA,oBAEAA,YAEJA,C;SAEKC,cACCA;AAAOA;AACXA,YAAiCA;AAAfA,SACPA;AAEPA;AAAJA,YACEA;AAEAA,iBAEYA;AACZA;;AAKEA,aAGNA,C;EAyCKC,cACEA;AAAOA;AACZA,4BAESA;AAAPA,OAAgBA;AAChBA,cACEA,UAAUA,WAGhBA,C;GAEKC,WACHA;AAAIA;AAAJA,WAAmBA,QAgDrBA;AA/CoBA;;AAIJA;AACdA,YAEsCA;;AACpCA,qBAEwCA,UACtCA;AAKOA;AACXA,YAEsCA;;AACpCA,iBAIwCA,WACtCA,KAKOA;AACXA,YAEsCA;;AACpCA,iBAGqCA;;AACnCA,kBAEwCA,UACtCA,MAKCA;AAAPA,QACFA,C;GAEKC,gBACHA;AAEEA,YAEFA,WACFA,C;EAyBIC,YAIFA,OAAsCA,gBACxCA,C;EAmCKC,cAEHA,SADWA,UAEbA,C;EAEIC,cACFA;WAAoBA,QAMtBA;;AAJEA,iBACMA,eAAqCA,QAG7CA;AADEA,QACFA,C;;GArCOC,cACDA;AAGJA,mBACFA,C;GAEYC,gBAIVA;WAQFA,C;GAoBOC,WAQUA;AAAfA;;AAEAA,QACFA,C;;EA6BWC,cACJA,iBAAgBA,MAEvBA;AADEA,OAAaA,UACfA,C;EAEcC,gBACNA,YACRA,C;EAEKC,YACEA,iBAAgBA,QAEvBA;AADEA,OAAaA,UACfA,C;EAOIC,YAIFA,OAAkCA,sBACpCA,C;EAEIC,cACFA;WAAoBA,QAMtBA;;AAJEA,0BACMA,gBAA4CA,QAGpDA;AADEA,QACFA,C;;GApCAC,wCACmDA,oBADnDA,AACiEA,C;;GAAdC,YAAOA,OAAEA,cAAIA,C;;GA0CxDC,YAAUA,eAAYA,C;GACrBC,YAAWA,mBAAiBA,C;GAErBC,YACdA;OAwBFA,WAxB0CA,SAC1CA,C;EAEKC,cACHA,OAAOA,WACTA,C;;GAqBMC,WAAWA,aAAQA,C;EAEpBC,WACCA;AAAOA;AACEA;AACmBA;AAAhCA,WACEA,UAAUA;KACLA,gBACLA;AACAA,QASJA,MAPIA;AAIAA;AACAA,QAEJA,E;;GA+WgBC,YACdA,OAgUFA,cAhUuCA,YACvCA,C;GAEQC,YAAUA,aAAOA,C;GAChBC,YAAWA,iBAAYA,C;EAG3BC,cACHA;yCACgBA;AACdA,4BAOJA,MANSA,2CACMA;AACXA,4BAIJA,MAFIA,OAAOA,UAEXA,C;SAEKC,YACCA;AACJA,WAAkBA,QAGpBA;AADEA,OAAOA,OADMA,iBAEfA,C;EAmBKC,cACHA;yCACgBA;AACdA,YAA0CA;AAArBA,SACrBA,OAAOA,YAQXA,MAPSA,2CACMA;AACXA,YAAiCA;AAAfA,SAClBA,OAAOA,YAIXA,MAFIA,OAAOA,UAEXA,C;SAEKC,YACCA;AAAOA;AACXA,YAAiCA;AAAfA,SACPA;AAEPA;AAAJA,WAsJmCA;KAnJrBA,kBACIA,QAMpBA;;AAFEA;AACAA,QACFA,C;GAQKC,cACHA,wCACEA,OAAOA,iBAMXA;KALSA,0CACLA,OAAOA,iBAIXA;KAFIA,OAAOA,UAEXA,C;SAEKC,YACCA;AAAOA;AACXA,WAAkBA,QAYpBA;AAXeA;AACDA;AACZA,OAAeA,QASjBA;AALEA;;AAIAA,QACFA,C;GASKC,WACHA;AAAIA;AAAJA,WAAuBA,QA+CzBA;AA9CoBA;;AAIJA;AACdA,YAEsCA;;AACpCA,qBAEwCA,UACtCA;AAKOA;AACXA,YAEsCA;;AACpCA,iBAIwCA,WACtCA,KAKOA;AACXA,YAEsCA;;AACpCA,iBAGqCA;;AACnCA,2BAEEA,MAKCA;AAAPA,QACFA,C;GAEKC,cACHA,cAAoCA,QAKtCA;AA2CqCA;AA7CnCA;AACAA,QACFA,C;GAEKC,cACHA;AAGEA;AACAA,QAIJA,MAFIA,QAEJA,C;EAcIC,YAKFA,OAA0CA,gBAC5CA,C;EAmBKC,cAEHA,SADWA,UAEbA,C;EAEIC,cACFA;WAAoBA,QAMtBA;;AAJEA,gBACMA,eAAyCA,QAGjDA;AADEA,QACFA,C;;GAEOC,WAQUA;;;AAEfA,QACFA,C;;EAkCIC,cACFA;WAAoBA,QAMtBA;;AAJEA;AACMA,kBAAkDA,QAG1DA,CADEA,QACFA,C;EAEIC,YAKFA,OAAkCA,sBACpCA,C;EAEKC,cAAiBA,OAAMA,UAAYA,C;EAEnCC,cACEA,iBAAmBA,QAE1BA;AADEA,OAAaA,UACfA,C;GAOKC,cACEA,iBAAmBA,QAE1BA;AADEA,OAAaA,UACfA,C;;GAtCAC,sCACmDA,kBADnDA,AACiEA,C;;GAAdC,YAAOA,OAAEA,cAAIA,C;;GAiD1DC,WAAWA,aAAQA,C;EAEpBC,WACCA;AAAWA;AACFA;AACuBA;AAApCA,WACEA,UAAUA;KACLA,gBACLA;AACAA,QASJA,MAPIA;AAIAA;AACAA,QAEJA,E;;;GE1kCQC,YAAOA;AE4pBiBA;AArHhCC,gBA7H6DC;AA2B3DA;AFjcAF,QAAOA,OACLA;AAEFA,QACFA,C;GAESG,YEkpBuBA;AArHhCF,gBA7H6DC;AA2B3DA;AF3bkBC,OAACA,KAAmBA,C;EAkGjCC,YAAcA,OAAaA,kBAAqCA,C;;G5B1JvDC,YAAYA,OI6Q5BA,WAEyBA,aJ/Q4BA,C;EAEnDC,cAAwBA,OAAIA,WAAOA,C;GAe5BC,YAAWA,qBAAWA,C;IAEtBC,YAAcA,OAFHA,cAEWA,C;GAqQ1BC,cACEA,SACPA,C;EAwBiBC,cACXA;AAAYA;AAAIA,SAAeA,iBAAeA;AAC1BA;AAAxBA;AACAA;AACAA,QACFA,C;EAyKOC,YAAcA,OAAaA,eAAoCA,C;;;G6BvfxDC,cACRA;;QhB2gBWA;AgBxgBXA;AACAA;AhBugBWA;AA2BfnS;AA3BemS,WgBpgBZA,C;;EA8EOC,gBAAkBA,OAAIA,kDAA4BA,C;EACzDC,cACHA;AAAcA,sBAAdA;AACEA,OAAgBA,aAEpBA,C;EAmEKC,YAA2BA,qBAAKA,MAAaA,C;GAC1CC,YAAUA;OAAKA,OAAMA,C;GACpBC,YAAWA;OAAKA,OAAOA,C;EAGzBC,YAAcA,OAAQA,UAAiBA,C;;;EA8EhCC,gBACZA,UAAUA,sCACZA,C;;EAuDYC,gBAAkBA,sBAAmBA,C;EACtCC,cAAkBA,oBAASA,C;EAcjCC,YAA2BA,kBAAqBA,C;EAEhDC,cACHA,aACFA,C;GAESC,YAAWA;OAAKA,OAAOA,C;GAExBC,YAAUA;OAAKA,OAAMA,C;GACbC,YAAQA;OAAKA,OAAIA,C;EAE1BC,YAAcA,kBAAeA,C;;;EAmCxBC,gBACRA,OAHJA,SAGoCA,sBAAoBA,C;;GEmPxCC,YAAYA,OAiT5BA,mCAjT2DA,C;GAUlDC,YAAWA,sBAAcA,C;GAE1BC,YAAUA,yCAAqCA,C;EAkBrDC,cAASA;A1BlXYA;AAErBA,aAEEA,IAAUA;A0BgXLA;AAAiCA;AAAnBA;AAAdA,4BAAMA;AAAbA,WACFA,C;EA0GOC,YAAcA,OAAaA,kBAAoCA,C;;GA4KhEC,WAAWA,aAAQA,C;EAEpBC,WAAQA;AACXA;AAlHAA,gBACEA,IAAUA;AAkHRA;AAAJA,eACEA;AACAA,QAKJA,CAHoBA;;uBAAMA;AAAxBA;AACAA;AACAA,QACFA,C;;GCl5BSC,YAAWA,wBAAWA,C;EA6FxBC,YAAcA,OAAaA,kBAAoCA,C;;;;;GFrDlEC,YACFA;AAAIA;AAAJA,WAAmBA,QAyDrBA;AAnDcA;AAIZA,wBAC0BA;;AA8pBAA;AA7pBpBA,mCAAKA;AAATA,QACcA;AAAZA,YA2CGA;AA3CuBA,MA4pBJA;AA1pBlBA,mCAAKA;AAATA,QAEkCA;AACxBA;AACJA;AAEJA,cAmCCA;AATMA;AA1BmBA,MAGfA,IAAPA;AAEYA;;;SACbA,QACOA;AAAZA,YA4BGA;AA5BwBA,MA6oBLA;AA3oBlBA,mCAAKA;AAATA,QAEqBA;AACXA;AACJA;AAEJA,cAoBCA;AATMA;AAXoBA,MAGhBA,IAARA;AAEaA,WAefA;AAbHA;;KAICA;AACCA;AACEA;AACAA;AACRA;AAEOA;AACAA;AAEPA,QACFA,C;GAMKC,YACEA;AACLA,2BAEUA;AACHA,MAGPA,QACFA,C;GAOKC,YACEA;AACLA,2BAEUA;AACFA,MAGRA,QACFA,C;GAEKC,YACHA;gBAAmBA,MAkBrBA;AAjBaA,kBACIA,MAgBjBA;AAfgBA;AAGJA;AAAVA,WACEA;KAEmBA;AAEXA;AAARA;AAGMA;AAGRA,QACFA,C;GAQKC,cAAWA;AAGVA;AAAJA,YACEA;AACAA,MAaJA,CAVMA,mCAAKA;AAATA,QACOA;AACAA;AACCA,cAEDA;AACAA;AACCA,SAERA,QACFA,C;IAESC,WACHA;AAAJA,WAAmBA,MAGrBA;AAFUA;AAARA;AACAA,QACFA,C;;GA0VMC,WACAA;AAAJA,WAA0BA,MAE5BA;AADEA,UACFA,C;EAEKC,YACHA;uBACEA;AACYA,MAEhBA,C;EAsBKC,WACHA;AAA0BA;AAA1BA,gBACEA,UAAUA;AAORA;AAAJA,iBACEA;AACAA,QAQJA,CANEA,+BACmBA;A/BxXnBC;A+BiWAD,WACEA;KAEAA;AACAA,eAqBaA,+BAAUA;AAAVA;AAAfA;AACAA;AACAA,QACFA,C;;;;GAmJgB7C,YArHhBA,oBA7H6DC,cAkP7BD;AAvN9BC;AAuN0BD,QAAkCA,C;GAEtD+C,YAAUA,aAAMA,C;GACfC,YAAWA,mBAAaA,C;EAwB5BC,cACWA;AACdA,SAAkBA,QAGpBA;AAFEA,QAhxBFA;AAixBEA,QACFA,C;GAEKC,cACEA,iBAAmBA,QAE1BA;AADEA,OAAOA,gBACTA,C;GAEKC,cACHA;;AACgBA;AACdA,SACEA,QA7xBNA,eAgyBAA,C;EA+EOC,YAAcA,OAAaA,kBAAoCA,C;;;GA7KtEC,gCAlsBAC,iBAosBiCD,sBAFjCA,AAE+CA,C;;GAAdE,YAAOA,OAAEA,cAAIA,C;;;;GGvrBhDC,cACEA;uBAAuBA,UAAMA;ArB8CvBA;6BqB/CEA;ArB+CFA;AqBvCJA,UrBuCIA,uBqBnCGA;AAAPA,QAIJA,C;GAmDAC,YAEEA;WAAoBA,MAyBtBA;AAtBEA,sBACEA,QAqBJA;8CAdIA,OA8BFA,+BAhBFA;AAVEA,uBAO8BA;AAE9BA,QACFA,C;IC8XQC,YAAuCA,aAAeA,C;;ED5WnDC,cACPA;AAuHsBA;AAvHtBA,WACEA,OAAOA,aAQXA;KAPSA,uBACLA,MAMJA;KAHuBA;AACnBA,6BADqCA,YAGzCA,E;GAEQC,YAAUA;;AAA2BA,eAASA;AAApCA,QAAyDA,C;GAElEC,YAAWA,wBAAWA,C;GAGVC,YACnBA;;AAAiBA,OAAoBA,OAEvCA,CADEA,OA8KFA,cA7KAA,C;EAOSC,gBACPA;gBACEA;KACSA,cACOA;;AAEDA;AACfA,yBAoJ8BA,eAhJ9BA,UAAUA,QAEdA,C;EAkBKC,YACHA,gBAAiBA,OAAOA,WAG1BA;AAFEA,uBAAoBA,QAEtBA;AADEA,qDACFA,C;EA6BKC,cACHA;gBAAiBA,OAAOA,aAsB1BA;AArBsBA;AACpBA,wBACeA;AAKMA;AAAnBA,0BACUA;YAKVA;AAIAA,cACEA,UAAUA,WAGhBA,C;EAgBaC,WAECA;AACZA,YACqBA;AAAZA,SAETA,QACFA,C;GAEqBC,WACnBA;gBAAiBA,aA0BnBA;AAtBgCA;AACVA;AACpBA,4BACeA;AACbA,QAAkBA,aAMpBA,SACEA;KlCtDFA;AkC6DYA;AAAZA;AACAA;AAEAA,QACFA,C;GAEAC,YACEA;mDAAmCA,MAGrCA;AAFeA;AACbA,kBACFA,C;;;;GAuBQC,YAAUA;OAAQA,OAAMA,C;EAEzBC,cACLA;aACcA,UAAKA;KACbA;AAAQA,mCAAcA;AAAdA,OAFdA,QAGFA,C;GAKqBC,YACnBA;cACcA;AAAKA,eACbA;AlCmWR3d,yBkCrWE2d,QAGFA,C;EAIKC,cAAwBA,kBAAwBA,C;;;;;;;ECvU9CC,YACkBA;AAOvBA,qIACFA,C;;GAZAC,sCACqCA,C;;EAsB9BC,YAAcA,sCAAgCA,C;;GAiG7CC,cAwVyBA,aAtVHA;AAAPA,QAEvBA,C;GAJQC,mC;GAeDC,cAE2BA;AAyFPA;AAzFAA,QAE3BA,C;GAJOC,mC;IAMSC,WACYA,UAE5BA,C;IAEgBC,WACQA,UAExBA,C;;;;GA6XKC,YACCA;AACaA;AAEAA,+BADjBA,SACiBA;AACfA,QAA0BA;AAC1BA,SACEA,OA0RQA;AAzRCA;ArB1FKC;AqB4FdD,iBrB5FcC;AqB+FVD;OrB/FUC;AqBkGVD;QrBlGUC;AqBqGVD;QrBrGUC;AqBwGVD;QrBxGUC;AqB2GVD;QrB3GUC;;;AqBgHuBD;ArBhHvBC;AqBiHaD;ArBjHbC;AqBkHVD,YAECA,mBACLA,OA8PQA;AA7PCA;ArBtHKC;aqB2HlBD,SrBvCeE;KqByCRF,OAsPKA,eAnPdA,C;GAMKG,YACHA;qCACwBA;AAAtBA,yBACEA,UAnjBNA,uBAsjBEA,SACFA,C;GAgBKC,YAIHA;AAAIA,cAAwBA,MAY9BA;AAXEA;IAEmBA;AACZA,gBACGA,cAAkDA;AAAxDA,aAhBJA;+BAAMA;AAANA,iBAOcA;AAaNA,WACuBA;AAD7BA,aAGJA,C;GAMKC,YACHA;wCACwBA,QA+B1BA;AAuJcA;AApLVA,QA6BJA,MA5BSA,WAuLKA;AArLVA,QA0BJA,MAzBSA,WAoLKA;AAlLVA,QAuBJA,MAtBSA,YAiLKA;AA/KVA,QAoBJA,MAnBSA,wBA8KPA;AAAYA;AA5KVA;AA4KUA;AA1KVA,QAeJA,MAdoBA;AAAXA,YACLA;AACAA;AAlDFA;+BAAMA;AAANA;AAoDEA,QAUJA,MATSA,YACLA;AAEcA;AAxDhBA;+BAAMA;AAANA;AA0DEA,QAIJA,MAFIA,QAEJA,E;GAGKC,YAASA;AAwJZA;AAAYA;AAtJHA,YACKA,8BAAIA;AAAhBA;AACAA,wBAoJUA;AAlJRA,eAkJQA,QA9IdA,C;GAGKC,YACHA;AADGA;AACKA,YA0IIA;AAxIVA,QAwBJA,CAtB8BA;AAATA;;AACfA;AACAA;AACJA,MAAYA;AAOZA,QAAoBA,QAYtBA;AAgHEA;AAAYA;AAzHZA;AAGEA;AAsHUA;AApHeA;AAAbA,uBAAYA;AAAxBA,cAoHUA;AAjHZA,QACFA,C;;GAnBcC,cACVA;uBACEA;AAEFA;;AAAaA;AAACA;AAADA;;AAAbA,uBAAYA;AAAZA;AACaA;AAAbA,uBAAYA;AAAZA,MACDA,C;;IAsHQC,WrB5PmCA;AqB4PjBA,6BAA+CA,C;;GApB9DC,gBACRA;ArBxQNA;AqB2PAC,gBA1QoCC;AAuSlCF;ArBzP4CA;AqB2O5CA,6BACFA,C;GrBhlBcG,YAEZA,oBAAuBA,OAAOA,MAEhCA;AADEA,sBfggBcA,We/fhBA,C;GA0MQC,gBACEA;AAAUA;AAClBA,oBACEA,OADFA;AAGcA,QAEhBA,C;GA0TsBC,WACpBA;AAAIA,UACFA,OAAOA,gBASXA;IAJIA,uBAP0BA;AAQ1BA;AACAA,QAEJA,E;ERhrBcC,YACZA,sDACEA,OAAOA,OAMXA;AAJEA,uBACEA,wBAGJA;AADEA,OAAOA,OACTA,C;G8BuFmBC,oBACfA,O5BoFJA,qB4BpFqCA,C;GCrKlCC,Y5B8BHA,O4BvBFA,C;;GvBunB8BC;AACtBA;;AAASA;AAxFEA;AA2Bf7X;AAgEmB6X;AACfA,QACDA,C;;;;EAhRSC,cAAEA,mBAGQA;AAFpBA,0CAEoBA,C;GAapBC,cACAA,yBAA8CA,C;GwBwF1CC,YAAYA;SAAWA,wBAA2BA,C;EA2EnDC,YACEA;AAAIA,OxBhNcA;AwBiNdA,OxB9MeA;AwB+MfA,OxB5MaA;AwB6MbA,OxB1McA;AwB2MZA,OxBxMcA;AwByMdA,OxBtMcA;AwBuMfA,OxBpMoBA;;AwBuM9BA,QAIJA,C;;GArDcC,YACRA;AAAOA;AAGgBA;AAD3BA,WAAkBA,UAIpBA;AAHEA,UAAiBA,cAGnBA;AAFEA,SAAgBA,eAElBA;AADEA,gBACFA,C;GAUcC,YACZA,UAAcA,UAGhBA;AAFEA,SAAaA,WAEfA;AADEA,YACFA,C;GAEcC,YACZA,SAAaA,UAEfA;AADEA,WACFA,C;;;;;EhC1aOC,YAAcA,sBAAgBA,C;;IAgE1BC,WAAcA,2CAA4CA,C;IAC1DC,WAAqBA,QAAEA,C;EAE3BC,YACEA;AACHA;AAIyBA;AADTA;AAAkCA;AACpCA;AAClBA,WAAgBA,QAKlBA;AAHuBA;AACKA;AAC1BA,iBACFA,C;;GAvDAC,0CAGiBA,C;GAgBjBC,wCAEsBA,C;;IAuLXC,WAAcA,kBAAYA,C;IAC1BC,WAAkBA;AAGvBA;AAAJA,YACMA;AAC0CA,wDAGrCA;AAAJA,WAC0CA;KAC1CA,OAC0BA,gCAAQA;KAKDA,qEAExCA,QACFA,C;;GA3IAC,sEAI0EA,C;GAiB1EC,+DAK4EA,C;GAkEjEC,sBAITA,YAEEA,UAAUA;AAGVA,YAEEA,UAAUA;AAEZA,QAGJA,C;;IAmEWC,WAAcA,kBAAYA,C;IAC1BC,WAAkBA;AAEHA;AACpBA,mCAAaA;AAAjBA,OACEA,oCAMJA;AAJMA;AAAJA,SACEA,8BAGJA;AADEA,sCACFA,C;;GAtBAC,oBAGwCA;AAHxCA,gDAK6DA,C;;EQ4OtDC,YACQA;AADRA;AAnFPA;AAqFSA;AAELA;AArDFnZ;AAuDmBmZ;AACfA,SAIFA,WAAwBA;AASEA;AACAA;AAEqBA;AAA/CA,QAWJA,C;;GA5CAC,8CAOoDA,C;;ERjI7CC,YAAcA,sCAAiCA,C;;EADtDC,8BAA8BA,C;;EAiBvBC,YAAcA;4DAEMA,C;;GAH3BC,8BAAkCA,C;;EAe3BC,YAAcA,0BAAqBA,C;;GAD1CC,8BAAwBA,C;;EAiBjBC,YACLA;WACEA,iDAIJA;AAFEA,mDACaA,UACfA,C;;EARAC,8BAAkDA,C;;EAsB3CC,YAAcA,sBAAgBA,C;;;EAgB9BC,YAAcA;8HAEoDA,C;;EO7iBlEC,YAELA,0BACFA,C;;EA8DOC,YACEA;AACsBA;AAehBA;AA8DXA,QAEJA,C;;;;E0ByFKC,cACHA;2BACMA,OADNA,UACoBA,QAGtBA;AADEA,QACFA,C;GAqJQC,YAAOA;AAGCA;AACdA,QAAOA,OACLA;AAEFA,QACFA,C;GAOSC,YAAWA,OAACA,cAASA,GAAUA,C;EA8MtCC,cAASA;AjCtSTA,OAAeA,IAAUA;AiC0SzBA;AACEA,SAA2BA,QAI/BA,CAHIA,IAEFA,UAAUA,4BACZA,C;EAkBOC,YAAcA,OAAaA,kBAAqCA,C;;;;GzBjlB/DC,YAAYA,OAAMA,gCAAQA,C;E0BnD3BC,YAAcA,YAAMA,C;;;;;E1B8BbC,cAAaA,eAAsBA,C;GAGzCC,YAAYA,OAAWA,UAAoBA,C;EAG5CC,YAAcA,sBf2qBLA,ce3qBiDA,C;GAGzDC,cACNA,UAAUA,UAAmCA,QAC9BA,QAAgCA,cACjDA,C;;;;;;GA0eQC,YAAUA,oBAAgBA,C;EA4B3BC,YAAcA;6BAAmCA,C;G2B9iB/CC,YAAWA,wBAAWA,C;;G3BojBjBC,gBACgBA;AACvBA,UAAqBA,QAa5BA;AAZEA,oBAekDA,OAbVA;MAC7BA,YAYuCA,OAVZA;KAC7BA,OASyCA,UAPVA,QAGxCA,QACFA,C;;G4BkvgB2BC,0BAQrBA;AAAgBA;ApBxohBtBxT;AAzKIyT;AoBuzhBFD;;AAOMA;AA2sjBKA,cA1rjBOA;AA0rjBPA,eAxqjBkBA;AAG3BA;AAKFA,QACFA,C;GA+6YQE;AAEJA,QAGJA,C;GAqhQFC,YACQA,iBACJA,QAGJA;AADEA,OC9xqCIC,mBATGC,QDwyqCTF,C;GA0rBiBG,cAEfA;WAA+BA,QAGjCA;AADEA,OAAYA,SACdA,C;;;EA5r4BSC,YAAcA,gBAA+BA,C;;;;GAgzJ/CC,kBAAiBA,wCACZA,C;;;GA24ELC,sBAAIA,kBAC6CA,C;GADjDC,uC;;;;GAxKeC,YACZA;AAAWA;AAAIA;oCAAOA;AAAtBA;AAQAA;AAEJA;AACEA;AADFA,KACEA;KAEAA,OAEHA,C;;;IAy6DQC,YACTA,iBACEA,eAGJA;AADEA,OAAeA,qBAAkBA,WACnCA,C;EAEOC,YAAcA,gBAA+BA,C;;;;EAsrF7CC,YACEA;AACPA,eAA6BA,YAC/BA,C;;;;GAstaKC,WACHA;AAAIA;AAAJA;iBACEA;;AA1koBFA,KACEA,oBA2koBJA,C;;GA1DAC,kBAIYA,WAAiBA;AAJ7BA;AAKEA;AALFA,QAMAA,C;;IAF6BC,YAAOA,OAAQA,YAAcA,C;GCzjlCrDC,YACDA;ArBqHJ1U;AAzKIyT;OqBqDOiB,IAAuBA,yBAE9BA,IAAuBA;AAE3BA,QACFA,C;;GCuFMC,YACEA;AAASA;AAAOA;AACpBA,iBACoBA;AAAlBA,yBAAqCA,QAKzCA,CAHEA;AACAA;AACAA,QACFA,C;GAiBAC,YACEA;AADFA;AACEA,WAAeA,QAoDjBA;AAnDEA,wBAAeA,QAmDjBA;AAlDEA,uBAAcA,QAkDhBA;AAjDEA,uBAAiBA,QAiDnBA;AA/CEA,sBD7K6CA;ALqVzCC,uBAAJA;KxBrHuDC;AwBqHvDD,KAGEA,IAAUA;AM1KVD,O9B+CJE,c8BDAF,CA3CEA,uBAEEA,UAAUA;AAGZA,qDACEA,OAAOA,OAqCXA;ADrL4CA;ACmJ1CA,mCAGaA;AAlCIA;;uBAAMA;AAANA;AAmCXA;AACJA,WAAkBA,QA6BtBA;AA5BWA;AAAPA;AAnCFA,uBAAMA;AAANA;AAsCEA,UAAkBA;AAClBA,UAwBJA,CArBEA,uBAEsBA;AAATA;AA9CIA;8BAAMA;AAgDjBA;AAAJA,WAAkBA,QAiBtBA;AAfmBA;;AAhDjBA,8BAAMA;AAANA;AAuDIA,kBADFA,SACiBA,8BAACA;AAAhBA,QAAUA,eAEZA,QAMJA,CADEA,QACFA,C;GAEAG,cACOA;AAELA,OADWA,UAEbA,C;;GA/BsBC,cAAgBA;;AAAYA;AAARA;AAAJA,QAAuBA,C;;GDxKxDC,cACHA;;AACEA,aAEJA,C;;IAmBkCC,YAAYA,kBAA0BA,C;;IAE7CA,YAAYA,mBAA+BA,C;GEmjBxEC,YACMA;AACAA;AAAJA,WAAsBA,QAexBA;sFAHoBA;AAAKA;;AAEvBA,QACFA,C;IAqBAC,c9C0mBUC;A8CzmBRD,QACFA,C;GAMEE,YACAA,wBAEEA,QAIJA;KAFIA,OAAOA,OAEXA,C;GCjjBQC,gBACwBA;AAA9BA,OAAYA,6BACdA,C;IAEOC,YACDA;AAAYA;AAChBA,WACEA,UAAMA,8BAAiDA;AAG1CA;;AACEA;AClBeA;AACtBA,S1C8QVC,WyC3PuCD,Y9CmG1BA;A8ClGbA,OE9IAA,WF+IFA,C;IAEeE,YACTA;AAAYA;AxByChB1V;AAzKIyT;AwBiIwBiC;AAC5BA,wBAAqCA,KAAaA,eAG9CA,KAAaA;AAEjBA,QACFA,C;IAEKC,WACIA,wBACTA,C;GAEAC,WACMA;mBADNA,cACMA;;AAAmCA;;AACrBA,OAAgBA;;;AAKpBA;YAAkBA,mDAFVA,+B9C2ETA,a8C5ERA,uBAGSA;OAEkBA,OJ67hBRA,wBI77hBgBA;;;AG9JFC;WHiKlCD,OACAA,OACAA,6BGrKqCC;AA0BvBA,SAAaA;APw/kClBD,KIr2kCTA,aAAkCA,0BAAQA;AAEhDA;AAvBMA,wBAuBNA,C;;;GAlISE,WACDA;AAAJA,iCACEA,OAAOA,OAGXA;AADEA,MACFA,C;GAGKC,YACHA;oCACEA,OAAOA,SAIXA;AADEA,MACFA,C;GAGKC,gBACHA;qCACEA,OAAOA,eAKXA;AADEA,MACFA,C;;;;;IA+DuCC,YAAOA,OA1F9CA,WA0F+DA,C;;IAObC,WAChDA,SAAmBA,aACpBA,C;;IACgBA,YAAOA,gBG7JxBA,SH8JmCA,gBAAqBA,C;;IAW/CC,Y1CtG6CA;A0CsGpCA,O1CrGTA,mB0CqG4CA,C;;GAYjDA,YAAYA,OAAWA,8BAA8BA,C;;GACrDA,WAAMA,YAAgBA,qCAAmBA,C;;IAGzCA,YAAUA,OAAWA,4BAAkBA,gBAAqBA,C;;GAIrCA,YAAWA,iBAA4BA,KH5I9DvC,mBATGC,eGqJqEsC,C;GEpLxDC,WACdA;AAAuBA;AACDA,yBAA1BA;AACEA,QAAYA,SAAeA,MAE7BA,QACFA,C;GAKKC,YACCA;AACsBA,yBAA1BA;AACgBA,WAAeA,GAAaA;AAC1CA,UACEA,QAMNA;KALWA,eAITA,QACFA,C;GAKKC,gBACCA;AAQ4BA,yBAAhCA,UzCwIMvjB,AAsDEA,AA8FAA,AwBrPRsZ,GiBvCAiK;AACuCA,sBAArCA;AACgBA,WACTA,KAA8BA,SAAqBA;AACxDA,UACEA,QAORA;KANaA,gBAKXA,QACFA,C;GEpDKC,YACCA,iBAgBNA,C;GAjBKA,YACCA;mBADDA,cACCA;;AAAwCA,OAAlBA;AACMA;AACKA,gBAArCA;AACcA,OAARA,SAAkBA,UACpBA;AAEaA;AACXA,mBACFA;AAEFA,QAA2CA,KAA1BA;AAEnBA;;AACEA;AACAA;YAAMA,mBAANA;cAfCA;AACCA,wBADDA,C;EDFEC,YAAcA,oCAA6BA,eAAIA,C;;GAHtDC,8BAAiCA,C;IAmB7BC,cACEA;AACmBA;A/C2DyBA,O+C3DzBA,SAA0BA;AAGjDA,eAAwCA,SAC1CA,C;GAEKC,WACCA;AAEAA,OAFaA;AAGjBA;;AACAA,uBACEA,mEACEA,aAGNA,C;EAOaC,cAAmCA,mBA4DhDA,C;GA5DaA,cAAmCA;kBAAnCA,gBAAmCA;6CAC9CA;;;AAKAA;OAAkCA;;OAAPA;;;;;A3BkKMC;;A2BjIdD;+BA3BjBA;iBlBssBeA,IAA2BA;AACrCA;AkBrsBHA;AACEA;AAEaA;AACJA;AAEMA;YAAMA,iBAANA;;AACHA;AACVA,cAAiBA;MACjBA,cxC1CVxG,gBwC2CwBwG;AAEhBA;;W3B5CoBA,IAAUA;AACpCA;A2B6CMA;MAGcA;AACmBA,qBxCnDzCxG;AwCsDQwG;;W3BrDoBA,IAAUA;AACpCA;A2BsDMA;MAEFA;AACAA;AACqBA;AACTA;AACNA,aAAiBA;AACjBA,cxC/DZxG,gBwCgE0BwG;AAEhBA;;W3BjEkBA,IAAUA;AACpCA;A2BkEQA;mBAEFA,WAvCJA;;QA0CAA,KAAQA;;;;;;AAtDoCA;;AAwD5CA,gEAAgEA;AAChEA,cAzD4CA;;;;;OA2D9CA;OA3DWA;;AAAmCA,uBAAnCA,C;GEzBDE,oBAMNA;AANMA;;AAMYA;AACPA;;AACDA;AACAA;AAELA;AAEPA;AnBmhBJA;AASeC;;;AmBzhBGD;AA2BlBA;AACOA,WAA2BA,QAElCA,QACFA,C;IAEKE,cAAwBA,eAAMA,C;;GAjCjCC,YAA2BA;AACzBA;;;AACAA;;AAEAA;AnByxBAC;AAAOA;;AAAPA,uBAAMA;AAANA;AACeA;AAAfA;AACAA,YA8CuBC;;;AACXA;AAAgBA;AAATA;AACnBA;AACAA;AACAA;AACAA;AACAA;AmB90BAF;;AAEqBA;AAArBA;;AACOA,YACHA;AACqBA;AAAgBA;AAArCA,iBC5CJA,QACAA,eD4CaA,aACYA;AAAgBA;AAArCA,iBC9CJA,QACAA,WDgDYA,OAARA,SAAkBA,WACCA;GnBkuBnBA;AAASA;AAAbA,SAAoBA,IAA2BA;AAExBA;AAAOA;AAAfA;AAAfA;AACWA,4BAAMA;AAANA;AACXA;AmBluBIA;AACAA,gBACQA;AACVA,eAEJA,C;GAzBAG,WAAkBA,mCAAlBA,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BrDaWC,kBACTA,0BADSA,C,WA2IPC,kBAA6BA,iBAA7BA,C,WC49C0BC,kBAC1BA,IAAeA;0CADWA,C,WAKAC,kBAC1BA,IAAeA;0CADWA,C,WAKAC,kBAC1BA,IAAeA,WADWA,C,WAKAC,kBAC1BA,IA+N2BA;iEAhODA,C,WAKAC,kBAC1BA,IAAeA,aADWA,C,WAKAC,kBAC1BA,IAoO2BA;qEArODA,C,WAKAC,kBAC1BA,IAAeA,WADWA,C,WAKAC,kBAC1BA,IAsP2BA,2DAvPDA,C,WAKAC,kBAC1BA,IAAeA,aADWA,C,WAKAC,kBAC1BA,IA0P2BA,+DA3PDA,C,WsBlrDRC,kBAClBA,MADkBA,C,WQ+PbC,oB,Wf8cNC,4C",
-  "x_org_dartlang_dart2js": {
-    "minified_names": {
-      "global": "h,656,cA,611,bY,657,hi,658,i,143,dt,659,fB,583,J,660,he,132,at,661,r,662,f,663,eg,617,hj,658,hk,658,t,664,b3,665,en,666,d,94,l,138,ex,666,hl,658,ef,667,hm,658,bc,666,ay,616,bj,269,aK,270,bi,271,bh,272,bo,274,bn,266,fd,668,ar,669,fc,522,bV,666,b,115,c,111,z,119,hx,670,aX,671,b2,666,c_,666,ev,672,c5,673,O,541,n,674,M,139,Y,149,C,675,et,676,dk,677,c8,678,aI,679,e_,197,dE,199,af,112,bg,680,ab,681,x,666,D,666,p,117,ap,682,c1,683,ew,554,df,560,b4,684,b_,666,dv,550,E,248,b8,685,cG,116,b7,686,P,687,dn,688,e,689,a8,690,e2,691,bm,147,L,145,ai,91,fC,146,a,692,fZ,246,dy,693,b0,694,bE,685,as,695,cx,137,bR,696,bl,367,fE,368,c6,697,aB,698,aT,118,al,699,bU,502,dG,700,F,701,ff,702,j,703,v,704,ca,705,cF,130,hv,151,aV,706,fI,484,ae,113,dp,707,aL,485,fa,708,b5,709,dS,710,ao,711,bs,142,bX,712,bI,713,d7,666,d8,714,ah,157,av,156,cE,144,aE,666,d6,212,fP,135,cw,133,cz,155,aP,134,w,158,hB,715,q,716,cn,159,ct,153,ho,160,m,717,W,150,eQ,718,bH,67,d9,77,fb,719,bS,720,aS,247,a9,666,cC,528,aY,629,c4,721,aq,722,el,723,ek,724,ed,725,dw,726,b9,558,am,727,h3,141,eX,728,U,286,S,729,aM,282,f4,730,f3,731,f2,732,aJ,733,H,120,aC,734,cm,735,G,736,f5,737,fJ,275,fN,285,cp,284,co,283,eU,738,eV,739,f1,740,fM,741,fO,279,T,742,cq,278,ad,743,ac,744,cb,745,bk,746,fF,276,eD,747,eF,748,X,123,eE,749,fr,666,fq,291,fs,750,eH,751,hf,121,eT,752,eG,753,fj,754,fi,755,f0,756,cd,757,eY,758,eZ,758,f_,758,bw,280,hs,634,bP,666,dq,666,dP,635,ht,640,aN,114,fg,759,cg,760,eO,666,a7,761,bf,762,f9,763,eN,423,eP,764,au,765,ce,766,eL,666,bd,762,be,767,cf,768,f6,769,f7,770,eK,394,eM,771,bD,666,bL,772,bb,666,fV,598,dO,773,ez,774,eb,775,dl,776,e9,777,ak,778,e5,779,e6,780,e8,781,ea,782,e7,783,dm,784,R,785,aG,786,dK,787,dL,788,dM,241,fW,789,fX,789,eW,790,eu,556,a5,791,hq,171,hr,172,fQ,792,fo,793,fw,273,fx,794,fy,794,bt,795,hc,167,hh,162,cy,796,aO,797,aQ,798,cs,799,aR,165,cB,164,bu,0,b1,800,hd,168,h8,169,cD,801,hn,166,V,170,h9,802,ha,802,hb,802,eA,803,fp,804,eB,805,eC,806,eS,807,aF,808,fR,586,eR,596,fk,358,em,481,eo,809,dr,666,an,810,bQ,811,dJ,812,dN,666,fH,813,bW,814,dR,815,a6,816,dd,817,h4,92,bG,818,aW,819,c2,666,eq,820,B,821,bJ,822,dc,823,da,824,a_,825,aD,826,bF,827,db,828,ei,666,eh,214,ee,190,ep,829,fK,830,cr,610,fL,830,fG,612,fA,607,fz,608,e3,831,e1,832,c0,833,e4,834,dB,835,ba,836,bZ,666,dY,837,aa,836,dX,552,dh,838,di,839,eJ,840,c9,841,bM,842,aZ,843,du,844,hp,131,hE,845,u,846,dz,847,dC,848,Q,849,e0,850,a4,851,a1,852,hD,853,bv,854,a2,855,bT,856,dA,857,a3,858,a0,859,eI,860,bO,861,dg,862,dj,863,hP,864,hQ,865,hR,866,hS,867,hV,868,hW,869,hU,870,hT,871,hY,872,hX,873,c7,874,dW,875,b6,876,bq,877,dV,878,K,879,hH,880,hI,881,hJ,882,hK,883,hL,884,hM,885,hN,886,cc,887,er,888,es,889,fv,890,fh,891,f8,892,dx,893,aH,894,ft,895,dT,896,c3,897,ej,898,fl,899,cl,429,de,900,bK,901,dF,902,dI,903,dH,904,fe,905,hA,906,bN,907,ds,908,dQ,909,dU,910,dZ,911,ec,912,ey,913,hG,914,dD,915,hz,916,ch,917,ci,918,cj,919,ck,920,fm,921,fn,922,fu,923,ax,1,hC,924,hg,93,bp,129,hw,136,ic,140,ia,154,ib,161,i_,925,i0,926,i1,927,i8,277,hO,666,i3,364,i4,486,i6,614,i7,615,i2,636,hy,641,hF,642,hZ,928,i9,654,i5,655,cH,864,cI,865,cJ,866,cK,867,cN,868,cO,869,cM,870,cL,871,cQ,872,cP,873,bx,641,aj,654,bz,928,by,642,cR,655,bB,929,y,930,h6,931,h5,932,h7,933,fY,934,k,935,I,936,aw,937,cV,938,ag,939,aA,940,N,941,cY,942,h2,943,o,944,cS,945,h_,946,cX,947,d5,948,fD,949,A,950,h0,951,aU,952,h1,953,cu,954,fS,955,fT,956,fU,957,hu,958,cv,959,Z,960,cT,961,bC,962,bA,963,cU,964,d_,965,d0,966,d2,967,d1,968,cW,969,cZ,970,d4,971,d3,972,br,973,az,974",
-      "instance": "b1,975,bV,976,b4,977,b3,978,b_,979,b5,980,b7,666,aZ,981,b0,979,b2,982,b6,983,bO,984,p,985,h,979,aw,986,bB,987,bY,988,ca,989,bS,990,aV,991,a2,992,aX,993,ar,721,bU,994,D,995,ba,996,c8,997,bn,998,ao,999,af,1000,aB,1001,bi,1002,l,1003,q,1004,bg,1005,aS,1006,Y,1007,al,981,C,1008,bG,1009,aj,1010,U,1011,Z,1012,aq,1013,ai,1014,aW,1015,c5,1016,a0,1017,bW,1006,bd,1018,aP,1019,aE,1020,ah,1008,S,1021,a9,1022,bF,1023,bh,1024,ak,1025,bR,1026,ap,1027,cc,1028,T,976,ax,1029,ag,1030,c7,1031,be,1032,at,1033,aI,1034,av,1035,ab,1036,X,1037,K,1038,bj,1039,c6,1040,a5,1011,bz,1041,bt,1042,br,1043,bp,1044,bP,1045,cb,990,a1,984,aQ,1046,aC,1047,a8,1048,W,1049,w,1050,bu,1051,bN,611,R,1052,bL,1053,az,1054,J,1055,a3,1056,bo,1057,aa,1058,bC,987,c_,1027,bm,1059,ac,1060,bD,1061,aF,1062,ay,1063,n,829,G,1064,c0,1065,bM,1066,am,1067,aT,1068,A,1069,bv,1070,P,1034,bQ,1071,b9,1072,by,1073,aK,584,au,1033,N,1074,aA,1075,F,1076,aO,989,bZ,1077,bq,1078,u,1079,b8,1080,V,1081,aN,1082,aH,1083,bT,1084,bc,1085,bs,1042,aM,1086,bI,1087,bJ,1088,j,1089,bb,1090,a4,1091,aJ,1034,aG,1092,as,1093,c3,1094,c2,1056,bk,1095,bA,1096,a_,1097,O,1098,aY,1081,bw,1008,bE,1099,aU,1100,t,611,a7,1101,bl,1102,I,1103,bK,1104,aD,1105,B,1106,an,1107,a6,1108,aL,1109,bx,1073,c1,1065,ae,1110,bf,1111,bH,1112,E,1113,aR,994,ad,1114,c4,1094,bX,988,i,1115,k,1116,L,1117,c9,1118,M,1119,H,1120,v,1121"
-    },
-    "frames": "uhUAiKoBkmCyB;0NA+BhBCqE;8IA8I8BCW;iuCEnN9BC6C;0BA+GAAuC;wIAsLAC2C;+SAsGAAuC;2HAoE4BCe;yBAcE7csB;qFAO9B2c2C;wJAoBAC8C;mYAtGkBES;s/DK6WiB9csB;wBAIHA4B;qlGGn3BFAS;6YA4DjBAiB;QAEF+ciB;2GAyLqB/ciB;usBHjOFA8B;oxDN4nBXgdK;+uCAuaU9/BAAxzBpB8iBqC,A;2yBA8tCmBmB0B;2GAyCnBAuB;sGAqCcnBa;ovCAkjBfAmC;yFAKKAU;0EAWaA4E;yHASbAU;kFAmCmBAW;4DAGtBAW;0KA4DFAAcjtE8BAgE,A;8Wd81E1BAgD;AAEAA4I;qgDA0M+BidyC;6NAYXAyC;s5BAkGAAyC;AACIC6C;w/BAuhBbCe;2BAElBCmB;+CAqFoBDU;oFA2DjBndY;+MaltGN9gBiC;8CAYYAiC;gQA8CPm+BkC;4rCAyJiBrde;8CAExBsdAEqNACQ,A;iWFvGKC6B;+JAiBWCqBARACAboMCVyC,A,A;iPa1Gf99BI;YAAAAgB;iTA2EkBy+BO;iQAgCfCkB;+hBAwFOCuD;qUAgCAAuD;mKAoBPLoB;4pDGvkBE/8BAA2BTq9B+G,A;iIAZSr9BAAYTq9B+G,A;uwCAsKgB98B4D;g1BJ9QHgfe;0EA8B+BkVAX6aZlVsB,A;6ND/Of+dK;8PASDCAkBjUJheyB,A;uGlBmUAiekB;OAGCjeoB;yOA4DAkegD;ivBAq5CAlemR;i7DAq+BO0cY;4FAkCC1c8C;gfkBtxFRAe;4MAwBEme2B;8TAiCAAwB;21BA2HgBnegB;2sBA0JlBAkBA0BbAAAAAAQ,A,A;qoFIvUQoeS;0CA0IGpeSAnCYqeAAAACAgC4oBSteS/B9xB5BAAAjC0BweAAAAxe+B,A,A,A,A,A,A;oRDoTPAwB;AACrByeY;glBE7QYCU;2CAYqB1ekB;oCAIrB0eU;oGAsBkB1ec;mKAsD3BlYgB;iCEw6DGkYc;sbDn6BkB2egC;8lBHzhC1B3eU;2jBAyLUAc;kJCpSA9WA+B+4BuC8Wa,A;iqB/BvxBtC4eW;sRAmHe5eyB;QACPsY6B;kCA0EbuGS;4CAQiBCS;AACLCM;uBAIZCoB;oBAIFl3BgB;iFAQE+2BS;wFAeiBCS;AACLCM;uBAIZCoB;kCAIFl3BgB;6RA6FA22BkB;8CAkBFQAA/KACS,AAAoBlfqB,A;oFAoMpBmfS;oBACAr3BgB;oFASIq3BS;oBACAr3BgB;iFAeJq3BS;oBACAr3BgB;4DA3HAq3BU;kIAkCkBLM;iBAIhBEgB;oBAIAIY;sFA6FuBCU;kBAGYCM;6BACxBCsB;sFA6BcCM;mCACFZY;uBACGD6B;uDAGfYsB;OAMWpVM;0BAsEPsVM;uKAwBKCwB;AACZVgB;4CAaIUwB;mBAEVjBiB;AAGASY;wKA7RASM;2PA2FFCQA/BFnBiB,Q;+LA+HyBoByB;wHAKY7fkB;+BAMmB+eiC;AAC3BMyB;AACqBCY;oLAiBnBQuC;2BAEI9fkB;yKAcNsfa;uDAGQtfkB;gOEqcvBAa;oDAEd+f+B;8HAkMERyB;mHAYAAyB;0+BGrwCevfiB;iEAydAgeAVzcPhemB,A;2BU8eCgeAV9eDhemB,A;wBUsfeAyB;0CA8PRAe;gRE5iBXggBmB;yFAsBoBhgBc;2BAGxBggBkC;4CAKF1CAfuRACe,A;AetRO9JS;68BC3PUzTmB;mBAGfsdAhB8gBFCiB,A;gCgBngBEDAhBmgBFCyB,A;iDgB7fO9JS;+DA4BqByBA9B2gBElVyB,A;A8B1gBEkVAzB7CFlVwB,A;kQsBuDnBAe;6vFAyWAAW;8TA4ZAAc;ouBA+DTqGc;i5BAsGFAgB;iqCEx5Bc6OcEypBgBlVgBArH8BAAA7HDigBsC,A,AAuB7DjgBAAsGAAY,A,A,A;6CF7hBqBkVkBEkpBWlVgBArH8BAAA7HDigBsC,A,AAuB7DjgBAAsGAAY,A,A,A;iG9BrlBgCAwB;sGAmBR+Tc;4S6BxChBuJe;gBAGFAc;AACAAAhBsgBJCW,A;AgBrgBIDW;q1BAiWEtdS;2EEmPwBAmC;kIA+BnBkgB8D;qNA2RXC4B;wZDt1BSCY;wEAGEAc;iKAeAAc;ykCAwfTCAAxBFjHY,qD;wLAgL8BpZoBArH8BAAA7HDigBc,A,A;uCAkP7BjgBAA3NhCAAAsGAAY,A,A;0IAmJkBAe;+MAaIAe;2FAxHesgBAAAAtgBiB,A;wOGhpBzBAoC;SAAAAY;UAAAAuB;gJAwECA+B;oJAiCPugBS;sUAkBOvgBc;kIAgBPwgBe;ioBA0HFpHY;8eAoD2BlEAlCyPClVyB,A;qgBmCpcFygBa;mGAeIAkB;+RAgZZCkB;MAEhBCAA4RJAArB9RiBEa,A,A;iBqBKTFAAyRRAArB9RiBEa,A,A;aqBQTFAAsRRAArB9RiBEc,A,A;cqBWTFAAmRRAArB9RiBEc,A,A;cqBcTFAAgRRAArB9RiBEc,A,A;cqBiBTFAA6QRAArB9RiBEc,A,A;cqBoBTFAA0QRAArB9RiBEc,A,A;AqBqBTFAAyQRAArB9RiBEa,A,A;AqBsBTFAAwQRAArB9RiBEa,A,A;WqBuBTFAAuQRAArB9RiBEyB,A,A;OqBwBTFAAsQRAArB9RiBEyB,A,A;sCqB4BGHkB;MAEhBCAAgQJAArB9RiBEa,A,A;AqB+BbFAA+PJAArB9RiBEa,A,A;SqBmCfCAAmPFxDiB,A;OAjPEoDe;6GAWQ1gBuB;iJA+BR+gBwC;CAAAAiB;wHAcACmB;yBAGAFiB;yBAGAAkB;0BAGAAiB;sCAGAAkB;WAAAAS;yDAOACwC;CAAAAQ;kDAMAAwC;CAAAAQ;iDASFDkB;iFAIIAS;eAIJAQ;qDAMEAe;4GAcFAkB;oDAMEAU;4CAGFAS;4PA2GmDrNe;iEAnBtCzTe;AACbihBAAWgBjhBgBAxBZAQ,A,Q;AAcGyTM;6HrB5kBWiJW;2XsBzDZ1cqB;kBClKNkhBO;6EvB6nBI5DgB;AACAAAA1FJCW,A;0SwBEuB4DY;OACDCY;OACACY;OACACY;OACECY;OACACY;OACCCwD;m0DxBqEHzhBe;oEAIlBsdAAjFJCQ,A;i8CyBmFWmEwC;kbzBvkBmBhFc;qYAuhBjBiFO;0BAGFAO;oBAGEAU;wG4B8vgBO3hBAW5jgBKAA/BrvBvBAAAtB0BweAAAAxeqB,A,A,kB,A;yDoBq2hBxB4hBc;kBAkBAAe;sIAs9oBC7mBAEtzqCADADcDkFmB,Q,A;+hFDiplCF6hByB;gFAxDJ7hBAAAAAO,A;2ICpjlCoBAAUisBOAA/BrvBvBAAAtB0BweAAAAxewB,A,A,4B,A;iZsBuMnBhEcD9KA8lBALoVXCAxBvHAAiC,A,KwBuHAAAxBvHAAsD,A,A,A;O8B/CW/lBAD9KA8lBc,A;0IC0LLE2B;gDAISC2C;CAAAAO;yCAIXCuB;CAAAAO;+EAQkDDuC;6DAOlDC8B;CAAAAO;yzBC6bYCA/BhmBRCAAKYEgB,A,A;uhBgCsEFCuC;AADICA9CmGTxiBW,A;Y8CnGSwiBiB;OACfxiBW;0DAISAAOqnBWAA/BrvBvBAAAtB0BweAAAAxeqB,A,A,kB,A;uewBsKZwiBa;sCAOKCwB;iDAETziBAGhKa0iBkB,A;2CHgKb1iBAGlK2B2iBe,AAwBzC3iBAAAAAyB,A,A;AHsJU4hBK;ukBA1CoC5hBW;wKAWtCAS;gFAWU4iBS;OAAAAmB;iWAoB2CCAJ+pnBzC9nBAEn0nBbDADcDkFmB,e,A,A;m0CMlBW8cO;onBA6BDiGA3B7BgBCQ,A;iF2BoCGCwB;4IAW3B3rBAZtEN4pBgB,A;4FYyEM5LgD;yCAMAheAZ/EN4pBoF,A;4BYkFM5LgD;8GASEheAZ3FR4pBgB,A;4FY8FQ5LgD;2iBE3DQtVsBnBkhBlBAAAAAAmD,A,A;iSmB5gBEkjBAnB0tBA3P8C,A;CmB1tBA2PAnB0tBA3PyCAiEoB4P8J,A,A;0ImBrxBCCuB;oDAEAAmB;iDAOVC0G;CAAAAiB;24QpDinDMC0G;qFAUAC8G;mFAUACuD;qFAUAC2D;"
-  }
-}
diff --git a/build_runner/lib/src/server/graph_viz_main.dart.js.map b/build_runner/lib/src/server/graph_viz_main.dart.js.map
deleted file mode 100644
index 3e09cad..0000000
--- a/build_runner/lib/src/server/graph_viz_main.dart.js.map
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "version": 3,
-  "engine": "v2",
-  "file": "graph_viz_main.dart.js",
-  "sourceRoot": "",
-  "sources": ["org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/interceptors.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_array.dart","org-dartlang-sdk:///sdk/lib/internal/iterable.dart","org-dartlang-sdk:///sdk/lib/collection/list.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_number.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_string.dart","org-dartlang-sdk:///sdk/lib/core/errors.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/internal_patch.dart","org-dartlang-sdk:///sdk/lib/internal/symbol.dart","org-dartlang-sdk:///sdk/lib/js/_js_client.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_rti.dart","org-dartlang-sdk:///sdk/lib/core/exceptions.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/core_patch.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/native_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/constant_map.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/regexp_helper.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/js_names.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/native_typed_data.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/async_patch.dart","org-dartlang-sdk:///sdk/lib/async/future_impl.dart","org-dartlang-sdk:///sdk/lib/async/schedule_microtask.dart","org-dartlang-sdk:///sdk/lib/async/zone.dart","org-dartlang-sdk:///sdk/lib/async/stream.dart","org-dartlang-sdk:///sdk/lib/async/stream_impl.dart","org-dartlang-sdk:///sdk/lib/html/dart2js/html_dart2js.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/collection_patch.dart","org-dartlang-sdk:///sdk/lib/collection/iterable.dart","org-dartlang-sdk:///sdk/lib/collection/linked_hash_set.dart","org-dartlang-sdk:///sdk/lib/collection/maps.dart","org-dartlang-sdk:///sdk/lib/collection/set.dart","org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/convert_patch.dart","org-dartlang-sdk:///sdk/lib/convert/json.dart","org-dartlang-sdk:///sdk/lib/convert/utf.dart","org-dartlang-sdk:///sdk/lib/core/date_time.dart","org-dartlang-sdk:///sdk/lib/core/iterable.dart","org-dartlang-sdk:///sdk/lib/core/null.dart","org-dartlang-sdk:///sdk/lib/core/uri.dart","org-dartlang-sdk:///sdk/lib/convert/codec.dart","org-dartlang-sdk:///sdk/lib/js/dart2js/js_dart2js.dart","org-dartlang-sdk:///sdk/lib/svg/dart2js/svg_dart2js.dart","graph_viz_main.dart","org-dartlang-sdk:///sdk/lib/async/future.dart"],
-  "names": ["makeDispatchRecord","getNativeInterceptor","Interceptor.==","Interceptor.hashCode","Interceptor.toString","Interceptor.noSuchMethod","JSBool.toString","JSBool.hashCode","JSNull.==","JSNull.toString","JSNull.hashCode","JSNull.noSuchMethod","JavaScriptObject.hashCode","JavaScriptObject.toString","JavaScriptFunction.toString","JSArray.add","JSArray.addAll","JSArray.map","JSArray.join","JSArray.elementAt","JSArray.last","JSArray.any","JSArray.contains","JSArray.toString","JSArray.iterator","JSArray.hashCode","JSArray.length","JSArray.[]","JSArray.markFixed","JSArray.markFixedList","ArrayIterator.current","ArrayIterator.moveNext","JSNumber.toInt","JSNumber.toString","JSNumber.hashCode","JSNumber.<<","JSNumber._shrOtherPositive","JSNumber._shrBothPositive","JSNumber.<=","JSString.codeUnitAt","JSString._codeUnitAt","JSString.+","JSString.startsWith","JSString.startsWith[function-entry$1]","JSString.substring","JSString.substring[function-entry$1]","JSString.toLowerCase","JSString.trim","JSString.*","JSString.indexOf","JSString.indexOf[function-entry$1]","JSString.toString","JSString.hashCode","JSString.length","JSString.[]","JSString._isWhitespace","JSString._skipLeadingWhitespace","JSString._skipTrailingWhitespace","IterableElementError.noElement","IterableElementError.tooMany","ListIterable.iterator","ListIterable.where","ListIterable.map","ListIterator.current","ListIterator.moveNext","MappedIterable.iterator","MappedIterable.length","MappedIterable","MappedIterator.moveNext","MappedIterator.current","MappedListIterable.length","MappedListIterable.elementAt","WhereIterable.iterator","WhereIterable.map","WhereIterator.moveNext","WhereIterator.current","Symbol.hashCode","Symbol.toString","Symbol.==","isBrowserObject","unminifyOrTag","getType","isJsIndexable","S","Primitives.objectHashCode","Primitives.objectTypeName","Primitives._objectClassName","Primitives.stringFromCharCode","Primitives.lazyAsJsDate","Primitives.getYear","Primitives.getMonth","Primitives.getDay","Primitives.getHours","Primitives.getMinutes","Primitives.getSeconds","Primitives.getMilliseconds","Primitives.functionNoSuchMethod","createUnmangledInvocationMirror","Primitives.applyFunctionWithPositionalArguments","Primitives._genericApplyFunctionWithPositionalArguments","iae","ioore","diagnoseIndexError","diagnoseRangeError","argumentErrorValue","wrapException","toStringWrapper","throwExpression","throwConcurrentModificationError","unwrapException","getTraceFromException","objectHashCode","fillLiteralMap","invokeClosure","Exception","convertDartClosureToJS","Closure.fromTearOff","Closure.cspForwardCall","Closure.forwardCallTo","Closure.cspForwardInterceptedCall","Closure.forwardInterceptedCallTo","closureFromTearOff","propertyTypeCastError","interceptedTypeCast","extractFunctionTypeObjectFromInternal","functionTypeTest","_typeDescription","throwCyclicInit","getIsolateAffinityTag","setRuntimeTypeInfo","getRuntimeTypeInfo","getRuntimeTypeArguments","getRuntimeTypeArgumentIntercepted","getRuntimeTypeArgument","getTypeArgumentByIndex","runtimeTypeToString","_runtimeTypeToString","_functionRtiToString","_joinArguments","StringBuffer.write","substitute","checkSubtype","subtypeCast","Primitives.formatType","areSubtypes","computeSignature","_isSubtype","_isFunctionSubtype","namedParametersSubtypeCheck","defineProperty","lookupAndCacheInterceptor","patchProto","patchInteriorProto","makeLeafDispatchRecord","makeDefaultDispatchRecord","initNativeDispatch","initNativeDispatchContinue","initHooks","applyHooksTransformer","ConstantMap.toString","ConstantStringMap.length","ConstantStringMap.containsKey","ConstantStringMap.[]","ConstantStringMap._fetch","ConstantStringMap.forEach","ConstantStringMap.keys","_ConstantMapKeyIterable.iterator","_ConstantMapKeyIterable.length","JSInvocationMirror.memberName","JSInvocationMirror.positionalArguments","JSInvocationMirror.namedArguments","JsLinkedHashMap.es6","ReflectionInfo.defaultValue","ReflectionInfo","Primitives.functionNoSuchMethod.<anonymous function>","TypeErrorDecoder.matchTypeError","TypeErrorDecoder.extractPattern","TypeErrorDecoder.provokeCallErrorOn","TypeErrorDecoder.provokePropertyErrorOn","NullError.toString","NullError","JsNoSuchMethodError.toString","JsNoSuchMethodError","UnknownJsTypeError.toString","unwrapException.saveStackTrace","_StackTrace.toString","Closure.toString","StaticClosure.toString","BoundClosure.==","BoundClosure.hashCode","BoundClosure.toString","BoundClosure.selfOf","BoundClosure.receiverOf","BoundClosure.computeFieldNamed","CastErrorImplementation.toString","CastErrorImplementation","RuntimeError.toString","RuntimeError","JsLinkedHashMap.length","JsLinkedHashMap.keys","JsLinkedHashMap.[]","JsLinkedHashMap.internalGet","JsLinkedHashMap._getBucket","JsLinkedHashMap.[]=","JsLinkedHashMap.internalSet","JsLinkedHashMap.forEach","JsLinkedHashMap._addHashTableEntry","JsLinkedHashMap._modified","JsLinkedHashMap._newLinkedCell","JsLinkedHashMap.internalFindBucketIndex","JsLinkedHashMap.toString","JsLinkedHashMap._getTableCell","JsLinkedHashMap._getTableBucket","JsLinkedHashMap._setTableEntry","JsLinkedHashMap._deleteTableEntry","JsLinkedHashMap._newHashTable","LinkedHashMapKeyIterable.length","LinkedHashMapKeyIterable.iterator","LinkedHashMapKeyIterator","LinkedHashMapKeyIterator.current","LinkedHashMapKeyIterator.moveNext","initHooks.<anonymous function>","JSSyntaxRegExp.toString","JSSyntaxRegExp.makeNative","extractKeys","_checkValidIndex","_checkValidRange","NativeTypedArray.length","NativeTypedArrayOfDouble.[]","NativeInt16List.[]","NativeInt32List.[]","NativeInt8List.[]","NativeUint16List.[]","NativeUint32List.[]","NativeUint8ClampedList.length","NativeUint8ClampedList.[]","NativeUint8List.length","NativeUint8List.[]","_AsyncRun._initializeScheduleImmediate","_AsyncRun._scheduleImmediateJsOverride","_AsyncRun._scheduleImmediateWithSetImmediate","_AsyncRun._scheduleImmediateWithTimer","_makeAsyncAwaitCompleter","Completer.sync","_Completer.future","_asyncStartSync","_asyncAwait","_asyncReturn","_asyncRethrow","_awaitOnObject","_wrapJsFunctionForAsync","_registerErrorHandler","_microtaskLoop","_startMicrotaskLoop","_scheduleAsyncCallback","_schedulePriorityAsyncCallback","scheduleMicrotask","StreamIterator","_rootHandleUncaughtError","_rootRun","_rootRunUnary","_rootRunBinary","_rootScheduleMicrotask","_AsyncRun._initializeScheduleImmediate.internalCallback","_AsyncRun._initializeScheduleImmediate.<anonymous function>","_AsyncRun._scheduleImmediateJsOverride.internalCallback","_AsyncRun._scheduleImmediateWithSetImmediate.internalCallback","_TimerImpl","_TimerImpl.internalCallback","_AsyncAwaitCompleter.complete","_AsyncAwaitCompleter.completeError","_AsyncAwaitCompleter.complete.<anonymous function>","_AsyncAwaitCompleter.completeError.<anonymous function>","_awaitOnObject.<anonymous function>","_wrapJsFunctionForAsync.<anonymous function>","_Completer.completeError","_nonNullError","_Completer.completeError[function-entry$1]","_AsyncCompleter.complete","_AsyncCompleter._completeError","_SyncCompleter.complete","_SyncCompleter.complete[function-entry$0]","_SyncCompleter._completeError","_FutureListener.matchesErrorTest","_FutureListener.handleError","_Future.then","_Future.then[function-entry$1]","_Future._thenNoZoneRegistration","_Future._addListener","_Future._prependListeners","_Future._removeListeners","_Future._reverseListeners","_Future._complete","_Future._completeError","_Future._setError","_Future._asyncComplete","_Future._chainFuture","_Future._asyncCompleteError","_Future._chainForeignFuture","_Future._chainCoreFuture","_Future._propagateToListeners","_Future._addListener.<anonymous function>","_Future._prependListeners.<anonymous function>","_Future._chainForeignFuture.<anonymous function>","_Future._chainForeignFuture[function-entry$1].<anonymous function>","_Future._asyncComplete.<anonymous function>","_Future._completeWithValue","_Future._chainFuture.<anonymous function>","_Future._asyncCompleteError.<anonymous function>","_Future._propagateToListeners.handleWhenCompleteCallback","_Future._propagateToListeners.handleWhenCompleteCallback.<anonymous function>","_Future._propagateToListeners.handleValueCallback","_Future._propagateToListeners.handleError","Stream.length","_Future","Stream.length.<anonymous function>","Stream_length_closure","AsyncError.toString","_rootHandleUncaughtError.<anonymous function>","_RootZone.runGuarded","_RootZone.runUnaryGuarded","_RootZone.runUnaryGuarded[function-entry$2]","_RootZone.bindCallback","_RootZone.bindCallback[function-entry$1]","_RootZone.bindCallbackGuarded","_RootZone.bindUnaryCallbackGuarded","_RootZone.[]","_RootZone.run","_RootZone.run[function-entry$1]","_RootZone.runUnary","_RootZone.runUnary[function-entry$2]","_RootZone.runBinary","_RootZone.runBinary[function-entry$3]","_RootZone.registerBinaryCallback","_RootZone.registerBinaryCallback[function-entry$1]","_RootZone.bindCallback.<anonymous function>","_RootZone.bindCallbackGuarded.<anonymous function>","_RootZone.bindUnaryCallbackGuarded.<anonymous function>","_RootZone_bindUnaryCallbackGuarded_closure","_HashMap._getTableEntry","_HashMap._setTableEntry","_HashMap._newHashTable","LinkedHashMap._literal","LinkedHashMap._empty","LinkedHashSet","IterableBase.iterableToShortString","IterableBase.iterableToFullString","_isToStringVisiting","_iterablePartsToStrings","LinkedHashSet.from","MapBase.mapToString","_HashMap.length","_HashMap.keys","_HashMap.containsKey","_HashMap._containsKey","_HashMap.[]","_HashMap._get","_HashMap.[]=","_IdentityHashMap._computeHashCode","_HashMap.forEach","_HashMap._computeKeys","_HashMap._getBucket","_IdentityHashMap._findBucketIndex","_HashMapKeyIterable.length","_HashMapKeyIterable.iterator","_HashMapKeyIterator.current","_HashMapKeyIterator.moveNext","_LinkedHashSet.iterator","_LinkedHashSetIterator","_LinkedHashSet.length","_LinkedHashSet.contains","_LinkedHashSet._contains","_LinkedHashSet.add","_LinkedHashSet._add","_LinkedHashSet._addHashTableEntry","_LinkedHashSet._newLinkedCell","_LinkedHashSet._computeHashCode","_LinkedHashSet._findBucketIndex","_LinkedHashSet._newHashTable","_LinkedHashSetIterator.current","_LinkedHashSetIterator.moveNext","ListMixin.iterator","ListMixin.elementAt","ListMixin.map","ListMixin.toString","MapBase.mapToString.<anonymous function>","MapMixin.forEach","MapMixin.length","MapMixin.toString","MapView.[]","MapView.forEach","MapView.length","MapView.keys","MapView.toString","SetMixin.addAll","SetMixin.map","SetMixin.toString","_parseJson","_convertJsonToDartLazy","_JsonMap.[]","_JsonMap.length","_JsonMap.keys","_JsonMap.forEach","_JsonMap._computeKeys","_JsonMap._process","_JsonMapKeyIterable.length","_JsonMapKeyIterable.elementAt","_JsonMapKeyIterable.iterator","JsonCodec.decode","JsonCodec.decode[function-entry$1]","JsonCodec.decoder","Utf8Codec.encoder","Utf8Encoder.convert","Utf8Encoder.convert[function-entry$1]","_Utf8Encoder._writeSurrogate","_Utf8Encoder._fillBuffer","Error._objectToString","List.from","RegExp","Error.safeToString","NoSuchMethodError.toString.<anonymous function>","DateTime.==","DateTime.hashCode","DateTime.toString","DateTime._fourDigits","DateTime._threeDigits","DateTime._twoDigits","NullThrownError.toString","ArgumentError._errorName","ArgumentError._errorExplanation","ArgumentError.toString","ArgumentError","ArgumentError.value","RangeError._errorName","RangeError._errorExplanation","RangeError.value","RangeError.range","RangeError.checkValidRange","IndexError._errorName","IndexError._errorExplanation","IndexError","NoSuchMethodError.toString","NoSuchMethodError","UnsupportedError.toString","UnsupportedError","UnimplementedError.toString","UnimplementedError","StateError.toString","StateError","ConcurrentModificationError.toString","ConcurrentModificationError","OutOfMemoryError.toString","StackOverflowError.toString","CyclicInitializationError.toString","_Exception.toString","FormatException.toString","FormatException","Iterable.map","Iterable.where","Iterable.join","Iterable.length","Iterable.single","Iterable.elementAt","Iterable.toString","Null.hashCode","Null.toString","Object.==","Object.hashCode","Object.toString","Object.noSuchMethod","StringBuffer.length","StringBuffer.toString","StringBuffer._writeAll","_Uri.host","_Uri.port","_Uri.toString","_Uri._initializeText","_Uri.==","_Uri.hashCode","_Uri._uriEncode","JSSyntaxRegExp.hasMatch","StringBuffer.writeCharCode","_Uri._defaultPort","_Uri._fail","_Uri._makePort","_Uri._makeHost","_Uri._makeScheme","_Uri._canonicalizeScheme","_Uri._makeUserInfo","_Uri._makePath","_Uri._makeQuery","_Uri._makeFragment","_Uri._mayContainDotSegments","_Uri._removeDotSegments","JSArray.isNotEmpty","_Uri._normalizeRelativePath","_Uri._escapeScheme","_Uri._isAlphabeticCharacter","_Uri._makeQuery.writeParameter","_Uri._makeQuery.<anonymous function>","document","Element.html","ListMixin.where","Node.nodes","Element._safeTagName","HttpRequest.getString","HttpRequest.request","Completer","_convertNativeToDart_EventTarget","_wrapZone","AnchorElement.toString","AreaElement.toString","DomException.toString","Element.attributes","Element.toString","Element.createFragment","NodeValidatorBuilder.common","NodeValidatorBuilder.allowHtml5","NodeValidatorBuilder.allowTemplating","Element._canBeUsedToCreateContextualFragment","Element.createFragment[function-entry$1$treeSanitizer]","Element.innerHtml","Element.setInnerHtml","Element.setInnerHtml[function-entry$1]","Element.onSubmit","EventStreamProvider.forElement","Element.html.<anonymous function>","EventTarget._addEventListener","HttpRequest.open","HttpRequest.open[function-entry$2$async]","HttpRequest.getString.<anonymous function>","HttpRequest.request.<anonymous function>","Location.toString","_ChildNodeListLazy.single","_ChildNodeListLazy.addAll","_ChildNodeListLazy.iterator","ImmutableListMixin.iterator","_ChildNodeListLazy.length","_ChildNodeListLazy.[]","Node.remove","Node.toString","NodeList.length","NodeList.[]","NodeList.elementAt","TableElement.createFragment","TableRowElement.createFragment","TableSectionElement.createFragment","TemplateElement.setInnerHtml","TemplateElement.setInnerHtml[function-entry$1]","_NamedNodeMap.length","_NamedNodeMap.[]","_NamedNodeMap.elementAt","_AttributeMap.forEach","_AttributeMap.keys","_ElementAttributeMap.[]","_ElementAttributeMap.length","_EventStreamSubscription._tryResume","_EventStreamSubscription","_EventStreamSubscription.<anonymous function>","_Html5NodeValidator","_Html5NodeValidator.allowsElement","_Html5NodeValidator.allowsAttribute","_SameOriginUriPolicy._hiddenAnchor","UriPolicy","_Html5NodeValidator._standardAttributeValidator","_Html5NodeValidator._uriAttributeValidator","NodeValidatorBuilder.allowsElement","NodeValidatorBuilder.allowsAttribute","NodeValidatorBuilder.allowsElement.<anonymous function>","NodeValidatorBuilder.allowsAttribute.<anonymous function>","_SimpleNodeValidator","_SimpleNodeValidator.allowsElement","_SimpleNodeValidator.allowsAttribute","_SimpleNodeValidator.<anonymous function>","_TemplatingNodeValidator.allowsAttribute","_TemplatingNodeValidator","_TemplatingNodeValidator.<anonymous function>","_SvgNodeValidator.allowsElement","_SvgNodeValidator.allowsAttribute","FixedSizeListIterator.moveNext","FixedSizeListIterator.current","_DOMWindowCrossFrame._createSafe","_ValidatingTreeSanitizer.sanitizeTree","_ValidatingTreeSanitizer._removeNode","_ValidatingTreeSanitizer._sanitizeUntrustedElement","_ValidatingTreeSanitizer._sanitizeElement","JSArray.toList","_ValidatingTreeSanitizer.sanitizeTree.walk","_callDartFunction","Function._apply1","_defineProperty","_getOwnProperty","_convertToJS","_getJsProxy","_convertToDart","DateTime._withValue","_wrapToDart","_getDartProxy","JsObject.[]","JsObject.hashCode","JsObject.==","JsObject.toString","JsObject.callMethod","JsObject._convertDataTree","JsObject._convertDataTree._convert","JsArray._checkIndex","JsArray.[]","JsArray.length","_convertToJS.<anonymous function>","_wrapToDart.<anonymous function>","SvgElement.innerHtml","SvgElement.createFragment","NodeValidatorBuilder.allowSvg","NodeTreeSanitizer","SvgElement.onSubmit","main","_error","JSArray.where","_focus","_focus[function-entry$1]","main.<anonymous function>","_error.<anonymous function>","DART_CLOSURE_PROPERTY_NAME","JS_INTEROP_INTERCEPTOR_TAG","TypeErrorDecoder.noSuchMethodPattern","TypeErrorDecoder.notClosurePattern","TypeErrorDecoder.nullCallPattern","TypeErrorDecoder.nullLiteralCallPattern","TypeErrorDecoder.undefinedCallPattern","TypeErrorDecoder.undefinedLiteralCallPattern","TypeErrorDecoder.nullPropertyPattern","TypeErrorDecoder.nullLiteralPropertyPattern","TypeErrorDecoder.undefinedPropertyPattern","TypeErrorDecoder.undefinedLiteralPropertyPattern","_AsyncRun._scheduleImmediateClosure","_toStringVisiting","_Uri._needsNoEncoding","_Html5NodeValidator._allowedElements","_Html5NodeValidator._attributeValidators","context","_DART_OBJECT_PROPERTY_NAME","_dartProxyCtor","_graphReference","_details","InputElement","main_closure","","Future","String","_ElementEventStreamImpl","Event","_current","_wrapJsFunctionForAsync_closure","_skipLeadingWhitespace","_skipTrailingWhitespace","_isWhitespace","NullThrownError","safeToString","_objectToString","Closure","objectTypeName","_objectClassName","StringBuffer","Object","markFixed","markFixedList","value","int","Null","UnknownJavaScriptObject","RangeError","CyclicInitializationError","iterableToFullString","_writeAll","FixedSizeListIterator","ArrayIterator","ListIterator","_StreamIterator","ExceptionAndStackTrace","_StackTrace","unwrapException_saveStackTrace","UnknownJsTypeError","StackOverflowError","Error","extractPattern","TypeErrorDecoder","provokePropertyErrorOn","provokeCallErrorOn","_awaitOnObject_closure","StackTrace","Function","_FutureListener","_Future__addListener_closure","_propagateToListeners","_Future__propagateToListeners_handleWhenCompleteCallback","_Future__propagateToListeners_handleValueCallback","_Future__propagateToListeners_handleError","_chainCoreFuture","AsyncError","_Future__propagateToListeners_handleWhenCompleteCallback_closure","_Future__prependListeners_closure","_rootHandleUncaughtError_closure","_nextCallback","_lastPriorityCallback","_lastCallback","_AsyncCallbackEntry","_isInCallbackLoop","_initializeScheduleImmediate","_AsyncRun__initializeScheduleImmediate_internalCallback","_AsyncRun__initializeScheduleImmediate_closure","_TimerImpl_internalCallback","_AsyncRun__scheduleImmediateWithSetImmediate_internalCallback","_Exception","_AsyncRun__scheduleImmediateJsOverride_internalCallback","_RootZone_bindCallback_closure","_RootZone_bindCallbackGuarded_closure","initNativeDispatchFlag","getTagFunction","dispatchRecordsForInstanceTags","interceptorsForUncacheableTags","alternateTagFunction","JavaScriptIndexingBehavior","prototypeForTagFunction","initHooks_closure","_AsyncAwaitCompleter","_SyncCompleter","_chainForeignFuture","_Future__chainForeignFuture_closure","_AsyncAwaitCompleter_completeError_closure","_AsyncAwaitCompleter_complete_closure","fromTearOff","receiverOf","selfOf","List","StaticClosure","BoundClosure","functionCounter","forwardCallTo","forwardInterceptedCallTo","cspForwardCall","selfFieldNameCache","computeFieldNamed","receiverFieldNameCache","cspForwardInterceptedCall","_literal","_makeScheme","_makeUserInfo","_makeHost","_makeQuery","_makeFragment","_makePort","_makePath","_normalizeRelativePath","_removeDotSegments","_Uri","getString","Map","ProgressEvent","HttpRequest","_convertDataTree","JsObject","_JsonMap","mapToString","MapBase_mapToString_closure","LinkedHashMapKeyIterable","_JsonMapKeyIterable","iterableToShortString","range","Uri","_defaultPort","MappedListIterable","from","TypedData","DateTime","getYear","_fourDigits","getMonth","_twoDigits","getDay","getHours","getMinutes","getSeconds","getMilliseconds","_threeDigits","lazyAsJsDate","Blob","KeyRange","ImageData","Node","Window","WorkerGlobalScope","_convertToJS_closure","applyFunctionWithPositionalArguments","ListMixin","_genericApplyFunctionWithPositionalArguments","functionNoSuchMethod","Primitives_functionNoSuchMethod_closure","JSInvocationMirror","Symbol","NoSuchMethodError_toString_closure","JsLinkedHashMap","ConstantMapView","NodeValidator","_SvgNodeValidator","_ValidatingTreeSanitizer","NodeValidatorBuilder","_ChildNodeListLazy","_TemplatingNodeValidator_closure","_SimpleNodeValidator_closure","WhereIterable","Iterable","WhereIterator","_LinkedHashSet","_newHashTable","_LinkedHashSetCell","_SameOriginUriPolicy","_empty","html","Element_Element$html_closure","Element","noElement","tooMany","_defaultValidator","_defaultSanitizer","_parseDocument","_parseRange","BodyElement","_ValidatingTreeSanitizer_sanitizeTree_walk","_safeTagName","_ElementAttributeMap","TemplateElement","NodeValidatorBuilder_allowsAttribute_closure","ScriptElement","SvgElement","NodeValidatorBuilder_allowsElement_closure","_wrapToDart_closure","JsArray","JsFunction","JsObject__convertDataTree__convert","_IdentityHashMap","EfficientLengthMappedIterable","MappedIterator","ListIterable","EfficientLengthIterable","_ConstantMapKeyIterable","_setTableEntry","_getTableEntry","_HashMapKeyIterable","_HashMapKeyIterator","_createSafe","EventTarget","_DOMWindowCrossFrame","request","HttpRequest_getString_closure","_AsyncCompleter","HttpRequest_request_closure","_Future__asyncComplete_closure","_Future__chainFuture_closure","_Future__asyncCompleteError_closure","_mayContainDotSegments","_escapeScheme","_isAlphabeticCharacter","_Uri__makeQuery_closure","_Uri__makeQuery_writeParameter","_uriEncode","stringFromCharCode","checkValidRange","_Utf8Encoder","JSSyntaxRegExp","makeNative","_fail","_canonicalizeScheme","LinkedHashMapCell","_error_closure","bool","_EventStreamSubscription_closure","JS_CONST","Interceptor","JSBool","JSNull","JavaScriptObject","PlainJavaScriptObject","JavaScriptFunction","JSArray","JSUnmodifiableArray","num","JSNumber","JSInt","JSDouble","JSString","FixedLengthListMixin","ConstantMap","ConstantStringMap","noSuchMethodPattern","notClosurePattern","nullCallPattern","nullLiteralCallPattern","undefinedCallPattern","undefinedLiteralCallPattern","nullPropertyPattern","nullLiteralPropertyPattern","undefinedPropertyPattern","undefinedLiteralPropertyPattern","TearOffClosure","NativeTypedData","NativeTypedArray","double","NativeTypedArrayOfDouble","NativeTypedArrayOfInt","NativeInt16List","NativeInt32List","NativeInt8List","NativeUint16List","NativeUint32List","NativeUint8ClampedList","NativeUint8List","_Completer","Stream","StreamSubscription","StreamTransformerBase","_Zone","_RootZone","_HashMap","_HashSetBase","ListBase","MapBase","MapMixin","_UnmodifiableMapMixin","MapView","UnmodifiableMapView","SetMixin","SetBase","Codec","Converter","Encoding","JsonCodec","JsonDecoder","Utf8Codec","Utf8Encoder","OutOfMemoryError","Iterator","_needsNoEncoding","HtmlElement","AnchorElement","AreaElement","CharacterData","DomException","FormElement","HttpRequestEventTarget","Location","NodeList","SelectElement","TableElement","TableRowElement","TableSectionElement","_NamedNodeMap","_AttributeMap","_EventStream","_allowedElements","_attributeValidators","ImmutableListMixin","_NativeTypedArrayOfDouble&NativeTypedArray&ListMixin","_NativeTypedArrayOfDouble&NativeTypedArray&ListMixin&FixedLengthListMixin","_NativeTypedArrayOfInt&NativeTypedArray&ListMixin","_NativeTypedArrayOfInt&NativeTypedArray&ListMixin&FixedLengthListMixin","_ListBase&Object&ListMixin","_UnmodifiableMapView&MapView&_UnmodifiableMapMixin","_NodeList&Interceptor&ListMixin","_NodeList&Interceptor&ListMixin&ImmutableListMixin","__NamedNodeMap&Interceptor&ListMixin","__NamedNodeMap&Interceptor&ListMixin&ImmutableListMixin","_JsArray&JsObject&ListMixin","_scheduleImmediateJsOverride","_scheduleImmediateWithSetImmediate","_scheduleImmediateWithTimer","_standardAttributeValidator","_uriAttributeValidator","_scheduleImmediateClosure","$intercepted$get$onSubmit$x","getInterceptor$x","graph_viz_main___focus$closure","$intercepted$trim0$s","getInterceptor$s","$intercepted$toString0$IJavaScriptFunctionJavaScriptObjectabnsux","getInterceptor$","$intercepted$get$length$asx","getInterceptor$asx","$intercepted$get$iterator$ax","getInterceptor$ax","$intercepted$[]$asx","async___startMicrotaskLoop$closure","async__AsyncRun__scheduleImmediateJsOverride$closure","async__AsyncRun__scheduleImmediateWithSetImmediate$closure","async__AsyncRun__scheduleImmediateWithTimer$closure","$intercepted$startsWith1$s","$intercepted$get$_get_target$x","$intercepted$get$status$x","$intercepted$get$statusText$x","$intercepted$get$responseText$x","$intercepted$set$innerHtml$x","$intercepted$get$hashCode$IJavaScriptObjectabnsu","$intercepted$$eq$Iu","js___convertToJS$closure","$intercepted$elementAt1$ax","js___convertToDart$closure","$intercepted$map11$ax","$intercepted$noSuchMethod1$Iu","html__Html5NodeValidator__standardAttributeValidator$closure","html__Html5NodeValidator__uriAttributeValidator$closure","$intercepted$remove0$x","$intercepted$get$previousNode$x","$intercepted$get$attributes$x","$intercepted$toLowerCase0$s","$intercepted$_codeUnitAt1$s","$intercepted$codeUnitAt1$s","$intercepted$_addEventListener3$x","functionThatReturnsNull","makeConstantList","where","[]","toString","noSuchMethod","createFragment","allowsAttribute","status","dart.dom.html#_get_target","last","runBinary","open","call","indexOf","toLowerCase","registerBinaryCallback","contains","dart.async#_asyncCompleteError","allowsUri","dart.async#_thenNoZoneRegistration","responseText","_js_helper#_modified","dart.collection#_get","moveNext","iterator","attributes","_js_helper#_deleteTableEntry","run","dart.async#_removeListeners","complete","handleError","internalFindBucketIndex","dart.async#_reverseListeners","tagName","dart.dom.html#_sanitizeElement","map","dart.collection#_contains","namedArguments","dart.js#_checkIndex","dart.collection#_getBucket","_js_helper#_getTableBucket","host","dart.convert#_writeSurrogate","dart.convert#_fillBuffer","runUnary","_interceptors#_codeUnitAt","addAll","dart.dom.html#_removeNode","dart.collection#_addHashTableEntry","dart.collection#_containsKey","completeError","dart.async#_addListener","_js_helper#_newLinkedCell","_js_helper#_getTableCell","callMethod","dart.convert#_process","startsWith","decoder","bindCallback","matchesErrorTest","positionalArguments","dart.core#_errorName","dart.async#_asyncComplete","forEach","bindUnaryCallbackGuarded","dart.convert#_computeKeys","internalGet","dart.async#_complete","dart.collection#_computeHashCode","dart.collection#_newLinkedCell","then","_js_helper#_newHashTable","allowsElement","_interceptors#_shrBothPositive","encoder","dart.async#_state","dart.collection#_computeKeys","current","sanitizeTree","dart.collection#_findBucketIndex","runUnaryGuarded","single","hashCode","dart.dom.html#_sanitizeUntrustedElement","dart.dom.html#_addEventListener","decode","any","_js_helper#_fetch","matchTypeError","runGuarded","dart.dom.html#_tryResume","join","containsKey","dart.collection#_add","substring","bindCallbackGuarded","memberName","convert","trim","setInnerHtml","remove","length","dart.async#_chainFuture","_js_helper#_addHashTableEntry","dart.async#_resultOrListeners","codeUnitAt","defaultValue","port","add","toInt","keys","dart.core#_errorExplanation","dart.async#_completeError","dart.async#_prependListeners","dart.core#_contents=","innerHtml=","_interceptors#_shrOtherPositive","dart.dom.html#_element","elementAt","statusText","_js_helper#_setTableEntry","previousNode","onSubmit","$indexSet","$le","$index","$eq","$shr","$ge","$and","$lt","$mul","$shl","$add","lookupInterceptorByConstructor","cacheInterceptorOnConstructor","objectToHumanReadableString","checkGrowable","listToString","_codeUnitAt","_","joinArguments","selfFieldName","receiverFieldName","extractFunctionTypeObjectFrom","isFunctionSubtype","_getRuntimeTypeAsString","write","_writeString","checkArguments","computeTypeName","formatType","isJsArray","setDispatchProperty","markUnmodifiableList","es6","unvalidated","internal","_getBucket","internalComputeHashCode","internalSet","_createTimer","_completer","sync","_AsyncAwaitCompleter._completer","future","_setValue","_scheduleImmediate","inSameErrorZone","_zone","_mayAddListener","_chainSource","_isComplete","_cloneResult","_setError","_setErrorObject","_setPendingComplete","_setChained","_hasError","handleUncaughtError","handlesValue","handlesComplete","_removeListeners","_clearPendingComplete","_completeWithValue","handleWhenComplete","handleValue","listen","_rethrow","writeAll","_set","_computeHashCode","_HashMap._set","identityHashCode","_modified","_isUpgraded","withBufferSize","sublist","_combineSurrogatePair","year","month","day","hour","minute","second","millisecond","checkNotNegative","_writeOne","_initializeText","hasAuthority","_writeAuthority","hasQuery","hasFragment","hasMatch","checkString","encode","writeCharCode","fromCharCode","_isSchemeCharacter","isNotEmpty","isEmpty","encodeQueryComponent","nodes","common","_validators","allowHtml5","allowTemplating","_canBeUsedToCreateContextualFragment","_cannotBeUsedToCreateContextualFragment","forElement","addEventListener","_hiddenAnchor","allowedElements","allowedAttributes","allowedUriAttributes","warn","toList","_toListGrowable","sanitizeNode","_removeNode","apply","_apply1","Function.apply","applyFunction","fromMillisecondsSinceEpoch","_withValue","_fromJs","allowSvg","target","jsify","provokeCallErrorOnNull","provokeCallErrorOnUndefined","provokePropertyErrorOnNull","provokePropertyErrorOnUndefined"],
-  "mappings": "A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuFAA,kBA6BEA,uBAEFA,C;GAWAC,YACMA;AAEAA;AAAJA,WACEA,eACEA;+BAKJA,YAEeA;AAAbA,UAAoBA,UAuDxBA;AAtDIA,UAAmBA,QAsDvBA;AApDqCA;AAAjCA,SACEA,UAmDNA;AA/CIA,WAKEA,UAAUA,+BAA4CA,cAOTA;AA2CfA;AA1ClCA,WAAyBA,QAkC3BA;AA9BgBA;AACdA,WAAyBA,QA6B3BA;AAvBEA,wBAIEA,UAmBJA;AAhB8BA;AAA5BA,WAEEA,UAcJA;AAXEA,wBAIEA,UAOJA;AALEA,iDAiB4BA;AAf1BA,UAGJA,CADEA,UACFA,C;;EAsIgBC,cAAaA,YAAsBA,C;GAEzCC,YAAYA,OAAWA,MAAoBA,C;QAE5CC,YAAcA,sBCuZLA,WDvZiDA,C;SAgBzDC,cACNA,UAAUA,OAAmCA,QAC9BA,QAAgCA,cACjDA,C;;;EAYOC,YAAcA,gBAAgCA,C;GAU7CC,YAAYA,sBAAwCA,C;;;EAe9CC,cAAaA,cAAsBA,C;EAG1CC,YAAcA,YAAMA,C;GAEnBC,YAAYA,QAACA,C;GAObC,cAAuCA,OAAMA,YAAwBA,C;;;GAsCrEC,YAAYA,QAACA,C;QAOdC,YAAcA,gBAA+BA,C;;;;EA8B7CC,YACiCA;AACtCA,WAAyBA,OAAaA,UAExCA;AADEA,iCAAkCA,YACpCA,C;;;;EEvWKC,cANHA,oBACEA,KAAUA;SAQdA,C;EA2GKC,cACCA;AArHJA,oBACEA,KAAUA;AAsHZA,kCAKFA,C;EAiBYC,gBACVA,OCwJFA,cDxJaA,YACbA,C;EAEOC,cACDA;AAAqBA;AAAVA;;AACfA,wBACmBA;AAAjBA,uBAAIA;AAAJA,OAEFA,gBACFA,C;EAiGEC,cACWA;AAAXA,WACFA,C;IA+BMC,YACJA;OAAgBA,aAElBA;AADEA,UAA2BA,OAC7BA,C;GA2FKC,cACCA;AAAWA;AACfA,iBAIMA,cAAeA,QAIvBA;AAHIA,gBAAwBA,UAAUA,QAEpCA,QACFA,C;EA0EKC,cACHA;uBACUA,gBAAcA,QAG1BA;AADEA,QACFA,C;EAMOC,YAAcA,OE3iBJA,eF2iB+BA,C;GAchCC,YAAYA,OA0G5BA,sBA1GsDA,C;GAE9CC,YAAYA,OAAWA,MAAoBA,C;GAE3CC,YAAUA,eAAiCA,C;EAgBxCC,cAETA,oBAAkCA,UAAMA;AACxCA,WACFA,C;;;;;GA1hBQC,cACJA,YAA0CA,WAA8BA,C;GAKhEC;AAKVA,QACFA,C;;;GAqmBMC,WAAWA,aAAQA,C;EAEpBC,WACCA;AAASA;AAAUA;AAKvBA,cACEA,UAAMA;AAGJA;AAAJA,SACEA;AACAA,QAKJA,CAHEA;AACAA;AACAA,QACFA,C;;GGtpBIC,YACFA;iCAEEA,UAOJA;;AAJIA,UAIJA,CADEA,UAAUA,sBACZA,C;EA6JOC,YACLA,gBACEA,YAIJA;KAFIA,UAEJA,C;GAEQC,YAAYA,mBAAiCA,C;GAoFxCC,cAEXA,OAA+BA,UAAMA;AACrCA,sBACFA,C;GAiBIC,cACFA;OACMA;;WADNA,QAOFA,C;GAOIC,cACFA,mBASFA,C;GA2BcC,cACZA,uBAAmBA,UAAMA;AACzBA,WACFA,C;;;;;ECnYIC,cAEFA,OAAeA,UAAMA;AAKrBA,eAAqBA,KAAMA;AAJ3BA,sBACFA,C;EAEIC,cACFA,eAAqBA,UAAMA;AAC3BA,sBACFA,C;EAyBgBC,cACdA,uBAAsBA,UAAUA;AAChCA,UACFA,C;GAsFKC,gBAAUA;AAEbA,cACEA,UAAUA;AAKKA;AACfA,cAAuBA,QAI3BA;AAHIA,2BAGJA,C;EAbKC,oC;EAeEC,gBAELA,WAAiCA;AAEjCA,OAAoBA,UAAUA;AAC9BA,OAA2BA,UAAUA;AACrCA,cAAuBA,UAAUA;AACjCA,uBACFA,C;GAROC,sC;GAUAC,YACLA,sBAEFA,C;GAqGOC,YACKA;AAKNA;AAAOA;AAAXA,SAAwBA,QAiB1BA;AAhBkBA,sBAGDA;AACbA,SAAiCA,QAYrCA,MAFMA;AAJ6BA;AAAlBA,oBAEFA;AAEbA,gBAAkDA,QAEpDA;AADEA,uBACFA,C;GA0DgBC,cACdA;QAAgBA,QAelBA;AAdEA,uBAAoCA,QActCA;AAbEA,aAEEA;AAIFA,kBACEA,aAA6BA;AAEzBA;AAAJA,SAAgBA;AAChBA,KAEFA,QACFA,C;GAkBIC,gBAAOA;AAGTA,cACEA,UAAUA;;AAGVA,QAWJA,C;GAlBIC,oC;EA4DGC,YAAcA,QAAIA,C;GAQjBC,YAGFA;AACJA;AAEoBA;QAGFA;AAEGA;AAArBA,kCACFA,C;GAIQC,YAAUA,eAA4BA,C;EAE9BC,cAEdA,mBAAkCA,UAAMA;AACxCA,WACFA,C;;;GA7RYC,YAGVA,SACEA,2EASIA,QA4BRA;QA1BQA,QA0BRA,CAvBEA,gMAmBIA,QAINA;QAFMA,QAENA,E;GAIWC,cACCA;AAEVA,qBACiBA;AAGVA,4BACHA,MAEFA,IAEFA,QACFA,C;GAIWC,cACCA;KAEVA,SACmCA;AAAlBA;AAGVA,4BACHA,MAIJA,QACFA,C;GHmnBkBC,WAAeA,OIvWjCA,sBJuW6DA,C;GAE3CC,WAAaA,OIzW/BA,6BJyWkEA,C;;;GA31BlDC,YAAYA,OAqS5BA,cAEyBA,gBAvS4BA,C;GA4IzCC,cAA+BA,OAAMA,YAAWA,C;EAEhDC,gBAA0BA,OA2OtCA,iBA3O0CA,qBAAiCA,C;;GA4JrEC,WAAWA,aAAQA,C;EAEpBC,WACCA;AAASA;AAAUA;;AACvBA,cACEA,UAAUA;AAERA;AAAJA,SACEA;AACAA,QAKJA,CAHaA;AAEXA,QACFA,C;;GAkBgBC,YAAYA,OAwB5BA,SAxB+DA,mBAAaA,C;GAGpEC,YAAUA,OAAUA,YAAMA,C;;;GAZ1BC,kBACNA,WACEA,OAsBJA,mBAnBAA;AADEA,OAGFA,mBAFAA,C;;;;EA8BKC,WACCA;UACSA,iBAAaA;AACxBA,QAIJA,CAFEA;AACAA,QACFA,C;GAEMC,WAAWA,aAAQA,C;;GAcjBC,YAAUA,OAAQA,YAAMA,C;EAC9BC,cAAwBA,iBAAGA,eAAyBA,C;;;;;GAWtCC,YAAYA,OAU5BA,SAV2DA,mBAAaA,C;EAG5DC,gBAA0BA,OAlEtCA,iBAkE0CA,eAA+BA,C;;EASpEC,WACHA;sBAAOA,OACDA,QAAaA,QACfA,QAINA;AADEA,QACFA,C;GAEMC,WAAWA,OAAUA,WAAOA,C;;;GK5a1BC,YACFA;AACJA,WAAkBA,QAKpBA;AAH8CA;;AAE5CA,QACFA,C;EAGAC,YAAcA,iBAAUA,gBAAQA,C;ECoFlBC,cAAEA,mBAAkDA;AAAvCA,qCAAuCA,C;;GCrG/DC,YACCA;AAAFA,yEAMsBA,C;GTmGnBC,YACEA;AACPA,uBAAyBA,QAG3BA;;AAF+BA,QAE/BA,C;IAmGAC,YACEA,oBAEFA,C;GAOKC,cACHA;YAEMA;AAAJA,WAAoBA,QAGxBA,CADEA,QAAcA,UAChBA,C;EAEOC,YACLA;uBAAqBA,QAgBvBA;AAfEA,wBACEA,SAEEA,UAYNA,MAVSA,UACLA,YASJA;KARSA,UACLA,aAOJA;KANSA,WACLA,YAKJA;AAHYA;AACVA,uBAAoBA,UAAMA;AAC1BA,QACFA,C;EA8RaC,YACLA;AACJA;kBAIAA,QACFA,C;GAuHcC,YAGZA,OAFmBA,QU7UdA,KV8U4BA,eAEnCA,C;GAEcC,YACRA;AAAcA;AASuBA;AAAzCA,yBAEMA;kCAKFA;;AAAJA,yBAkBWA;;AACTA,iBAK2CA;AAAzCA,qCAGuBA;AACjBA;6CAMRA,QAaJA,CAJMA;AAGJA,OAAOA,iBAH0BA,gBACxBA,cAGXA,C;GA6GcC,YACZA;SACEA,YACEA,6BAYNA;AATIA,eACaA;AAGXA,kCADqBA,+BAM3BA,EADEA,UAAUA,2BACZA,C;EAyFOC,YACLA;AAIAA,aACFA,C;GAmBOC,YAGqCA;AAF1CA,QAGFA,C;GAKOC,YAGqCA;AAF1CA,QAGFA,C;GAKOC,YAGsCA;AAF3CA,QAGFA,C;GAKOC,YAGuCA;AAF5CA,QAGFA,C;GAKOC,YAGyCA;AAF9CA,QAGFA,C;GAKOC,YAGyCA;AAF9CA,QAGFA,C;GAKOC,YAI8CA;AAHnDA,QAIFA,C;GAkCOC,gBAEDA;AAFCA;AAEDA;AAMFA;AAqBEA;AAtBFA;AACAA;AAGKA;AACPA,oBACEA,MAAuBA;AAWzBA,OAAOA,OA3vBTC,qCAkwBAD,C;GAwNOE,cAEAA;AAMeA;AAMNA;AAAdA,UAEEA,UACEA,aAiCNA,MA/BSA,UAELA,UACEA,iBA4BNA,MA1BSA,UAELA,UACEA,sBAuBNA,MApBSA,UAELA,UACEA,2BAiBNA,MAdSA,UAELA,UACEA,gCAWNA,MARSA,SAELA,UACEA,qCAKNA;AADEA,OAAOA,SACTA,C;GAEOC,cAEDA;AAA0BA;AAI1BA;AAAJA,YACoBA;AAIlBA,WACEA,OAAOA,cAoBbA;AAlB8BA;AACOA;AAE7BA;AACJA,iBAGEA,OAAOA,cAWbA;AAToBA;AAChBA,gBACEA,sBAA0BA,YAM9BA,mBACFA,C;GA6FFC,YACEA,UAAMA,QACRA,C;EASAC,cACEA,WAA+BA;AAC/BA,UAAMA,SACRA,C;EAOMC,cACJA;0CAAmBA,OMv0CnBA,0BNg1CFA;AARyBA;AAGvBA,WAAiBA,qCAAMA;AAANA,YAAjBA;KACEA,OAAWA,wBAIfA;AADEA,OAAWA,oBACbA,C;GAOMC,gBAIJA,OACEA,OMrwCFA,0CNixCFA;AAVEA,WAIEA,YACEA,OM5wCJA,wCNixCFA;AADEA,OMv2CAA,wBNw2CFA,C;GAOcC,YACZA,OMh3CAA,uBNi3CFA,C;EAmCAC,YACEA;WMj8CAA;ANo8CkCA;;AAElCA;;AAcAA,QACFA,C;IAGAC,WAGEA,OAAOA,wBACTA,C;GAQAC,kBACwBA,MACxBA,C;GAmCAC,YACEA,UAAUA,OACZA,C;EAuYAC,YAIEA;AAAcA;AAYdA,WAAgBA,MAkHlBA;AAjHEA,qBACEA,OAAOA,SAgHXA;AA9GEA,uBAA6CA,QA8G/CA;AA5GEA,wBACEA,OAAOA,qBA2GXA;KA1GSA,qBACLA,QAyGJA;AAhFwCA;AAhBtCA,6CAOoBA;;AACMA,4BAKtBA,mBAEIA,OAAOA,KACCA,KAAsBA,8BAgFxCA;mBA7EUA,OAAOA,KACCA,KAAYA,8BA4E9BA,EAvEEA,2BAI8BA;AACMA;AACFA;AACOA;AACNA;AACOA;AACJA;AACOA;AACNA;AACOA;AAC/BA;AAAbA,WACEA,OAAOA,KAAmBA,UAwDhCA;KAvDwBA;AAAbA;AAMLA,OAAOA,KAAmBA,UAiDhCA,MAhDwBA;AAAbA,YACMA;AADNA,YAEMA;AAFNA,YAGMA;AAHNA,YAIMA;AAJNA,YAKMA;AALNA,YAMMA;AANNA,YAOMA;AAPNA;KAQLA,OAAOA,KAAmBA,UAwChCA,EAlCIA,OAAOA,KAtHTA,mCAwJFA,CA9BEA,iFAEIA,OMxjDEA,UNolDRA;yDApBQA;AAGJA,OAAOA,KM1+DTA,4EN2/DFA,CAbEA,gEAIEA,iDACEA,OM5kDEA,UNolDRA;AADEA,QACFA,C;EAuBWC,YACTA;qBACEA,UAOJA;AALEA,WAAuBA,OAUvBA,WALFA;AAHMA;AAAJA,WAAmBA,QAGrBA;AADEA,sBAMAA,WALFA,C;GAmBIC,YACFA,+BACEA,OAAcA,OAIlBA;KAFIA,OAAkBA,MAEtBA,C;GAMAC,cAGMA;;AAEJA,iBACyCA;AACEA;AACzCA,iBAEFA,QACFA,C;IAEAC,sBAEEA,iBAEIA,OAAOA,MAWbA;OATMA,OAAOA,OASbA;OAPMA,OAAOA,SAObA;OALMA,OAAOA,WAKbA;OAHMA,OAAOA,aAGbA,CADEA,UW1sEAC,gEX2sEFD,C;GAMAE,cACEA;WAAqBA,MAkBvBA;AAhByBA;AAAvBA,OAAkCA,QAgBpCA;kEAF0CA;;AACxCA,QACFA,C;GAmDSC,wBAAWA;AAoBgCA;AAwHlBA;AAhHXA;AAESA,iBAuEWA;kBA2VrCA,gDA0BJA;;;KAzYcA;AACeA;;;;;AAU3BA,OACeA;;AA8COA,IAtCtBA;KAeOA,wBACLA;KAcMA;4FAGNA;;;AAOFA,4BACaA;AAGPA;AAAJA,YAC2BA;OAG3BA;;;;AAaFA,QACFA,C;GAEOC,kBAEDA;AAGJA,sBAEIA,iEAsENA;OA5DMA,mEA4DNA;OAlDMA,uEAkDNA;OAxCMA,2EAwCNA;OA9BMA,+EA8BNA;OApBMA,mFAoBNA;QAVMA,+EAUNA,E;GAIOC,gBACLA;KAAmBA,OAAOA,SAmC5BA;AAhCkDA;AAOpBA;AAFYA;AAApBA;AAEPA;AAAbA,KACEA,OAAOA,cAwBXA;AArBEA,UAE2BA;AAAeA;;AAK9BA;;AA+PRA;AAAJA,YACuBA;OApQrBA,8CAKuBA,gBAa3BA;AAPkBA;AAAeA;;AAA/BA;;AAwPIA;AAAJA,YACuBA;OAxPvBA,iCAIkDA,qBAEpDA,C;GAEOC,kBAEDA;AAkBIA;AACAA;AAfRA,sBAIIA,UAAUA;OAEVA,4EA+ENA;OApEMA,+EAoENA;OAzDMA,mFAyDNA;OA9CMA,uFA8CNA;OAnCMA,2FAmCNA;OAxBMA,+FAwBNA;QAbMA;;kCAaNA,E;GAEOC,cACEA;AAiJHA;AAAJA,YACuBA;OAQnBA;AAAJA,YAC2BA;OAtJqBA;AAOpBA;AAFYA;AAApBA;AAEPA;AAAbA,KACEA,OAAOA,cAuBXA;AArBEA,UAKoBA,8CAAWA,gBAAeA;AACrCA;AAAeA;;AALtBA,8BAoBJA,wDA3IEF,AAuIsBE;AACJA,mDAAWA,gBAAeA;AACrCA;AAAeA;;AALtBA,8BAOFA,C;GAmBFC,wBAEEA,OAAeA,uBAQjBA,C;GAyRKC,cAGHA,UAAUA,OAA+BA,KAAcA,iBACzDA,C;GA2CAC,cACEA;WAG2BA;KAH3BA;KAIEA,QAGJA;AADEA,SACFA,C;GA8GAC,YACMA;AACJA,cAEyCA;AAAvCA,sBACEA,oBAMNA;KAJMA,aAINA,CADEA,MACFA,C;GAEAC,cACEA;WAAmBA,QAcrBA;AAbEA,wBAQEA,QAKJA;AA/BSA,OADWA;AA8BlBA,WAAgCA,QAElCA;AADEA,OU95EOA,mBV+5ETA,C;GAkFOC,YACLA;AAAUA;AAAVA,YAlHOA;AAoHLA,WACEA,OAAOA,OAKbA;AAHIA,eAGJA,CADEA,OAAkBA,OACpBA,C;GAmDKC,YACHA,UM/wFAA,YNgxFFA,C;GAuDOC,YAELA,4BACFA,C;EU/yGOC;AAILA,QACFA,C;GAMAC,YACEA,WAAoBA,MAGtBA;AADEA,YACFA,C;GAGAC,gBAGEA,OAAOA,YAD2CA,QAClBA,QAClCA,C;GASAC,kBAVSA,kBAD2CA,QAClBA;AAchCA,wBACFA,C;GASAC,gBAxBSA,kBAD2CA,QAClBA;AA0BhCA,wBACFA,C;EAQAC,cACYA;AACVA,wBACFA,C;GAoBOC,YACLA,OAAOA,WACTA,C;EAEOC,cACLA;WACEA,eAiCJA;AA/BEA,UACEA,YA8BJA;AA5BEA,wDAEEA,OArBiBA,uBACCA,WA8CtBA;AAxBEA,wBAEEA,OAAOA,mBAsBXA;AApBEA,UACEA,eAmBJA;AAjBEA,wBAEEA,6BACEA,kCAAmCA,MAczCA;AAZ4CA;AAAOA;AAArCA,4BAAcA;AAAxBA,OAAUA,SAYdA,CAVEA,eAEEA,OAAOA,SAQXA;AANEA,mBAEEA,kBAAmBA,kCAIvBA;AADEA,4BACFA,C;GAaOC,cACEA;AAIPA,kBAQeA;AANbA,YAC2BA;YAEWA;AAEVA;AAC5BA,2BACEA;AAKFA,mCACEA;AACgDA;AAAOA;AAArCA,sBAAcA;AAAhCA;AAEeA;AACfA,oBAEoBA,wBAGtBA,YAoEQA;OA1DSA;AAQnBA,gBAEuBA;AAArBA;AAEmBA,qBAUnBA;AAAmBA,KAFrBA,eAIuBA;AAFrBA;AAEAA;AAEmBA,eAGnBA,OAMFA,iBAIkCA;AAFhCA;AAEoBA,kCAApBA;AAEmBA,uBAEGA,QAGtBA,OAGFA;AASAA,wBACFA,C;GAWOC,gBACLA;WAAmBA,QAerBA;AEqMEA;AF/MAA,8CEiPEC;AF7OID;AAAJA;AAGaA,gBAEfA,UAAUA,UACZA,C;GAyDAE,cACEA,WAA0BA,QAiB5BA;AAbMA;AAAJA,WAA0BA,MAa5BA;AAZEA,wDAKEA,QAOJA;AALEA,wBAEEA,sBAGJA;AADEA,QACFA,C;GAcKC,kBACHA;WAAoBA,QAYtBA;AAXkBA;AAIEA;AAGlBA,cAAwBA,QAI1BA;AADEA,OAmDOA,KAAYA,yBAlDrBA,C;GAaOC,kBACLA,WAAoBA,QAItBA;AAHMA,iBAAgDA,QAGtDA;AADEA,UAAUA,+EAAgCA,CARtCA,qBAlIGC,yCA2ITD,C;GA+CKE,kBAEHA;WAAeA,QAsBjBA;AArBEA;AAEEA,gBACOA,0BACHA,QAiBRA;AAdIA,QAcJA;AANEA,gBACOA,uBACHA,QAINA;AADEA,QACFA,C;GAMAC,gBAIEA,iBApbOA,KAibWA,YAlbgCA,QAClBA,SAqblCA,C;EAkJKC,kBAEHA;SAAuBA,QAmGzBA;AAhGEA,gDAAkBA,QAgGpBA;AA9FEA,UAAuCA,QA8FzCA;AA3FEA,iDACEA,uBAGEA,QAuFNA;AArFIA,mBAGEA,OAAOA,kCAkFbA;AAhFIA,QAgFJA,CA1EEA,uBAEEA,QAwEJA;AAtEEA,uBAAuCA,QAsEzCA;AApEEA,uBAAmBA,QAoErBA;AAlEEA,eACEA,OAAOA,aAiEXA;AA9DEA,eAGEA,2BA2DJA;AA8TeA;AArWaA;AAb1BA,oBAM2CA;AAHzCA,mBAGEA,OAAOA,kCA8CbA;KA7CeA,gBAETA,QA2CNA;KAvCMA,8BAEEA,QAqCRA;AAhCuCA;AAAXA;AAItBA,OAAOA,yEA4BbA,EA8TeA;AA/UMA;AAAnBA,UAEiCA;AAA/BA,4BACEA,QAcNA;2BADMA;AALJA,MACEA,QAKJA;;;AAFEA,OAvSOA,KAAYA,gBAySrBA,C;GAQKC,kBAAkBA;AAErBA,kBAA4BA,QA2F9BA;AApFEA,kBACEA,oBAAqCA,QAmFzCA;AAhFuCA;AACAA;AACnCA,uBAA8CA,QA8ElDA,MAxESA,iBACLA,QAuEJA;AAlEOA,yBAAkDA,QAkEzDA;AAtDuBA;AACAA;AAGjBA;AAEAA;AAEAA;AAAiBA;AAIAA;AACAA;AALrBA,OAEEA,QA4CJA;AA1CEA,WAGEA,QAuCJA;AAlCEA,gBACOA,uBAEHA,QA+BNA;AAxBEA,wBACOA,uBAEHA,QAqBNA;AAfEA,oBACOA,uBAEHA,QAYNA;AAHMA;AADAA;AAAJA,WAA8BA,QAIhCA;AAHEA,WAA8BA,QAGhCA;AAFEA,OAAOA,aAETA,C;GAEKC,kBAA2BA;;AAO9BA,4BACaA;oCAETA,QAONA;AAHSA,uBAAsCA,QAG/CA,CADEA,QACFA,C;GG70BKC,qGAQLA,C;GA8EAC,YAAyBA;AAEVA;AAKTA;AAAJA;AAAoBA,UAkEtBA,CAhEMA;AAAJA,WAAyBA,QAgE3BA;AA3DMA;AAAJA,YACQA;AACNA,YAGMA;AAAJA;AAAoBA,UAsD1BA,CApDUA;AAAJA,WAAyBA,QAoD/BA;6BA9CEA,WAQEA,MAsCJA;AA9BoCA;AAD9BA;AAAJA,YACWA;;;AAETA,UA4BJA,CAzBEA;AAEEA,QAuBJA,CApBEA,YACyBA;sBdzIrBC;AcyIFD,UAmBJA,CAhBEA,WACEA,OAAOA,SAeXA;AAZEA,WAEEA,UAAUA;AAKZA,4BACyBA;sBdxJrBC;AcwJFD,UAIJA,MAFIA,OAAOA,SAEXA,C;GAYAE,cAE+CA;yDAAhCA;AAEbA,QACFA,C;GAEAC,YAGEA,OAAOA,uBACTA,C;GAEAC,gBACMA;AAEJA,2BACEA,OAAOA,OAIXA;KAFIA,OAAOA,mBAEXA,C;GAiBKC,WACHA,aAAoCA,MAGtCA;;AADEA,MACFA,C;GAGKC,WAA0BA;;;AAI7BA;AAMiEA;;AAEjEA;;AAGEA,wBACYA;AACEA;AACZA,YAEeA;AACbA;iBAYNA,wBAEyCA;yBAEQA;;;;;YAOnDA,C;GAqCKC,WAECA;AAKgEA;AAY5DA,UAJAA,QAFAA,QADAA,QADAA,QADAA,QAHAA,IAAsBA;AAoB9BA,2DAE2CA;AAAzCA,wBAGyCA;AAAzCA,wBACEA,wBAE2CA;AAAzCA,wBAoBkBA;;;AATPA;AAEbA;AAEAA,gBACNA,C;EAEAC,cAEEA,OAAwBA,OAC1BA,C;;;ECzXSC,YAAcA,OAAQA,UAAiBA,C;;;GAsDtCC,YAAUA,aAA4BA,C;GAOzCC,YACHA,uBAAoBA,QAGtBA;AAFEA,mBAAwBA,QAE1BA;AADEA,+BACFA,C;EAEWC,cACJA,eAAkBA,MAEzBA;AADEA,iBACFA,C;GAGAC,YAAeA,gBAAgCA,C;EAE1CC,cAICA;;AACJA,4BACYA;AACVA,OAAOA,YAEXA,C;GAEgBC,WACdA,OA4BFA,eA5BaA,aACbA,C;;GA6BgBC,YAAYA;ObuhB5B9I,sBavhBoD8I,C;GAE5CC,YAAUA,sBAAsBA,C;;Id+J7BC,WACyBA;AAAPA,QAE7BA,C;IAiBSC,WACPA;cAAcA,UAShBA;AAPMA;AAAkBA;AACtBA,SAAwBA,UAM1BA;AClQwCA;AD8PtCA,iBACWA,8BAAUA;AAAnBA;;AAEFA,QACFA,C;IAEyBC,WACvBA;cAAgBA,UAWlBA;AAV2BA;AAAoBA;AAEzCA;AAAkBA;AACtBA,SAA6BA,UAO/BA;AANgBA;AexUhBC;AfyUED,iBACyCA,8BAAmBA;AAAnBA;AACxBA;AAAXA,mCAAUA;AADdA,MQ1QEA,kBR6QJA,Oc/WFA,oBdgXAA,C;;GA2FIE,cACFA;AAAIA,oCAAUA;AAAdA,OAAwCA,MAG1CA;AAFEA,oBAEFA,C;;GApDQC,YACDA;AACDA;AAAJA,WAAkBA,MAsBpBA;AArBiBA;AAIkCA;AAKAA;AAIjDA,OAzBFA,gDAiCAA,C;;GA8nB2BC;AACHA;AAClBA;AACAA,oBAEDA,C;;EA6qBLC,YACMA;qBAEAA;AAAJA,WAAmBA,MAmBrBA;AAhBqCA;AAD/BA;AAAJA;AAGIA;AAAJA;AAGIA;AAAJA;AAGIA;AAAJA;AAGIA;AAAJA;AAIAA,QACFA,C;;EAwBOC,YAAcA;AAcYA,qCAMoCA;AAC/DA;AAAJA,WAA2BA;AA2BvBA;AAAWA;AAAeA;AAAMA;AAAQA;AAD5CA,OArHFA,mRAsHwDA,4EACxDA,C;GAMcC,YAmDZA,OAA8BA;mEAChCA,C;GAkCcC,YASZA,OAA8BA,mEAChCA,C;;EAsCOC,YACLA;WAAqBA,4BAA4BA,WAEnDA;AADEA,4DACFA,C;;GANAC,sDACgEA,C;;EAkBzDC,YACLA;AAAIA;AAAJA,WAAqBA,4BAA4BA,WAMnDA;AALMA;AAAJA,WACEA,uDAA0DA,eAI9DA;AAFEA,kEACoDA,eACtDA,C;;GAZAC,cAAmBA;AACHA;;AADhBA,sCAGuEA,C;;EAiBhEC,YAAcA;uCAA+CA,C;;;GAwBpEC,YACYA,gBAERA,0BAC6CA;AAG/CA,QACFA,C;;EA6JOC,YACLA;AAAIA;AAAJA,WAAoBA,QAQtBA;AAL+BA;AAIZA;;AAAVA;AAAPA,QACFA,C;;;EA+hBOC,YAILA,kBAHyBA,WAGPA,UACpBA,C;;;;;;EAoBOC,YACEA;AAEPA,WAAkBA,wCAEpBA;AADEA,kBAAmBA,WACrBA,C;;EAsBcC,cAAEA,mBAMhBA;AALEA,YAA4BA,QAK9BA;AAJEA,wBAA4BA,QAI9BA;AAHEA,+CAGFA,C;GAEQC,YACFA;AACAA;AAAJA,WAGgCA;KAIDA,8BAICA;AAEhCA,SAAqCA,gBACvCA,C;EAEAC,YACMA;WAA+BA;AAGnCA,kBAAkBA,qCAvkEJA,YAykEhBA,C;;GAGOC,YAAgCA,UAAaA,C;GAK7CC,YAAoCA,UAAiBA,C;GAwB9CC,YACRA;AAnENA;AAoEsBA;AAEpBA,4BACaA;AACXA,YACEA,QAGNA,E;;EA8bOC,YAAcA,aAAOA,C;;GAJ5BC,4CACoCA,mBACtBA,6CAFdA,AAEyEA,C;;EA2ElEC,YAAcA,uBAAgBA,WAAQA,C;;GAD7CC,8BAA0BA,C;;Ge1yGlBC,YAAUA,aAAOA,C;GAITC,WACdA,OAwUFA,eAxUaA,aACbA,C;EAqCWC,cACTA;wBACgBA;AACdA,WAAqBA,MAWzBA;AAV6BA;;AACzBA,QASJA,MARSA,2CACMA;AACXA,WAAkBA,MAMtBA;AAL6BA;;AACzBA,QAIJA,MAFIA,OAAOA,UAEXA,C;GAEEC,YACIA;AAAOA;AACXA,WAAkBA,MAMpBA;AA2KSA,YAL+BC;AA1K1BD;AACZA,OAAeA,MAGjBA;AADEA,aACFA,C;EAEcE,gBACZA;wBACgBA;AACdA,YAA0CA;AAArBA,SACrBA,oBACKA,2CACMA;AACXA,YAAiCA;AAAfA,SAClBA,oBAOSA;AACXA,YAAiCA;AAAfA,SAoJoBC;AAlJzBD;AACbA,WAEEA,aADyBA;KAGbA;AACZA,QAEOA;YAEoBA,eAhB/BA,C;EA8DKE,cACeA;AAAOA;AACLA;KACpBA,UAGEA;AACAA,cACEA,UAAUA;AAEAA,MAEhBA,C;GAEKC,gBACsBA;AACzBA,WACEA,YAA2BA;KAEtBA,KAETA,C;GAWKC,WAKHA,wBACFA,C;GAGkBC,cACEA;AA+IpBA;AA9IEA,iBACWA;AAATA,cAEyBA;AACpBA;AACQA;AAAbA;AAGFA;AACAA,QACFA,C;GA6CIC,cACFA;WAAoBA,QAOtBA;;AALEA,gBAEWA,kBAAuBA,QAGpCA;AADEA,QACFA,C;EAEOC,YAAcA,OAAQA,UAAiBA,C;GAE5BC,cAChBA,WACFA,C;GAEwBC,cACtBA,WACFA,C;GAEKC,sBAGLA,C;GAEKC,yBAELA,C;GAOAC,WAQiBA;AAAfA;AACAA;AACAA,QACFA,C;;;GAiDQC,YAAUA,eAAYA,C;GAGdC,YACdA;AAAuCA;AA0BzCA;AACEC;AA3BAD,QACFA,C;;GA6BME,WAAWA,aAAQA,C;EAEpBC,WACmBA;AAAtBA,gBACEA,UAAUA;KACDA;AAAJA,YACLA;AACAA,QAMJA,MAJIA;AACAA;AACAA,QAEJA,G;;GFbiBC,YAAOA,gBAAoCA,C;;GAExDA,cAAmBA,kBAAmDA,C;;GAEtEA,YAAgBA,gBAAoCA,C;;EGzXjDC,YAAcA,0BAAkBA,C;;GA4BhCC,kBAAUA;AAmBXA;AACAA;AACAA;8DACkCA;AAAtCA,uBAA+CA,QAKjDA;AADEA,UAAUA,gCAA0CA,sBACtDA,C;GCiCGC,YAEHA,OAAWA,8BACbA,C;ECusDKC,gBACHA,mBACEA,UAAMA,SAEVA,C;GASIC,gBACFA;;;KAIEA,UAAMA;AAGRA,QACFA,C;;;GA/nCUC,YAAUA,eAAgCA,C;;;;EA2BlCC,cACdA;AACAA,WACFA,C;;;;;;;;;;;;;;;;;EA2HaC,cACXA;AACAA,WACFA,C;;;EAmCaC,cACXA;AACAA,WACFA,C;;;EAmCaC,cACXA;AACAA,WACFA,C;;;EAmCaC,cACXA;AACAA,WACFA,C;;;EAmCaC,cACXA;AACAA,WACFA,C;;;GAoCQC,YAAUA,eAAgCA,C;EAErCC,cACXA;AACAA,WACFA,C;;;GA4CQC,YAAUA,eAAgCA,C;EAErCC,cACXA;AACAA,WACFA,C;;;;;;GCtlCgBC,WAA4BA;AAA5BA;AAEdA,gCACEA,OAAOA,MAiCXA;AA/BEA,qDAewDA;;;AAAVA,0BADxCA,KAPYA;AAUhBA,OAAOA,eAcXA,MALSA,2BACLA,OAAOA,MAIXA;AADEA,OAAOA,MACTA,C;IAEYC,mCAMNA,KALYA,eAMlBA,C;IAEYC,8BAMNA,KALYA,eAMlBA,C;IAEYC,YAoBCA,SAlBbA,C;GAwIWC,YACXA,OAhCAA,SCrJIC,SA8JJC,+BDwBFF,C;GAiBQG,cAENA;AACUA;AACVA,YACFA,C;GAsBQC,cACNA,SACFA,C;GAQQC,cACNA,QACFA,C;GAOQC,cAENA,IACIA,OAAyBA,OAC/BA,C;GASKC,cACMA;AACLA;AAEqBA;AAMdA;AAAXA,WAGEA;KACKA,WACLA;KCnHFA;AAkGEA;AACAA;ADsBAA,kBAEJA,C;GAIkBC;;;AAwBhBA,OAAYA,OAA+BA,YAG7CA,C;GCgZSC,cACUA,mCACfA,OAAOA,OAWXA;AARmBA,gCACRA;AAAPA,QAOJA,CALEA,UAAUA,kIAKZA,C;GCluBKC,WACHA;;AAGwBA;;AACtBA;AACOA,SAEXA,C;IAEKC;IAKDA;;AAIAA,aF3BAA,OAAyBA,GE4BMA,QAGnCA,C;GAQKC,YAtDHA;AAwDAA;;AAEEA,SF3CAA,OAAyBA,GE4CMA,aAGjBA;OAGlBA,C;GAUKC,YACHA;AAAIA;AAAJA,YACEA;AACwBA;AACxBA,MAcJA,CA7FEA;AAkFIA;AAAJA,YACQA;;WAGAA;AACgBA;;AAEtBA,oBAIJA,C;GA2BKC,YACGA;AACNA,YAGEA;AACAA,MAUJA,CAR6CA;AC2uCzCA,gBDpuCkCA,QACtCA,C;GEm6DUC,YAIJA,OCjnCJA,cDinCkCA,C;GDv+B/BC,oBAAwBA;;AAE3BA,KAA+BA,cAKjCA,C;GAIEC,kBACAA;AAASA;AAATA,SAA2BA,OAAOA,MAQpCA;;AANOA;IAEIA;AAAPA,QAIJA,gB;GAEEC,oBAEAA;AAASA;AAATA,SAA2BA,OAAOA,OAQpCA;;AANOA;IAEIA;AAAPA,QAIJA,gB;GAEEC,sBAEAA;AAASA;AAATA,SAA2BA,OAAOA,SAQpCA;;AANOA;IAEIA;AAAPA,QAIJA,gB;EAqBKC,kBAEHA;MAjWEA,MACmCA;AADnCA;AAoWMA,aAEAA,QAKRA,OACFA,C;;IHpnCMC,YACMA;;AAAIA;AACRA;AACAA,MACFA,C;;GAMOC;AAELA;AAI4DA;AACxDA;8CACLA,C;;IASHC,WACEA,WACFA,C;;IAOAC,WACEA,WACFA,C;;GA2CFC,cACEA,gDAQMA,KAPiBA;KASrBA,UAAUA,kCAEdA,C;;GAbAA;;QAaAA,C;;IAXIC,WACEA;;AACKA;AACLA,WACFA,C;;EAkECC,cACHA;UACEA;KACeA,iCACJA;AAAXA,IAAsBA,SAA8BA,iBAEpDA,KAAkBA,iBAItBA,C;EAEKC,cACHA,UACEA;KAEAA,KAAkBA,mBAItBA,C;;GAdsBC,WAChBA,oBACDA,C;;GAQiBC,WAChBA,yBACDA,C;;GA2FDC,YAAYA,qBAA+CA,C;;IAEtCA,cAGvBA,YnBssDFA,cmBrsDCA,C;;GA2C0CC,yBAE1CA,C;;;GCpVIC,yBdqGLC;AcnGED,gBAA0BA,UAAUA;AACNA;AAK9BA,WACFA,C,CATKE,kC;;EAmBAC,cACHA;WAA0BA,UAAUA;AACpCA,OACFA,C;EAEKC,cACHA,cACFA,C;;GAIKC,cACHA;WAA0BA,UAAUA;AACpCA,OACFA,C,CAHKC,kC;EAKAC,cACHA,aACFA,C;;GAyEKC,YACHA,cAAmBA,QAErBA;AADEA,OAAOA,uBACTA,C;GAEYC,YAAWA;AAEIA;AA1CFA;AA6CLA,mCAChBA,OAAOA,eAMXA;KAFIA,OAAOA,WAEXA,C;;EA4FUC,gBACHA;AACLA,YACMA;AACJA,WAIYA,YAGdA,OAAOA,cACTA,C;GAZUC,sC;GAeAC,gBA/CVA;AAkDEA,QA/KFA;AAgLEA,QACFA,C;GAsEKC,YAAYA;AArGWA;AAuG1BA,SACWA;AACTA,cAEAA,UApCKA;AArEeA;AA8GlBA,QACEA;AACAA,MAURA,CA3BEA;AACAA,WAsBEA;;AE4hCFA,gBF5hC0BA,kBAI5BA,C;GAEKC,YACHA;AADGA;;AACHA,WAAuBA,MA6BzBA;AA5J4BA;AAgI1BA,SACsCA;AACpCA;AACAA,YAEEA,2BAGOA,YAGTA,UApEKA;AArEeA;AA8IlBA,QACEA;AACAA,MAURA,CA3DEA;AACAA,WAqDcA;AACZA;;AE4/BFA,gBF5/B0BA,kBAI5BA,C;EAEgBC,WAIYA;AAC1BA;AACAA,OAAOA,SACTA,C;EAEgBC,YACEA;AAEhBA,gCACiCA;AACvBA,MAIVA,QACFA,C;GA0DKC,YAASA;;AAEFA,yBACEA,wBACRA;KAEAA;KAG0BA;AAvK9BA;AACAA;AAwKEA,YAEJA,C;EAWKC,cAGyBA;AAnL5BC;AE1QFA;AF+bED,WACFA,C;GAEKE,YAAcA;AAaPA,iCACRA;AACAA,MAMJA,CAxOEA;AAqOAA;;AEu3BAA,gBFv3BwBA,iBAG1BA,C;GAEKC,YACHA;AAAUA,gCACRA,YA5OFA;AA+OIA;;AE62BJA,gBF72B4BA,uBAIxBA;AAEFA,MAIJA,CADEA,YACFA,C;GAEKC,cAAmBA;AA3PtBA;AA+PAA;;AE61BAA,gBF71BwBA,mBAG1BA,C;;;GAnIYC,cAAmBA;AA/H7BA;IAsIEA,IAAYA,YAYCA,2BAnBcA;AAuB3BA;AAKAA,KAAkBA,iBAItBA,C;GAIYC,cAAgBA;KAE1BA,aAtJOA;AAyJPA,SAC8BA;AAhI9BA;AACAA;AAiIEA,cAEmCA;AA9NrCA;AACAA;AA+NEA,QAEJA,C;EAuFYC,cACVA;AADUA;;AACVA;AA9ToBA;AAiUlBA,YACEA,MAnQGA;AAqQMA;AAC6BA;AAAkBA;AAD/CA;AE4yBbA,sBFzyBIA,MA2JNA,MAtJIA,mBAGWA;AACTA,WAGmBA;AAAOA;AAQvBA;AACDA;AAKJA;MAvesBA;AAueGA,wBAuGLA;AAvGpBA,MAzecA;AAAOA;AA2enBA,MAAwBA;;AE6OrBA;AAAPA,MACmCA;KFzIbA;AArGlBA;MAGSA;AAC6BA;AAAkBA;AAD/CA;AE0wBbA;AFxwBMA,MA0HRA,CEpa2BA;AF8SrBA;KAmFIA;AAlkBmBA;AAqjBvBA,SA/D+BA,kBAgEHA;KACrBA,MACLA,aA9BsBA,gBA+BDA,UAGrBA,aAzBcA,gBA0BDA;AAKfA;AAIIA;AAAqBA,iBAMrBA,WA1SkBA;AAC1BA;AACOA;AAnEPA;AACAA;AA6WUA;AACAA,cAEAA;AAKJA,MAcRA,EAX8BA;AAxTFA;AAC1BA;AACOA;AAwTAA;AACcA;AADnBA,OA/YFA;AACAA,WAKAA;AACAA,MA+YEA;IAEJA,C;;GA7W4BC,WACtBA,kBACDA,C;;GA8BuBC,WACtBA,oBACDA,C;;GAoCWC;AAjIdA;AAuIIA,OACDA,C;;IAKYA,cAEXA,aACDA,C,CAHYC,mC;;GASKD,WAChBA,uBACDA,C;;GAwEqBE;AACtBA;AAhC0BA;AAjL5BC;AACAA;AAkLAD,QA+BCA,C;;GAQ2BE,WACtBA,mBACDA,C;;GAcmBC,WACtBA,uBACDA,C;;GA6DGC,WAA+BA;;IAQVA;AA3clBA,yBAmc4BA;AAS3BA;AACAA,WAAwCA;AAAOA;AAA/BA;AAAhBA;;KACEA;KExjBZA;AF4jBUA;AACAA,MAkBJA,CAhBqBA,iBAtYHA,iCACFA;AA+DbA;AA0UKA,OAGFA,MASNA,CAJyBA;;AACEA,SAAoBA;AAC3CA,OAEJA,C;;GAH+CC,YAAOA,aAAcA,C;;GAKpEC,WAAwBA;IAEGA;AAjgBxBA,uCA+fqBA;AAGpBA;;AEplBVA;AFslBUA,OAEJA,C;;GAEAC,WAAgBA;IAEDA;AACPA;;AAEqBA;AACvBA,iBANUA;AAQZA;AAzWDA;AA0W6BA;AAAOA;;AAAnCA,yBACEA;KEpmBZA;AFwmBUA,OAEJA,C;;;GGkPUC,YACDA;AADCA;ADpmBWC;ACsmBrBD;AEoqjCOA,mBFlqjCPA;AAQJA,OHtsBFA,kBGusBAA,C;;GATME,sBAECA,C;GAFDC,uD;;;;;ED91BCC,YAAcA,OAAEA,WAAMA,C;;;;GAwiCEC;;AAC7BA;YhB/9BFA;AgB+9BEA;;AACIA;AAAJA,WAAwBA;AHzYlBA;AACyBA;OG0YhCA,C;;GAyLIC,YAAUA;IAEXA,cACEA;AACAA,MAMNA,CAJIA,gCANWA;AAOXA;AA4DFA,yBAzDFA,C;GAEKC,cAAkBA;IAEnBA,cACEA;AACAA,MAMNA,CAJIA,kCANmBA;AAOnBA;AAgDFA,yBA7CFA,C;GAVKC,uC;GAwBWC,YACdA,OAAOA,gBACTA,C;GAFgBC,mC;GAaAC,YACdA,OAAOA,gBACTA,C;GAEiBC,cACfA,OAAOA,kBACTA,C;EAOSC,cAAkBA,MAAIA,C;GAY7BC,YACAA,aAAyCA,OAAOA,MAElDA;AADEA,OAAOA,sBACTA,C;GAHEC,mC;GAKAC,cACAA,aAAyCA,OAAOA,OAElDA;AADEA,OAAOA,wBACTA,C;GAHEC,4C;GAKAC,gBACAA,aAAyCA,OAAOA,SAElDA;AADEA,OAAOA,0BACTA,C;GAHEC,qD;GAS4BC,YAE1BA,QAACA,C;GAFyBC,6C;;GAxDrBC,WAAMA,OAAKA,iBAASA,C;;GAapBC,WAAMA,OAAKA,iBAAaA,C;;IAIxBC,YAASA,OAAKA,mBAAuBA,C;GAArCC,+C;GIlgCFC,cACDA;AAGJA,mBACFA,C;GAEYC,gBAIVA;WAQFA,C;GAoBOC,WAQUA;AAAfA;;AAEAA,QACFA,C;GA8JQC,gBACNA,OAAOA,OX7eT3K,oBW8eA2K,C;GAMQC,cACNA,OXrfF5K,mBWsfA4K,C;GAupBQC,kBAOAA,OAqDRA,iBAhCAA,C;GC5+BcC,gBAEZA;AAAIA,YACFA,oBAEEA,aAgBNA;AAdIA,gBAcJA,CAZ+BA;AAC7BA;;IAEEA,kBAGAA,+BAAkBA;AAAlBA,QfkUUA;AehUZA,6BAIFA,C;GAccC,gBAEZA;AAAIA,WACFA,gBAYJA;Af8QAA;AevREA;;IAEEA;AfsSFA,KAAYA,KAAUA,wBenSpBA,+BAAkBA;AAAlBA,QAEFA;AfkTA/M,KAA6CA;AAHD+M;Ae9S5CA,6BACFA,C;GAOGC,YACHA;QAAoBA,oBAApBA,IACEA,YAAwCA,QAG5CA;AADEA,QACFA,C;GAKKC,cAOOA;AAkBaA;AAGhBA;AAAwBA;AAA/BA;AACOA,UAAeA,MAoFxBA;AAnFwBA;AACpBA;AACAA,cACAA,IAUGA,WACHA,QAAoCA,MAqExCA;AApEqBA,+BAAMA;AAANA;AACGA,+BAAMA;AAANA,eAEHA,SACjBA;AACKA,WACHA,SACEA,OAAYA;AACZA,MA4DRA,CA1DyBA;AACCA,+BAAMA;AAANA;AACpBA,mBAEcA,SACdA;KAGOA,MAAPA,SAEgBA,SACdA;AACAA,UAQEA;AAEYA,+BAAMA;AAANA,oBACVA,IAEFA;AACAA,MAgCVA,EA7B4BA;AACHA;AACnBA,wBAOJA,iBAEEA;;AAMFA;AACYA,+BAAMA;AAANA;AACVA,YAEEA;SAGJA,WACEA;AAEFA;AACAA,SACFA,C;GClTUC,cACWA;AAAaA;AAC9BA,4DACEA;AAEFA,QACFA,C;GCxFcC,YAEZA;AAFYA;AAERA,WACFA,aAwBJA;AjBqfAA;IiBxgBIA,OAAkBA;AAClBA;AjByiBFnN,KAA6CA;AiBxiBtCmN;AACLA,MAAUA;AASVA;AjB8hBFnN,KAA6CA,oBiB3hB3CmN;+BAAkBA;AAAlBA,QjBwhB0CA;AiBrhB5CA,6BACFA,C;;GHiCQC,YAAUA,aAAOA,C;GAITC,WACdA,OAmWFA,eAnWaA,aACbA,C;GAMKC,YACHA;yCACgBA;AACdA,4BAOJA,MANSA,2CACMA;AACXA,4BAIJA,MAFIA,OAAOA,UAEXA,C;GAEKC,YACCA;AACJA,WAAkBA,QAGpBA;AADEA,OAAOA,OADMA,kBAEfA,C;EAYWC,cACTA;yCACgBA;AAC8BA;AAA5CA,QAOJA,MANSA,2CACMA;AAC8BA;AAAzCA,QAIJA,MAFIA,OAAOA,UAEXA,C;GAEEC,YACIA;AAAOA;AACXA,WAAkBA,MAIpBA;AAHeA;AACDA;AACZA,sBACFA,C;EAEcC,gBACZA;AAcWA;AACXA,YAAiCA;AAAfA,SdlHiBC;AcqH/BD;AAAJA,YACEA;AAEAA,iBAEYA;AACZA;;AAKEA,aAlBNA,C;EA8DKE,cACEA;AAAOA;AACZA,4BAESA;AAAPA,OAAgBA;AAChBA,cACEA,UAAUA,WAGhBA,C;GAEKC,WACHA;AAAIA;AAAJA,WAAmBA,QAgDrBA;AA/CoBA;;AAIJA;AACdA,YAEsCA;;AACpCA,qBAEwCA,UACtCA;AAKOA;AACXA,YAEsCA;;AACpCA,iBAIwCA,WACtCA,KAKOA;AACXA,YAEsCA;;AACpCA,iBAGqCA;;AACnCA,kBAEwCA,UACtCA,MAKCA;AAAPA,QACFA,C;GAyEKC,cAEHA,SdnTmCH,kBcoTrCG,C;;EAiCIC,cACFA;WAAoBA,QAMtBA;;AAJEA;AACEA,yBAAkDA,QAGtDA,CADEA,QACFA,C;;GAmDQC,YAAUA,eAAYA,C;GAGdC,YACdA;OAwBFA,WAxB0CA,SAC1CA,C;;GAyBMC,WAAWA,aAAQA,C;EAEpBC,WACCA;AAAOA;AACEA;AACmBA;AAAhCA,WACEA,UAAUA;KACLA,gBACLA;AACAA,QASJA,MAPIA;AAIAA;AACAA,QAEJA,E;;GAgxBgBC,YAyXhBA;AACEC;AAzXAD,QACFA,C;GAEQE,YAAUA,aAAOA,C;EAIpBC,cACHA;yCACgBA;AACdA,WAAqBA,QAWzBA;AATIA,iBASJA,MAFWA;AAAPA,QAEJA,E;GAEKC,YACCA;AACJA,WAAkBA,QAGpBA;AADEA,OAAOA,SA4NIA,iBA3NbA,C;EA0CKC,cACHA;yCACgBA;AACdA,YAA0CA;AAArBA,SACrBA,OAAOA,YAQXA,MAPSA,2CACMA;AACXA,YAAiCA;AAAfA,SAClBA,OAAOA,YAIXA,MAFIA,OAAOA,UAEXA,C;GAEKC,YACCA;AAAOA;AACXA,YAAiCA;AAAfA,SACPA;AAEPA;AAAJA,WAC4BA;KAGdA,kBACIA,QAKpBA;OAJ8BA,YAG5BA,QACFA,C;GAwDKC,cAEHA,cAAkBA,QAGpBA;AAFiCA;AAC/BA,QACFA,C;GAmBmBC,YACEA;AA0LrBA;AAzLEA,iBACWA;AAATA,cAE0BA;AACrBA;AACQA;AAAbA;AAXFA;AAeAA,QACFA,C;GAkCIC,YAKFA,OAA0CA,iBAC5CA,C;EAoBIC,cACFA;WAAoBA,QAOtBA;;AALEA,gBAEWA,kBAAqBA,QAGlCA;AADEA,QACFA,C;;GAEOC,WAQUA;;;AAEfA,QACFA,C;;;GA4GMC,WAAWA,aAAQA,C;EAEpBC,WACmBA;AAAtBA,gBACEA,UAAUA;KACDA;AAAJA,YACLA;AACAA,QAMJA,MAJIA;AACAA;AACAA,QAEJA,G;;;;GvB9kDgBC,YAAYA,OD6Q5BA,WAEyBA,aC/Q4BA,C;EAEnDC,cAAwBA,OAAIA,WAAOA,C;EAwIzBC,gBAA0BA,ODuNtCA,cCvN0CA,sBAAiCA,C;EAsVpEC,YAAcA,OAAaA,eAAoCA,C;;;G0BvfxDC,cACRA;;QjB2gBWA;AiBxgBXA;AACAA;AjBugBWA;AA2BftP;AA3BesP,WiBpgBZA,C;;EA+EAC,cACHA;UAAcA,WAAdA;AACEA,OAAgBA,aAEpBA,C;GAoEQC,YAAUA,OAAKA,KAALA,UAAWA,C;EAItBC,YAAcA,OAAQA,UAAiBA,C;;;;EAwInCC,cAAkBA,oBAASA,C;EAgBjCC,cACHA,aACFA,C;GAIQC,YAAUA,eAAWA,C;GACbC,WAAQA;Od6BxBjM,YAxUaiM,Uc2SoBA,C;EAE1BC,YAAcA,OdvDQA,YcuDOA,C;;;;EC3S/BC,cACHA;oBAA4BA,SAA5BA,OACFA,C;EAkEYC,gBACRA,O5B0PJA,iB4B1PQA,eAA4CA,C;EAU7CC,YAAcA,OAAaA,kBAAoCA,C;;;;;;GC5GxEC,cACEA;uBAAuBA,UAAMA;;6BADrBA;AAQIA;AAAVA,aAIOA;AAAPA,QAIJA,C;GAmDAC,YAEEA;WAAoBA,MAyBtBA;AAtBEA,sBACEA,QAqBJA;8CAdIA,OA8BFA,+BAhBFA;AAVEA,uBAO8BA;AAE9BA,QACFA,C;;EAkBWC,cACPA;AAuHsBA;AAvHtBA,WACEA,OAAOA,aAQXA;KAPSA,uBACLA,MAMJA;KAHuBA;AACnBA,6BADqCA,YAGzCA,E;GAEQC,YAAUA,6BAAoCA,eAAqBA,C;GAKtDC,WACnBA,iBhBvGWA;AgBuGMA,OhBiOnB1M,YAxUa0M,UgByGbA,CADEA,OA8KFA,cA7KAA,C;EAuEKC,cACHA;gBAAiBA,OAAOA,aAsB1BA;AArBsBA;AACpBA,wBACeA;AAKMA;AAAnBA,0BACUA;YAKVA;AAIAA,cACEA,UAAUA,WAGhBA,C;EAgBaC,WAECA;AACZA,YACqBA;AAAZA,SAETA,QACFA,C;GA+BAC,YACEA;mDAAmCA,MAGrCA;AAFeA;AACbA,kBACFA,C;;;;GAuBQC,YAAUA;OAAQA,OAAMA,C;EAEzBC,cACLA;aACcA,SAAKA;KACbA;AAAQA,mCAAcA;AAAdA,OAFdA,QAGFA,C;GAKqBC,YACnBA;cACcA;AAAKA,eACbA;A9BmWR/X,yB8BrWE+X,QAGFA,C;;;;;;;;GC9MQC,gBAwVyBA,aAtVHA;AAAPA,QAEvBA,C;GAJQC,uC;IA0BQC,WACQA,UAExBA,C;;;IClHgBC,WAAWA,UAAmBA,C;;GAgBpCC,gBACJA;AACaA;AACJA;AACbA,SAAiBA,wBAkBnBA;;AA0BAA;AAxCoBA,mBAUEA,KAJCA;AAOrBA,sBf0hCgBA,aAFVA,sBevhCRA,C;GAtBUC,qC;;GA+DLC,cACHA;AAMEA;AAAQA;AAAYA;;AANtBA,sBAsNQA;AAhNEA;AAARA,uBAAOA;AAAPA;AACoBA;AAAZA;AAARA,uBAAOA;AAAPA;AACoBA;AAAZA;AAARA,uBAAOA;AAAPA;AACQA;AAARA,uBAAOA;AAAPA;AACAA,QAYJA,MALYA;AAARA,uBAAOA;AAAPA;AACoBA;AAAZA;AAARA,uBAAOA;AAAPA;AACQA;AAARA,uBAAOA;AAAPA;AACAA,QAEJA,E;GASIC,gBACFA;AAAqCA,sCAGnCA;AAIeA,sCADjBA,SACiBA;AAEfA,WACMA;AAAJA,QAAoCA;AAC5BA;AAARA,YACKA,sBACLA,eAAwCA;AAGNA;AAChBA,aADCA,qBAKnBA,YACMA;;AAAJA,QAAwCA;AAChCA;AAARA,uBAAOA;AAAPA;AACQA;AAARA,mBAGIA;AAAJA,UAAwCA;AACpBA;AAAZA;AAARA,uBAAOA;AAAPA;AACoBA;AAAZA;AAARA,uBAAOA;AAAPA;AACQA;AAARA,uBAAOA;AAAPA,eAINA,QACFA,C;GrBkBcC,YAEZA,oBAAuBA,OAAOA,MAEhCA;AADEA,sBZggBcA,WY/fhBA,C;GA0MQC,gBACEA;AAAUA;AAClBA,oBACEA,OADFA;AAGcA,QAEhBA,C;GA2FQC,gBAEJA,OIleJA,WAIUA,iBJ+diDA,C;GNzc7CC,YACZA,sDACEA,OAAOA,OAMXA;AAJEA,uBACEA,wBAGJA;AADEA,OAAOA,OACTA,C;;GMijB4BC;AACtBA;;AAASA;AAxFEA;AA2BfzR;AAgEmByR;AACfA,QACDA,C;;;;EAhRSC,cAAEA,mBAGQA;AAFpBA,0CAEoBA,C;GsBsGhBC,YAAYA;SAAWA,wBAA2BA,C;EA2EnDC,YACEA;AAAIA,OtBhNcA;AsBiNdA,OtB9MeA;AsB+MfA,OtB5MaA;AsB6MbA,OtB1McA;AsB2MZA,OtBxMcA;AsByMdA,OtBtMcA;AsBuMfA,OtBpMoBA;;AsByM9BA,QAEJA,C;;GArDcC,YACRA;AAAOA;AAGgBA;AAD3BA,WAAkBA,UAIpBA;AAHEA,UAAiBA,cAGnBA;AAFEA,SAAgBA,eAElBA;AADEA,gBACFA,C;GAUcC,YACZA,UAAcA,UAGhBA;AAFEA,SAAaA,WAEfA;AADEA,YACFA,C;GAEcC,YACZA,SAAaA,UAEfA;AADEA,WACFA,C;;;;;E5B1aOC,YAAcA,sBAAgBA,C;;IAgE1BC,WAAcA,2CAA4CA,C;IAC1DC,WAAqBA,QAAEA,C;EAE3BC,YACEA;AACHA;AAIyBA;AADTA;AAAkCA;AACpCA;AAClBA,WAAgBA,QAKlBA;AAHuBA;AACKA;AAC1BA,iBACFA,C;;GAvDAC,0CAGiBA,C;GAgBjBC,wCAEsBA,C;;IAuLXC,WAAcA,kBAAYA,C;IAC1BC,WAAkBA;AAGvBA;AAAJA,YACMA;AAC0CA,wDAGrCA;AAAJA,WAC0CA;KAC1CA,OAC0BA,gCAAQA;KAKDA,qEAExCA,QACFA,C;;GA3IAC,sEAI0EA,C;EAiB1EC,+DAK4EA,C;GAkEjEC,sBAITA,YAEEA,UAAUA;AAEZA,YACEA,YAEEA,UAAUA;AAEZA,QAGJA,CADEA,QACFA,C;;IAmEWC,WAAcA,kBAAYA,C;IAC1BC,WAAkBA;AAEHA;AACpBA,oCAAaA;AAAjBA,OACEA,oCAMJA;AAJMA;AAAJA,SACEA,8BAGJA;AADEA,qCAAqCA,MACvCA,C;;GAtBAC,oBAGwCA;AAHxCA,gDAK6DA,C;;EM4OtDC,YACQA;AADRA;AAnFPA;AAqFSA;AAELA;AArDF9S;AAuDmB8S;AACfA,SAIFA,WAAwBA;AASEA;AACAA;AAEqBA;AAA/CA,QAWJA,C;;GA5CAC,8CAOoDA,C;;ENjI7CC,YAAcA,sCAAiCA,C;;GADtDC,8BAA8BA,C;;EAiBvBC,YAAcA;4DAEMA,C;;GAH3BC,8BAAkCA,C;;EAe3BC,YAAcA,0BAAqBA,C;;GAD1CC,8BAAwBA,C;;EAiBjBC,YACLA;WACEA,iDAIJA;AAFEA,mDACaA,WACfA,C;;EARAC,8BAAkDA,C;;EAc3CC,YAAcA,qBAAeA,C;;;EAQ7BC,YAAcA,sBAAgBA,C;;;EAgB9BC,YAAcA;8HAEoDA,C;;EK7iBlEC,YAELA,0BACFA,C;;EA8DOC,YACEA;AACsBA;AAehBA;AAZKA;AACSA;AAC3BA,wBAEEA;KAPEA;AAOFA,KAIIA;AAAJA,YAEaA;AAEXA,eAgENA,CA3DIA,8BACaA;AACXA,WACEA,aACEA;AAEUA;AA1BdA,UA4BOA,WACLA;AACYA;AA9BlBA,MAuEWA;AAhCYA;AACrBA,iBACaA;AACXA,mBAKWA;AAHTA,OAQJA,UAIEA,WACQA;;;aAEDA,WACGA;;UAIAA;AACFA;qBAI6BA;AAAPA;AACEA;AACLA,KAFdA;AAEfA,oBAA4CA,8BAQhDA,MAFIA,iCAF0BA,aAI9BA,C;;GAlGMC,sCAA8DA,C;;;;;EwBqHxDC,gBAAoBA,OAAIA,+BAA6BA,C;SAgBrDC,cAA+BA,OjCoN3CA,iBiCpN+CA,kBAA4BA,C;EAqJpEC,cACOA;AAAgBA;AACvBA,UAAqBA,QAc5BA;AAZEA,WvB4LkDA;GuB1LrBA;MAClBA,YAEgBA;KAClBA,OAEoBA,kBAG7BA,6BACFA,C;GA2CQC,YAAOA;AAGCA;AACdA,QAAOA,OACLA;AAEFA,QACFA,C;GA2HMC,YACQA;AAAKA;AACZA,UAAeA,UAA2BA;AACjCA;AACVA,SAAeA,UAA2BA;AAC9CA,QACFA,C;EAoFEC,cAASA;A7BtSTA,OAAeA,KAAUA;A6B0SzBA;AACEA,SAA2BA,QAI/BA,CAHIA,IAEFA,UAAUA,4BACZA,C;EAkBOC,YAAcA,OAAaA,kBAAqCA,C;;;;;GvBjlB/DC,YAAYA,OAAMA,gCAAQA,C;EwBnD3BC,YAAcA,YAAMA,C;;;;;ExB8BbC,cAAaA,eAAsBA,C;GAGzCC,YAAYA,OAAWA,SAAoBA,C;QAG5CC,YAAcA,sBZ2qBLA,cY3qBiDA,C;GAGzDC,cACNA,UAAUA,UAAmCA,QAC9BA,QAAgCA,cACjDA,C;;;;;;GA0eQC,YAAUA,oBAAgBA,C;EA4B3BC,YAAcA;6BAAmCA,C;;GAM1CC,gBACgBA;AACvBA,UAAqBA,QAa5BA;AAZEA,oBAekDA,OAbVA;MAC7BA,YAYuCA,OAVZA;KAC7BA,OASyCA,UAPVA,QAGxCA,QACFA,C;;;IyBw7BWC,YACTA;WAAmBA,QAKrBA;AAJMA,gBACFA,OAAOA,qBAGXA;AADEA,QACFA,C;IAEQC,YACoBA;AAAPA,QAErBA,C;EA2mCOC,YACLA;AAAOA;YAMHA;;AAxHmBC;;AAyHvBD;AA7BIC;AAAJA;AAIAA;AzB1kEeA;AyB0mEXD;AAAJA;AACIA;AAAJA;;AAfOA,SAAPA,QACFA,C;EAkBcE,cACZA;AADcA,mBAahBA;AAZEA,YAA4BA,QAY9BA;AAXeA,iBACFA,gBACMA,8BACJA,gBACTA,mBAAcA,SACdA,mBAAcA,SACTA,gBAzIUA;;;;AA0INA;AACHA,iBAzIYA;;;;AA0INA;AACZA,oBADYA,UADNA,UADGA,UADJA;KADAA;KADAA;KADIA;KADIA;KADNA;KADXA;QAWFA,C;GAEQC,YACNA;YAAqCA,SAAXA;AAAnBA,SAAPA,QACFA,C;;;GzBx+DcC,kBAEZA;YAAiCA;AZo2BnCC,uBAAsBA,KAAMA;iBYp2B1BD;KACEA,QAsBJA;A0B3sBqBA,UAAQA;A1B4rB3BA,iCACaA;AACXA,UACqBA;AAAfA,uBAAcA;AADpBA;KAxPgBE;mFAoQlBF,6BACFA,C;GyBk0BWG,YACTA,cAAsBA,SAGxBA;AAFEA,eAAuBA,UAEzBA;AADEA,QACFA,C;GA6CYC,gBACVA,UAAUA,YACZA,C;GAgUWC,cAGTA,QACFA,C;GAacC,kBAEMA,MAqBpBA,C;GAyFcC,gBACZA;SAAkBA,QAkBpBA;AAhBOA,SADqBA,YAExBA;AAGFA,sBACuBA;AAiRhBA,gBAA2BA;AAAbA,oCAAYA;AAAeA,mBAAIA,sBAApDA;AAhREA,MACEA;AAEEA,iBAA6BA,gBAI1BA;AAETA,OAAOA,OADyBA,UAElCA,C;GAKcC,YAKZA,QACFA,C;GAEcC,gBACUA,QAExBA,C;GAEcC,sBAEPA;AACAA;AACqCA,eAoB5CA,C;GAccC,kBAEZA;AAFYA;AzBzjDdA;AyBqkDMA;AAYJA,MAAwBA,SAVLA;AzBxiDyBA;AyB4jD5CA,6BACFA,C;GAEcC,gBACUA,MAGxBA,C;GAwNYC,YACNA,WAAKA,SAAiBA,QAG5BA;AADEA,OADYA,mBAEdA,C;GAOcC,YACZA;AAAKA,YAA8BA,QAsBrCA;AApBwBA;AAECA,uCAAvBA;AAEMA,iBpC7yDYC;AoC8yDdD,UACEA,wBAAOA;AAAPA;AACAA,gBACEA,WANRA,UAUSA,WAVTA;KAaIA;MAGJA,KAAiBA;AACjBA,OAAOA,YACTA,C;GAacE,cAAsBA;AAE7BA,YAEHA,SADyBA,SA2B7BA;AAvBwBA;AAECA,uCAAvBA;AAEEA,YACgCA,oCAC5BA,+BAAOA;AAAPA;AAJNA,UAOMA;UAEGA,WATTA;KAYIA;MpC/1DcA;AoCk2DlBA,mBAA6CA,uBAAMA;AhCv/DjCA,uBgCu/DlBA;KAfAA;AAeAA,KACEA,UAKJA;AAH4BA,wBAAcA;AACxCA,OAA4CA,8BAAMA;AAApBA;AAAZA,8BAAMA;AAANA,OAClBA,OAAOA,YACTA,C;GAGcC,YACZA;AAASA;AAAeA,cAAuBA,WAC7CA,iBACaA;AACXA,UACEA,OAAUA,mBAA0BA,aAS5CA;AAPMA,WACmBA;AAAbA,yBAAYA;AAAYA,8BAD9BA;KAEEA,MAINA,QACFA,C;GA4WYC,YACNA;AACJA,oBACFA,C;;GAhsBEC,cAAmBA;AACjBA;;AAAaA;AACbA;AzBlkDaA,WyB2hBHA;AAyiCVA,0BzBziDFvW;AA3BeuW,SyB2hBHA,oBA6iCZA,C;;GAEwBC,cACtBA;gCACEA;KAGAA,6BACEA,OADFA,OAIHA,C;GZziEYC,WACbA,eAAyEA,C;GAisXnEC,gBAEFA;AAAoBA;AAAKA;AAGbA;AvBz3WlBC,WuBk1pBAC,WAz9S8BF;AAA5BA,OAAiDA,OACnDA,C;GA+iCcG,YACLA;;IAEOA;;AAAZA,uBACmBA,oBAJGA,OAOxBA,QACFA,C;GAq4HsBC,gBAEpBA,OAAOA,qCAEFA,GAAKA,eACZA,C;GA4G2BC,0BAQrBA;AAAgBA;ALxohBtBtQ;AAzKIuQ;AKuzhBFD;;AAktjBWA,cA1rjBOA;AA0rjBPA,eAxqjBkBA;AAK3BA;AAGFA,QACFA,C;GA+6oBUE,YACVA;WACEA,MAcJA;AATEA,uBACoCA;AAEvBA,gBACTA,QAKNA;AAHIA,MAGJA,MADIA,QACJA,C;GAysBiBC,cAEfA;WAA+BA,QAGjCA;AADEA,OAAYA,SACdA,C;;;EAhirCSC,YAAcA,gBAA+BA,C;;;EAigB7CC,YAAcA,gBAA+BA,C;;;;;;EAm2R7CC,YAAcA,gBAA+BA,C;;;IA2oE5BC,YAAcA,OA2wqBtCA,WA3wqBoEA,C;EAoS7DC,YAAcA,kBAASA,C;QAkXbC,kBAEfA;YAEQA;AAAJA,YAy+vBiDC;AAyBvDD;AA6KEE,OAxFQD;AAwFRE,OAVQF;;;AAhqwBFD;AAAJA,YAqmzBJA;;SAlmzBwBA;KAQtBA;AAC4BA;;AACZA;AAIKA;;;AACdA;AACUA,wBAIbA;AAAJA,iBACwBA;;AAAPA,SAKEA;AADnBA,eACkCA;KAEcA;AAA7BA;;AACFA,wBAgCfI,gFA3BAJ;AACWA,wCAEIA;AAEJA;KACXA,wBACEA,iBAGiCA;AAArCA,yBACEA;AAGFA;AAEAA;AAEAA,QACFA,C,CAjEiBK,0C;IA8GbC,cACGA,YACPA,C;GAuBKC,kBAEHA;AAIEA,cAAOA,gBAGXA,C;GATKC,4C;IA8wCoBC,YAAYA,OAwipBrCC,8BAxipBiED,C;;;;GAtvEnCE,YAAOA,QAAEA,WAAUA,C;;;GAg3F5CC,kBAAiBA,yCACZA,C;;;;;GA24ELC,sBAAIA,kBAC6CA,C;GADjDC,uC;;;;GA3TOC,YAAqBA,qBAAgBA,C;;GAmJ7BC,YACZA;AAAWA;AAAIA;oCAAOA;AAAtBA;AAQAA;AAEJA;AACEA;AADFA,KACEA;KAEAA,OAEHA,C;;;;;EAg7DIC,YAAcA,gBAA+BA,C;;;GAm9E3CC,YACHA;AAuIYA;AAAiBA;AAtIjCA,SAAYA,UAAUA;AACtBA,OAAWA,UAAUA;AACrBA,mBACFA,C;EAMKC,cACHA;AAE2BA;AAAOA;AAAhCA,SAEEA,sCACEA;AAGJA,MAKJA,C;GAgFmBC,YAAYA;OAm0f/BC,uBAn0fwDD,C;GA+BhDE,YAAUA,+BAAuBA,C;EAM3BC,cAAiBA;AAAMA,mCAAUA;AAAhBA,WAAuBA,C;;;;;;GA8BjDC,YAGHA;WAEEA,gBAEJA,C;EAgDOC,YACEA;AACPA,eAA6BA,YAC/BA,C;;;;GAmVQC,YAAUA,eAA2BA,C;EAE/BC,cACZA,0BACEA,UAAUA;AACZA,WACFA,C;EAoCKC,cAA4BA;AAAJA,WAAWA,C;;;;;;;;;;;;;;EAw3KvBC,kBAEfA;wDACEA,OAAaA,gBAWjBA;AANkBA;AAnojBYA;AAsojBnBA;AAAmBA;AAp/L9BzC,WAo/LiByC,IAp/LjBzC;AAs/LEyC,QACFA,C;;;EAsEiBC,kBAEfA;wDACEA,OAAaA,gBAajBA;;AA/tjB8BA;AAutjBVA;AAGbA;AAxkMP1C;AAykMO0C;AACaA;AA1kMpB1C;AA0kM0B0C;AACfA;AAAiBA;AA3kM5B1C,WA2kMiB0C,IA3kMjB1C;AA4kME0C,QACFA,C;;;EA+CiBC,kBAEfA;wDACEA,OAAaA,gBAYjBA;;AA7xjB8BA;AAsxjBVA;AAGbA;AAvoMP3C;AAwoMO2C;AACIA;AAAqBA;AAzoMhC3C,WAyoMiB2C,IAzoMjB3C;AA0oME2C,QACFA,C;;;GA+EKC,kBAAYA;AAEfA;AACeA;AAGfA,wBACFA,C;GAPKC,4C;;;;;;GA2jKGC,YAAUA,eAA2BA,C;EAE/BC,cACZA,0BACEA,UAAUA;AACZA,WACFA,C;EAoCKC,cAA4BA;AAAJA,WAAWA,C;;;;;;;;;;;;EAuoBnCC,cACHA;AAAgBA,wCAAhBA;AAEEA,OA2DKA,mBAzDTA,C;GAEqBC,WAEfA;AAAsBA;AACPA;AACnBA,4BACeA,8BAAUA;AAAVA;AACbA,wBACEA,eAGJA,QACFA,C;;;;EA2CgBC,cACdA,OAAOA,sBACTA,C;GAeQC,YACNA,OAAOA,gBACTA,C;;;;GAo7CKC,WACHA;AAAIA;AAAJA;gBAzkoBAA,KACEA,wBA2koBJA,C;;GA1DAC,kBAIYA,WAAiBA;AAJ7BA;AAKEA;AALFA,QAMAA,C;;IAF6BC,YAAOA,OAAQA,YAAcA,C;;GA0mB1DC,YAEEA;AAAIA;AAAJA,YACEA,kBACEA,aAA6BA;AAG/BA,iBACEA,aAA6BA,QAGnCA,C;EAEKC,YACHA,OAAOA,OAAiBA,IAAiBA,QAC3CA,C;EAEKC,gBACCA;AAAkBA;AACNA;QAAuBA;AACvCA,WACcA;AAEdA,WACEA,QAGJA;AADEA,OAAOA,gBACTA,C;;;GA3BAF,YAEEA;AA/ylCkBG;AAuvrChBC;AA18FJJ;;QAWAA,C;IAkBYK,kBAEVA,QACFA,C;IAEYC,kBAEVA;AAAeA;AA26FfA;AAAcA;AAEQA;AAAYA;AAAlCA,sEAI2BA,gBACJA;AALvBA,uBAI2BA;KAJ3BA;;AA76FAA,QACFA,C;;GAQgB7B,YAIdA,OAu4DFA,WAGsBA,cAz4DtBA,C;;EA0gDK8B,YACHA,OAAOA,cAAgBA,YACzBA,C;EAEKC,gBACHA,OAAOA,cACEA,gBACXA,C;;;GANyBC,YAAOA,kBAAwBA,C;;GAK7CC,YAAOA,gCAAgDA,C;;GAkFlEC,kBAAoBA;AAIbA;AAGiBA,SACXA;AACcA,SACdA;AACNA;AACAA;;AACAA,QACPA,C;EAEKC,YACHA,OAAOA,WAAiCA,QAC1CA,C;QAEKC,gBACCA;AAAkBA;AAClBA;SAAgCA,eAClCA,OAAOA,YAaXA;KAZaA,kBACTA,OAAOA,YAWXA;KAVaA;SAA6BA,eACtCA,QASJA;KARaA,kBACTA,QAOJA;KANaA,SAA6BA,cACtCA,QAKJA;KAJaA,iBACTA,QAGJA,CADEA,QACFA,C;;;GA5BaC,YAAOA,OAAqBA,YAA0BA,C;;GAEtDA,YAAOA,OAAoBA,YAA0BA,C;;EA0F7DC,gBACOA,kBACRA,QAWJA;AAREA,0BACEA,QAOJA;AAnwHSA,mCAgwHLA,OAAOA,aAGXA;AADEA,QACFA,C;;GApBAC,WAAwBA;AACGA;;AAEAA;AAH3BA,aA1KwCL,uBACEA,uBACGA;AAwK7CK,UvBjlpCA9iB,auBslpCkC8iB,YxB9upCrBA;AwByupCbA,QAKiEA,C;;IAA/BC,YAAUA,mBAAYA,MAAKA,C;;EAmBxDC,YACSA;AAAZA,YACEA,QAcJA;AARcA;AACAA,gCACVA,QAMJA;AAJEA,KACEA,QAGJA;AADEA,QACFA,C;EAEKC,gBAC0BA,2BAC3BA,QAGJA;AADEA,OAAOA,SACTA,C;;;EA6JKC,WACCA;AAAeA;AACAA;AAAnBA,QACaA;AACXA;AACAA,QAKJA,CAHEA;AACAA;AACAA,QACFA,C;GAEMC,WAAWA,aAAQA,C;;GA+ZPC,YAChBA,cACEA,QAMJA;KAFIA,OARJA,WAUAA,C;;;;GAsoBKC,YACMA,eAuBLA,UACNA,C;EAGKC,cAIHA,WACEA;KAEAA,gBAEJA,C;GAGKC,cAYCA;;;;IAKcA;AA7iKXA,UAASA;;;;;;;;;AAojKdA,wDAxB0BA,OA4BxBA;IAEYA,mBA9BYA,WAiCGA;AAC7BA,gCAlC0BA,yBAsC1BA;KAGAA;;AACiDA;uDAErDA,C;GAKKC,wBAEHA;MACEA;;AAhiCyDA;;AAmiCzDA,MAkCJA,CAhCOA,iBACHA;;AACmDA,mDAAWA;;AAC9DA,MA6BJA,CA1BEA,WACOA,wBACHA;;AAEOA;;AACPA,MAqBNA,CAfmBA;kBxBjxrCXC;AwB4rhCCD,4BAslKPA,UACaA,8BAAIA;AAAJA;AACNA,eACQA,QA1mKRA;AA4mKIA,+CAAKA,gBA5mKTA;;AAQQA;AACfA,sBAwmKYA,iBAEVA,kBAEJA,C;;GAhIEE,cAASA;AACPA;AAmIFA,0BAEIA;AACAA;6BAKAA;QAEAA,SA3IEA;AACJA;IAKsBA,mBALtBA;AAUgBA;AAiBlBA,MA31hBSJ;AAATA,WAEEA,sBA41hBAI;AAnBIA;AACAA,cAEFA,WAAmBA;AACnBA,IAEJA,C;;;;;Ic/osCJC,kBACEA;;AACoBA;AAESA,IAAVA,OAAUA,OAAcA;AvCmqCnCC;AuClqCRD,OAAOA,OACTA,C;GA+YKE,gBAAeA;;AAOdA,QAQNA,WAfoBA,OAclBA,QACFA,C;GAQOC,2DAEHA,WAGJA;AADEA,MACFA,C;IAOQC,YAINA;2EACEA,QAyBJA;AAvBQA;AAANA,WACEA,UAsBJA;AApBMA,WACFA,QAmBJA;AAjBEA,YACEA,QAgBJA;AAdEA,YACEA,OAAkBA,MAatBA;AAXEA,YACEA,OAAOA,0BAA2CA,WAUtDA;AAFEA,OAAOA,yBAC0BA,SAFtBA,QAGbA,C;GAEOC,gBACSA;AACdA,YACYA;AACVA,YAEFA,QACFA,C;IAIOC,YACLA;wEAIEA,QAaJA;KAZkCA,gCAC9BA,QAWJA;KAVoCA,sCAChCA,QASJA;KARSA,sBAE0CA;AL1O3CC,uBtBrHmDD;KsBuH/CC;AAFRA,KAGEA,KAAUA;AKuOZD,O3BlWFA,c2BwWFA,MALkDA,0BAC9CA,UAIJA;KAFIA,OAAOA,OAEXA,C;GAEOE,YACLA,wBACEA,OAAOA,OACAA,OAA4BA,WAQvCA;AANEA,sBACEA,OAAOA,OACAA,OAA4BA,WAIvCA;AAFEA,OAAOA,OACAA,OAA4BA,WACrCA,C;GAEOC,gBACWA;AAQhBA,oCACcA;AACZA,YAEFA,QACFA,C;;QArXmBC,cACfA,4CACEA,UAAUA;AAEZA,OAAOA,eACTA,C;GAeQC,YAAYA,QAACA,C;EAEPC,cAAEA,mBAC0DA;AAAtEA,qCAAsEA,C;EAuCnEC,YAAQA;;AAEXA,QAIJA,UANeA;AAIEA;AAAbA,QAEJA,E;GAQQC,cACNA;AAMIA;AAG0BA,oBrCgDhCzkB,WqChDmDykB,QtCxGtCA;AsCkGXA,OAAOA,qBAOTA,C;;GAxHOC,YAwBLA,OArBQA,SbqINA,yBahHaA,KACjBA,C;;IAtBEC,YACEA;AAAIA;WACFA,OAAOA,QAiBXA;AAfQA;AAANA,YAEyBA;AAAvBA;AACAA,UAAkBA,QAAlBA;AAC6CA,aAASA,UAEtDA,QASJA,MARSA,YAEkBA;AAAvBA;AACAA,QAAqBA;AACrBA,QAIJA,MAFIA,OAAOA,OAEXA,C;;;GAkJFC,YAC6CA;AAA3CA,KACEA,UAAUA,QAA2BA,yBAEzCA,C;EAmBWC,cAGoBA,sCAC3BA;AAEFA,OAAYA,YACdA,C;GAWQC,YAEFA;AAEJA,kCACEA,QAGJA;AADEA,UAAUA,2BACZA,C;;;;;GAuHoDC,+GAGhCA;AAAhBA,OAA4BA;AAC5BA,QACDA,C;;GAI8BA,YAAOA,oBAA2BA,C;;GAqC9BC,YAAOA,OAtP5CA,WAsPqEA,C;;GAIhCA,YAAOA,OA5N5CA,kBA4NkEA,C;;GAG/BA,YAAOA,OA9e1CA,UA8eiEA,C;;ICgwE7DC,cACGA,YACPA,C;EAEiBC,kBAEfA;Af+ujCqD/F;AAsMrDC,OAxFQD;AAwFRE,OAVQF;AAURgG,OA+MEA;AA4uCJC,WAxmDAF;Ae9vjCmCA;;AAApBA;AAAKA;Af8tNUA;Ae1tNRA;Af42kBtB5G;Ae52kB4B4G;KAC1BA,wBACEA;AAEFA,QACFA,C;IAqVyBG,YAAYA,Ofu1+BrCzF,8Bev1+BiEyF,C;;;GC1tGnEC,WACMA;mBADNA,cACMA;;AAA8CA,OAAlCA;AACqCA,OAArCA;AAELA,OADMA;AhB8hlCJA;AgBvhlCbA,OAAgBA,qBAA8BA,KAACA;AACjDA;AAVMA,wBAUNA,C;GAEKC,gBACCA;AAAMA;AvC4YVC,auC5YwCD,YxCuM3BA,WwCvM6CA;AACjDA,KAATA,0BACFA,C;IAEOE,cACLA,gBA0CFA,C,CA3COC,gC;GAAAD,gBACLA;mBADKA,gBACLA;kDACEA;AACAA;MJi8CqBA;;AI77CLA;YACEA;AJ47CTA;AACEA;AACJA;AAGCA;AACGA;AACJA;;;;;;;;AAMAA;;AAEgCA,sBAE9BA;KAEAA;kBAEWA;;;;AI98CGA;YAAkBA,KAAUA,6BAA5BA;OACnBA,QADOA;;;;;;AAXoCA;AAa/CA;AACoCA;AAC9BA,kBhB83ckBA,OAAsCA;AgB53cjDA,iBACHA,eAEMA,iBAAiBA,aACpBA;AAGXA,uBAEAA;AAEFA;;;;;;OAGcA,iBAAUA,wBAA4BA;AACtDA;eAAsCA,KFkL7BA,KAAYA;AEjLHA;AAC2BA;AAApCA,KAATA,+BAA6CA,mDACfA,sDACEA,wDACDA,4DACKA,4DACJA,2DACDA,4DACDA,2DACOA;OA1ChCA;;AACLA,wBADKA,C;;GAdsBE,YAAIA;AAC7BA;AACiBA;AACKA;AADtBA;AAEAA,MACDA,C;;GAKuCC,YAAOA,cAASA,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6B1CkC7CC,kBACTA,0BADSA,C,WA2IPC,kBAA6BA,iBAA7BA,C,WC49C0BC,kBAC1BA,IAAeA;0CADWA,C,WAKAC,kBAC1BA,IAAeA;0CADWA,C,WAKAC,kBAC1BA,IAAeA,WADWA,C,WAKAC,kBAC1BA,IA+N2BA;iEAhODA,C,WAKAC,kBAC1BA,IAAeA,aADWA,C,WAKAC,kBAC1BA,IAoO2BA;qEArODA,C,WAKAC,kBAC1BA,IAAeA,WADWA,C,WAKAC,kBAC1BA,IAsP2BA,2DAvPDA,C,WAKAC,kBAC1BA,IAAeA,aADWA,C,WAKAC,kBAC1BA,IA0P2BA,+DA3PDA,C,WmBlrDRC,kBAClBA,MADkBA,C,WQ+PbC,oB,WfiaWC,kBAAuBA,8BPxVzC5kB,MOwVkB4kB,C,WaqrkCKC,kBAAuBA,guBAAvBA,C,WAiYUC,kBAAuBA,cAAvBA,C,Wc/omCtBC,kBAAUA,UAAVA,C,WA+ZFC,kBACTA,yBADSA,C,WAyCPC,mD,WEpiBAC,kBAAqBA,OAAOA,aAA5BA,C,WACAC,kBAAWA,OAASA,yBAApBA,C",
-  "x_org_dartlang_dart2js": {
-    "minified_names": {
-      "global": "b3,644,d5,123,i8,645,aK,646,q,647,f,648,j,129,aT,615,cQ,245,hm,246,cP,247,cO,248,d_,250,cW,242,cx,649,a9,650,i,651,hG,652,ar,618,e5,653,e6,654,ca,655,c,105,Z,102,ah,107,da,106,bf,656,b,83,af,104,F,431,a8,657,dS,658,d,659,ab,660,ew,661,a0,130,bs,138,aq,662,N,136,ai,80,e,101,hx,137,a,663,hQ,224,e1,664,b5,665,bR,666,eS,316,x,314,P,667,t,134,v,668,a1,140,bj,669,aG,666,aF,670,by,128,dM,671,b4,672,br,347,cn,673,c2,674,az,646,dZ,440,aW,675,bE,108,G,646,dI,450,ce,676,M,225,hX,100,fU,677,p,109,O,110,b1,678,cG,679,ig,680,ba,646,ch,646,eW,681,cm,682,o,683,D,684,eU,685,cq,686,aI,687,es,180,e9,182,hn,249,ho,688,hp,688,I,689,hB,251,bw,125,d3,124,cV,147,y,146,ia,148,al,690,d1,144,fk,691,fl,692,X,262,V,693,aN,258,fv,694,fu,695,ft,696,aL,697,aw,698,cY,260,hD,261,fw,699,cX,259,fs,700,hC,701,hE,255,W,702,cZ,254,ae,703,ad,704,cv,705,bq,706,hz,252,f6,707,f8,708,at,115,f7,709,h_,646,fZ,267,h0,710,aJ,646,eY,444,fa,711,i3,113,fj,712,f9,713,fO,714,fN,715,bA,716,i1,155,cs,646,i7,150,d4,717,aO,718,aS,719,d0,720,aU,153,d8,152,bB,0,R,721,eV,446,i2,156,hY,157,d9,722,i9,154,Y,158,hZ,723,i_,723,i0,723,f2,724,fW,725,ac,646,bg,448,ag,141,cy,726,fo,727,fp,727,fq,727,bD,256,f3,728,f4,729,dH,730,hT,81,bU,731,aZ,732,r,733,ck,646,eO,734,aY,735,B,736,bW,737,dG,738,dE,739,a5,740,ax,741,bT,742,dF,743,eL,646,eK,197,eI,173,hw,618,bo,616,cc,744,hd,745,he,746,h7,747,ha,748,h6,749,h9,750,h8,751,hf,752,hg,753,h3,754,dV,755,S,756,id,142,cj,757,hs,508,ay,758,ea,759,bt,596,J,760,hA,397,b2,646,aM,398,fE,761,aE,762,ei,763,bb,764,fF,765,e_,766,hy,348,U,767,ef,218,T,111,eZ,768,h5,769,dT,456,ap,770,aC,771,cR,594,d6,79,cr,772,bQ,646,b_,773,eF,774,dN,775,eD,776,ak,777,ez,778,eA,779,eC,780,eE,781,eB,782,dO,783,L,784,bS,785,cb,786,c3,787,m,788,ct,789,cu,790,ht,791,cT,593,hu,791,hq,588,bn,590,ex,792,cS,592,u,793,hS,132,ev,794,ci,795,ey,796,e4,797,bi,798,cf,646,ep,799,eo,442,aH,798,b9,800,dK,801,cU,591,aa,802,cB,646,cH,646,fV,803,cN,804,cg,805,w,806,cd,771,fX,575,aB,646,fY,807,fS,808,fT,808,bk,809,k,810,bz,133,f1,811,fG,812,bm,813,fH,814,fI,368,fQ,815,bl,559,eg,816,dP,817,dQ,818,a6,819,c5,820,e0,821,c0,822,c_,823,H,824,b0,825,aX,826,hi,827,a7,828,ff,829,cp,830,eq,831,cl,832,bh,833,er,834,hP,500,hH,835,bp,597,hI,835,hJ,835,b7,836,b8,837,eb,838,fC,839,bZ,840,el,841,bd,67,ao,842,ek,646,l,843,fc,844,fA,813,d7,111,cA,845,cz,846,fy,847,fz,848,fe,849,Q,850,fd,851,dX,852,dW,853,f5,854,dY,855,fn,856,fr,857,fm,858,bV,646,dD,195,hF,126,ic,135,cL,859,cI,860,cK,861,hb,862,hc,863,cM,864,eG,865,eH,866,hh,867,hr,226,hO,103,eJ,646,e7,868,e8,869,cJ,870,h4,871,ee,872,hR,112,hv,873,as,874,fi,875,hK,509,fh,557,fP,338,ib,122,ip,876,n,877,e2,878,c8,879,b6,880,eu,881,an,882,am,883,io,884,bC,885,c9,886,c7,887,e3,888,aA,889,c1,890,dJ,891,dL,892,iE,893,iF,894,iG,895,iH,896,iK,897,iL,898,iJ,899,iI,900,iN,901,iM,902,co,903,en,904,be,905,aP,906,em,907,K,908,is,909,it,910,iu,911,iv,912,iw,913,ix,914,iy,915,cw,916,eP,917,eQ,918,eR,919,hj,920,fM,921,fx,922,fB,923,eh,924,aD,925,bc,926,h1,927,ej,928,eX,929,eN,930,eM,931,bX,932,bY,933,dR,934,ec,935,ed,936,f_,937,f0,938,et,939,c6,940,iY,941,C,942,ih,943,ii,944,ij,945,il,946,im,947,dU,948,ir,949,iz,950,iA,951,eT,952,iC,953,iD,954,iX,955,fb,956,fg,957,iT,958,iU,959,c4,960,fR,570,cC,961,cD,962,cE,963,cF,964,fJ,965,h2,966,fK,967,fL,968,hk,969,hl,970,fD,971,aR,1,i4,82,bu,121,ie,127,j6,131,j3,145,j5,149,iP,972,iQ,973,iR,974,j1,253,iB,646,iV,975,iW,976,ik,622,iq,623,iO,977,j2,635,j4,639,iS,640,iZ,641,j0,642,j_,643,bL,642,aV,622,aj,635,db,893,dc,894,dd,895,de,896,dh,897,di,898,dg,899,df,900,dk,901,dj,902,bG,977,bF,623,bK,643,bJ,641,bI,959,dl,958,bH,640,dm,941,dn,639,du,978,z,979,hU,980,dC,981,a_,982,a4,983,h,984,a3,985,aQ,986,E,987,bx,988,av,989,d2,990,hL,991,hM,992,hN,993,bP,994,ds,995,dx,996,dy,997,dw,998,bO,999,a2,1000,au,1001,i6,1002,dr,1003,i5,1004,dz,1005,dA,1006,hV,1007,hW,1008,bN,1009,dv,1010,dt,1011,dB,1012,dq,1013,bM,1014,dp,1015,bv,1016,A,1017",
-      "instance": "aV,1018,aX,1019,aU,1020,b1,646,b0,646,aT,1021,a1,1022,aY,1020,aZ,1023,aW,1020,b_,646,bv,1022,aR,1024,h,1020,be,1025,aC,1026,bN,1027,bG,1028,aN,1029,bD,1030,aM,1031,bI,1032,t,1033,b5,1034,bm,1035,aa,1036,bK,1037,bf,1038,bd,1039,l,1040,n,1041,bn,1042,ba,1043,aJ,1044,W,1045,bC,1030,ac,1021,I,1046,bB,1047,aB,1048,X,1049,H,1023,aK,1050,bL,1044,bi,1051,J,1052,b8,1053,aE,1054,b7,1055,bX,1046,aq,1056,ar,1057,bY,1022,az,1058,au,1059,bc,1060,ad,1061,F,1062,u,1063,R,1064,ak,1065,b9,1066,ay,1067,al,1068,a2,1069,a5,1070,ax,1071,bg,1072,U,1073,by,1074,bp,1075,ae,1018,bF,1076,bZ,1028,aH,1077,a4,1078,b4,1079,v,1080,bq,1081,V,1082,bE,1083,an,1084,ao,1085,a7,1086,Z,1087,a6,1088,O,1089,bP,1061,bk,1090,bA,1091,at,1092,am,1093,m,1094,ah,1095,N,1096,bQ,1097,L,1098,p,1099,S,1067,bj,1100,b3,1101,bx,1102,av,1103,ap,1104,B,1105,bO,1106,bl,1107,T,1108,aQ,1073,ab,1109,b2,1110,M,1111,aw,1112,aD,1113,bo,1075,bt,1114,bT,1115,a0,1116,bJ,1117,j,1118,b6,1119,bs,1067,aj,1120,aL,1087,bh,1121,P,1122,bz,1123,bu,1114,aG,1124,Y,1125,ai,1111,bS,1126,br,1046,A,1022,q,1127,a3,1128,G,1129,as,1130,w,1131,aA,1132,bw,1102,bR,1097,a9,1133,bb,1134,C,1135,aI,1032,aS,1136,a8,1137,a_,1116,bH,1138,aF,1139,bM,1027,E,1140,af,1141,i,1142,D,1143,bW,1144,bV,1145,bU,1146,ag,1147,aO,1148,aP,1149,K,1150"
-    },
-    "frames": "iqTAiKoB+nCyB;0NA+BhBCqE;6IA8I8BCW;swBEnN9BC+C;yBA+GAAyC;8DAwBW5fc;yhBAwUiB6fe;yBAcE7fsB;2lCIrkBvB8f8B;okEHu2B4B9fsB;wBAEFA6B;wDA31BHA8B;mEA8IUAiB;0RA4LVAS;oIAPjBAmB;QAEF+fmB;scAkEmB/fS;+CAGU+fiB;+rCFkPrBCK;wtCAuaUriCAAxzBpBqiBqC,A;6zBA8tCmBoB0B;iLAqBjBqG0C;+BAOEAwC;QAIJrGwB;yBASAAuB;kCAqCcpBa;qvCAkjBfAmC;yFAKKAU;0EAWaA4E;yHASbAU;kFAmCmBAW;4DAGtBAW;6VA4DFAAWjtE8BAgE,A;gXX81E1BAgD;AAEAA4I;qgDA0M+BigByC;6NAYXAyC;s5BAkGAAyC;AACIC6C;k6BAuhBbCe;2BAElBCmB;+CAqFoBDU;oFA2DjBngBY;kNUltGNngBmC;8CAYYAmC;iQA8CPwgCkC;4rCAyJiBrgBe;8CAExBsgBAEqNACQ,A;oWFvGKC8B;gKAiBWCqBARACAVoMCVyC,A,A;iPU1GfngCK;YAAAAiB;idAmMU8gCuD;sUAgCAAuD;mKAoBPHqB;4pDGvkBEv/BAA2BT2/B+G,A;iIAZS3/BAAYT2/B+G,A;swCAsKgBp/B4D;shBC9QHwee;yEA8B+B2YAb6aZ3YsB,A;6ND/Of6gBK;8PASDCAejUJ9gByB,A;uGfmUA+gBkB;OAGC/gBoB;4OA4DAghBgD;+uBAq5CAhhBmR;u7DAq+BO2fY;4FAkCC3f8C;6cetxFRAe;6UAyDEihBYA+KFCmB,A;8QA9JTC0CAOSDoB,sH;gRAmGkBlhBgB;mlBA0JlBAkBA0BbAAAAAAQ,A,A;8sFIvUQohBS;0CA0IGphBSAnCYqhBAAAACAuB4oBSthBStB9xB5BAAAjC0BwhBAAAAxhB+B,A,A,A,A,A,A;qRDoTPAwB;AACrByhBY;glBE7QYCU;4CAYqB1hBkB;oCAIrB0hBU;oGAsBkB1hBc;mKAsD3BtYgB;iCEw6DGsYc;sbDn6BkB2hBgC;gmBHzhC1B3hBU;kkBAyLUAc;gJCpSAlXAsB+4BuCkXa,A;moBtBvxBtC4hBW;oRAmHe5hByB;QACPyb6B;kCA0EboGS;4CAQiBCS;AACLCM;uBAIZCoB;oBAIFt6BgB;iFAQEm6BS;wFAeiBCS;AACLCM;uBAIZCoB;kCAIFt6BgB;+RA6FA+5BkB;8CAkBFQAA/KACS,AAAoBliBqB,A;sFAoMpBmiBS;oBACAz6BgB;qFASIy6BS;oBACAz6BgB;iFAeJy6BS;oBACAz6BgB;4DA3HAy6BU;iIAkCkBLM;iBAIhBEgB;oBAIAIY;sFA6FuBCU;kBAGYnkBM;6BACxBokBsB;sFA6BcCM;mCACFXY;uBACGD6B;uDAGfWsB;OAMWtGM;0BAsEPwGM;uKAwBKCwB;AACZTgB;4CAaISwB;mBAEVhBiB;AAGASY;wKA7RAQM;0PA2FFCQA/BFlBiB,Q;+LA+HyBmByB;wHAKY5iBkB;+BAMmB+hBiC;AAC3BMyB;AACqBnkBY;mLAiBnB2kBuC;2BAEI7iBkB;yKAcN9Ba;uDAGQ8BkB;2EGuPXAAH3rBHgcM,A;MG6rBlB8GmB;4BAFqB9iBkB;gTD8MZAa;oDAEd+iB+B;8HAkMETyB;mHAYAAyB;qtCI/wBuCxBAXte/B9gBoB,A;2BW8eC8gBAX9eD9gBmB,A;+BW6oCOAiB;8LCr8BXgjBmB;yFAsBoBhjBc;2BAGxBgjBkC;4CAKF1CAfuRACe,A;AetROjJS;qlCE3PUtXmB;mBAGfsgBAjB8gBFCiB,A;gCiBngBEDAjBmgBFCyB,A;iDiB7fOjJS;sGHuCItXe;kqBAkETijBuCAOSCAA+NuBEoB,A,mI;4nBAhCvBFAAgCuBEkB,A;2PAiEvBpjBW;uRA6zBAA4BAwXbAAAAAAW,A,A;wPA9VeihBiB;4gBA0JiBjhBc;+EAS9BqjByB;+kBvBl4C8BrjBwB;iEA0IUAc;+I0B/JlCsgBe;gBAGFAc;AACAAAjBsgBJCW,A;AiBrgBIDW;mWA2TuBrCAd3ShBjeY,U;wBc6SQsXY;kICtObtXiB;gcClBKA+B;gGAiCPsjBS;yNAiBiCrFa;OAAAAAhBvG1BjeY,U;QgBwGAAc;6vBA8LkB2YA9ByPC3YyB,A;wL+BpcFoda;8SChEDmGkB;6DAcZCmC;yJA4CFC8B;0jCrBuFK9DW;oHA+SZ3f4B;+NAmHFsgBgB;AACAAAA1FJCW,A;8PsBEuBmDY;OACDCY;OACACY;OACACY;OACECY;OACACY;OACCCoD;61DtBqEHhkBe;oEAIlBsgBAAjFJCQ,A;wnEuB5V6CvgBiB;4FAwJnBAQ;8TAuRfikBwC;4cvBvkBmBtEc;4VAuhBjBuEO;0BAGFAO;oBAGEAU;qRyBmjEICiCAObCmB,4BAIFCuD,AAEF/De,qF;gPAeIgEmB;AAAkBAgB;uCAElBCmB;AAAqBAgB;4SzBh+DQCAIvlBcCsD,A;mBJ8lBnCCgB;wHAKRCAAjKaC8F,A;mXyB2+CVCgE;CAAAA8C;6QA6EU7kBe;sCAuBVsXM;mRAkPQwNApC5yDOCW,A;gcoCg2DXAW;2CAA4CAuB;siBAvTrDzEW;AAAiB0EoB;0BAEf1EAzBrkDJCU,A;AyBskDIDS;AAAiB0EoB;+QZ2qTL5NAtBhmX6BpXW,A;AsBgmX7BilBAAmoTLjlBW,A;mTA7kJSAAiB5jgBKAAtBrvBvBAAAtB0BwhBAAAAxhBqB,A,A,kB,A;4CKq2hBxB8iBc;kBAkBAAe;oyDA35JoC9iBW;6GA2pBVklBAAw+vBuBCiB,cAyBvDDAAAAAAACEEAAoFArHO,Y,AAnFAsHAAiKAtHO,4B,A,A,A;mBA/pwB4B/d8B;yWAmCxBslBAAwBDCgF,A;+eAg1CgCCAAo8oBxBxlB8B,A;+yEAltaEwd+B;2RAwGiC7EAA47bnC3YuB,A;+qCAhkQQAoC;sBACVilBAA10LEjlBW,A;IA00LiBilBAA10LjBjlBY,A;6KA05LQA6B;mDAIdilBAA95LMjlBa,A;qBAg6LOilBAAh6LPjlBa,A;gCAi6LFilBAAj6LEjlBW,A;IAi6LeilBAAj6LfjlBY,A;8KAy9LQA6B;mDAIdilBAA79LMjlBa,A;gCA+9LFilBAA/9LEjlBW,A;IA+9LmBilBAA/9LnBjlBY,A;k8BA8xXOqXmB;keAogDhBoO6B;gFAxDJzlBAAAAAO,A;0cA+mBsDAAA27F3BAAAea0lBAAAA1lB8B,A,8B,A;cA38FxCAQ;4GAoCiBqYqL;2EAaJrYyB;i8BAgtDCqXmC;qHAdRrXAA5KkC2lBuB,AACECuB,AACGC6B,A;AA2E7C7lBU;AAkGcsZAxB9upCDtZa,A;YwB8upCCsZuB;2jBAwnBCtZW;iOAksBFqX4f;+XAmCFyOkH;+WAqBQCAxBrxrCJCW,A;AwBsxrCMxI4B;uEAGgBnG2B;+DAEXA8E;AACpBkGwC;gGAvHF0I8F;+EAaICMAkBJ3IgD,iB;2ScrpsCyB4IA3BvCrBCAAKYEY,A,A;m8B2B4gBPCAL3ObCAtBvHAAuB,A,UsBuHAAAtBvHAAiE,A,A;O2BkWaDc;wvBA5P6BjNAtCxG7BtZW,A;QsCwG6BsZyB;kEAtHZtZyB;46BA6XkBymBW;2CAIAAkB;2CAGFAU;yKCwwExBvBAf6ujCiCCiB,AAyBvDDAAAAAAACEEAAoFArHO,Y,AAnFAsHAAiKAtHO,Q,A,A,A;Aez6jCiD2IAfk2jCjD3IO,AAAQ/dY,A;Aeh2jCcAAfuwmChBAW,A;AezwmCcklBa;4EAUEllB6B;WAEFilBAfshlBTjlBa,A;0Fe5rkBwBwlBAfmv+BxBxlB8B,A;mtDgBz8kCF8iB+B;kMAUD1LAxCuMGpXa,A;YwCvMHoXW;maAaApXa;+CAAAA6V;kNAOS2mBgB;gQAgBgCCwB;o4ZzCqnDhCC0G;qFAUAC8G;mFAUACuD;qFAUAC2D;"
-  }
-}
diff --git a/build_runner/lib/src/watcher/graph_watcher.dart b/build_runner/lib/src/watcher/graph_watcher.dart
index 6a1d134..db54ff1 100644
--- a/build_runner/lib/src/watcher/graph_watcher.dart
+++ b/build_runner/lib/src/watcher/graph_watcher.dart
@@ -21,8 +21,8 @@
   final PackageNodeWatcher Function(PackageNode) _strategy;
   final PackageGraph _graph;
 
-  final _readyCompleter = Completer<Null>();
-  Future<Null> get ready => _readyCompleter.future;
+  final _readyCompleter = Completer<void>();
+  Future<void> get ready => _readyCompleter.future;
 
   bool _isWatching = false;
 
diff --git a/build_runner/mono_pkg.yaml b/build_runner/mono_pkg.yaml
index 2f956d2..cebfcb2 100644
--- a/build_runner/mono_pkg.yaml
+++ b/build_runner/mono_pkg.yaml
@@ -6,9 +6,6 @@
     - group:
       - dartfmt: sdk
       - dartanalyzer: --fatal-infos --fatal-warnings .
-    - dartanalyzer: --fatal-warnings .
-      dart:
-        - 2.1.0
   - unit_test:
     - test: -x integration
   - e2e_test:
diff --git a/build_runner/pubspec.yaml b/build_runner/pubspec.yaml
index 75ea89c..a134c88 100644
--- a/build_runner/pubspec.yaml
+++ b/build_runner/pubspec.yaml
@@ -1,18 +1,18 @@
 name: build_runner
-version: 1.3.3
+version: 1.4.0
 description: Tools to write binaries that run builders.
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/build/tree/master/build_runner
 
 environment:
-  sdk: ">=2.0.0 <3.0.0"
+  sdk: ">=2.3.0-dev.0.1 <3.0.0"
 
 dependencies:
   args: ">=1.4.0 <2.0.0"
   async: ">=1.13.3 <3.0.0"
   build: ">=1.0.0 <1.2.0"
-  build_config: ^0.3.1
-  build_daemon: ^0.5.0
+  build_config: ">=0.4.0 <0.4.1"
+  build_daemon: ^0.6.0
   build_resolvers: "^1.0.0"
   build_runner_core: ^3.0.0
   code_builder: ">2.3.0 <4.0.0"
@@ -43,8 +43,7 @@
 
 dev_dependencies:
   build_test: ^0.10.0
-  build_modules: '>=0.4.0 <2.0.0'
-  build_web_compilers: ^1.0.0
+  build_web_compilers: ^2.0.0
   mockito: ^4.0.0
   package_resolver: ^1.0.2
   stream_channel: ">=1.6.0 <3.0.0"
diff --git a/build_runner/tool/build.dart b/build_runner/tool/build.dart
deleted file mode 100644
index 45bcdc3..0000000
--- a/build_runner/tool/build.dart
+++ /dev/null
@@ -1,41 +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:build/build.dart';
-import 'package:build_config/build_config.dart';
-import 'package:build_modules/builders.dart';
-import 'package:build_runner/build_runner.dart';
-import 'package:build_runner_core/build_runner_core.dart';
-import 'package:build_web_compilers/builders.dart';
-
-main(List<String> args) async {
-  await run(args, [
-    apply(
-        'build_modules|dart2js',
-        [
-          moduleLibraryBuilder,
-          metaModuleBuilderFactoryForPlatform('dart2js'),
-          metaModuleCleanBuilderFactoryForPlatform('dart2js'),
-          moduleBuilderFactoryForPlatform('dart2js'),
-        ],
-        toAllPackages(),
-        isOptional: true,
-        hideOutput: true),
-    apply(
-        'build_web_compilers|entrypoint',
-        [
-          (_) => webEntrypointBuilder(BuilderOptions({
-                'compiler': 'dart2js',
-                'dart2js_args': ['--minify', '--omit-implicit-checks']
-              }))
-        ],
-        toAllPackages(),
-        isOptional: false,
-        hideOutput: false,
-        defaultGenerateFor: InputSet(include: [
-          'lib/src/server/graph_viz_main.dart',
-          'lib/src/server/build_updates_client/hot_reload_client.dart',
-        ])),
-  ]);
-}
diff --git a/build_runner/tool/builders.dart b/build_runner/tool/builders.dart
new file mode 100644
index 0000000..65cfe03
--- /dev/null
+++ b/build_runner/tool/builders.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.
+
+import 'package:build/build.dart';
+
+Builder copyCompiledJs(_) => _CopyBuilder();
+
+/// A Builder to copy compiled dart2js output to source.
+class _CopyBuilder extends Builder {
+  @override
+  final buildExtensions = {
+    'web/graph_viz_main.dart.js': ['lib/src/server/graph_viz_main.dart.js'],
+    'web/hot_reload_client.dart.js': [
+      'lib/src/server/build_updates_client/hot_reload_client.dart.js'
+    ]
+  };
+
+  @override
+  void build(BuildStep buildStep) {
+    if (!buildExtensions.containsKey(buildStep.inputId.path)) {
+      throw StateError('Unexpected input for `CopyBuilder` '
+          'expected only ${buildExtensions.keys}');
+    }
+    buildStep.writeAsString(
+        AssetId(buildStep.inputId.package,
+            buildExtensions[buildStep.inputId.path].single),
+        buildStep.readAsString(buildStep.inputId));
+  }
+}
diff --git a/build_runner/lib/src/server/graph_viz_main.dart b/build_runner/web/graph_viz_main.dart
similarity index 100%
rename from build_runner/lib/src/server/graph_viz_main.dart
rename to build_runner/web/graph_viz_main.dart
diff --git a/build_runner/lib/src/server/build_updates_client/hot_reload_client.dart b/build_runner/web/hot_reload_client.dart
similarity index 95%
rename from build_runner/lib/src/server/build_updates_client/hot_reload_client.dart
rename to build_runner/web/hot_reload_client.dart
index a2b6e8b..79b89ff 100644
--- a/build_runner/lib/src/server/build_updates_client/hot_reload_client.dart
+++ b/build_runner/web/hot_reload_client.dart
@@ -12,9 +12,9 @@
 import 'package:js/js.dart';
 import 'package:js/js_util.dart';
 
-import 'module.dart';
-import 'reload_handler.dart';
-import 'reloading_manager.dart';
+import 'package:build_runner/src/server/build_updates_client/module.dart';
+import 'package:build_runner/src/server/build_updates_client/reload_handler.dart';
+import 'package:build_runner/src/server/build_updates_client/reloading_manager.dart';
 
 final _assetsDigestPath = r'$assetDigests';
 final _buildUpdatesProtocol = r'$buildUpdates';
diff --git a/build_runner_core/BUILD.gn b/build_runner_core/BUILD.gn
index 85a1411..49b2465 100644
--- a/build_runner_core/BUILD.gn
+++ b/build_runner_core/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for build_runner_core-3.0.3
+# This file is generated by importer.py for build_runner_core-3.0.4
 
 import("//build/dart/dart_library.gni")
 
diff --git a/build_runner_core/CHANGELOG.md b/build_runner_core/CHANGELOG.md
index 103798b..2b43001 100644
--- a/build_runner_core/CHANGELOG.md
+++ b/build_runner_core/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 3.0.4
+
+- Add additional error details and a fallback for
+  https://github.com/dart-lang/build/issues/1804
+
 ## 3.0.3
 
 - Share an asset graph when building regardless of whether the build script was
diff --git a/build_runner_core/lib/src/asset_graph/graph.dart b/build_runner_core/lib/src/asset_graph/graph.dart
index a5d7dba..db95a57 100644
--- a/build_runner_core/lib/src/asset_graph/graph.dart
+++ b/build_runner_core/lib/src/asset_graph/graph.dart
@@ -150,7 +150,7 @@
 
   /// Uses [digestReader] to compute the [Digest] for [nodes] and set the
   /// `lastKnownDigest` field.
-  Future<Null> _setLastKnownDigests(
+  Future<void> _setLastKnownDigests(
       Iterable<AssetNode> nodes, AssetReader digestReader) async {
     await Future.wait(nodes.map((node) async {
       node.lastKnownDigest = await digestReader.digest(node.id);
diff --git a/build_runner_core/lib/src/asset_graph/serialization.dart b/build_runner_core/lib/src/asset_graph/serialization.dart
index d6c0c00..dbc8bb6 100644
--- a/build_runner_core/lib/src/asset_graph/serialization.dart
+++ b/build_runner_core/lib/src/asset_graph/serialization.dart
@@ -62,8 +62,21 @@
       if (node is BuilderOptionsAssetNode) continue;
 
       for (var output in node.outputs) {
+        if (output == null) {
+          log.severe('Found a null output from ${node.id} which is a '
+              '${node.runtimeType}. If you encounter this error please copy '
+              'the details from this message and add them to '
+              'https://github.com/dart-lang/build/issues/1804.');
+          throw AssetGraphCorruptedException();
+        }
         var inputsNode = graph.get(output) as NodeWithInputs;
-        assert(inputsNode != null, 'Asset Graph is missing $output');
+        if (inputsNode == null) {
+          log.severe('Failed to locate $output referenced from ${node.id} '
+              'which is a ${node.runtimeType}. If you encounter this error '
+              'please copy the details from this message and add them to '
+              'https://github.com/dart-lang/build/issues/1804.');
+          throw AssetGraphCorruptedException();
+        }
         inputsNode.inputs ??= HashSet<AssetId>();
         inputsNode.inputs.add(node.id);
       }
@@ -220,6 +233,19 @@
       return _WrappedAssetNode(node, this);
     }
   }
+
+  int findAssetIndex(AssetId id,
+      {@required AssetId from, @required String field}) {
+    final index = _assetIdToId[id];
+    if (index == null) {
+      log.severe('The $field field in $from references a non-existent asset '
+          '$id and will corrupt the asset graph. '
+          'If you encounter this error please copy '
+          'the details from this message and add them to '
+          'https://github.com/dart-lang/build/issues/1804.');
+    }
+    return index;
+  }
 }
 
 /// Used to serialize the type of a node using an int.
@@ -315,20 +341,23 @@
         }
         break;
       case _AssetField.Id:
-        return serializer._assetIdToId[node.id];
+        return serializer.findAssetIndex(node.id, from: node.id, field: 'id');
       case _AssetField.Outputs:
         return node.outputs
-            .map((id) => serializer._assetIdToId[id])
+            .map((id) =>
+                serializer.findAssetIndex(id, from: node.id, field: 'outputs'))
             .toList(growable: false);
       case _AssetField.PrimaryOutputs:
         return node.primaryOutputs
-            .map((id) => serializer._assetIdToId[id])
+            .map((id) => serializer.findAssetIndex(id,
+                from: node.id, field: 'primaryOutputs'))
             .toList(growable: false);
       case _AssetField.Digest:
         return _serializeDigest(node.lastKnownDigest);
       case _AssetField.DeletedBy:
         return node.deletedBy
-            .map((id) => serializer._assetIdToId[id])
+            .map((id) => serializer.findAssetIndex(id,
+                from: node.id, field: 'deletedBy'))
             .toList(growable: false);
       default:
         throw RangeError.index(index, this);
@@ -367,7 +396,8 @@
     switch (fieldId) {
       case _GeneratedField.PrimaryInput:
         return generatedNode.primaryInput != null
-            ? serializer._assetIdToId[generatedNode.primaryInput]
+            ? serializer.findAssetIndex(generatedNode.primaryInput,
+                from: generatedNode.id, field: 'primaryInput')
             : null;
       case _GeneratedField.WasOutput:
         return _serializeBool(generatedNode.wasOutput);
@@ -380,7 +410,8 @@
       case _GeneratedField.PreviousInputsDigest:
         return _serializeDigest(generatedNode.previousInputsDigest);
       case _GeneratedField.BuilderOptions:
-        return serializer._assetIdToId[generatedNode.builderOptionsId];
+        return serializer.findAssetIndex(generatedNode.builderOptionsId,
+            from: generatedNode.id, field: 'builderOptions');
       case _GeneratedField.IsHidden:
         return _serializeBool(generatedNode.isHidden);
       default:
@@ -421,7 +452,8 @@
         return globNode.glob.pattern;
       case _GlobField.Results:
         return globNode.results
-            .map((id) => serializer._assetIdToId[id])
+            .map((id) => serializer.findAssetIndex(id,
+                from: globNode.id, field: 'results'))
             .toList(growable: false);
       default:
         throw RangeError.index(index, this);
@@ -457,12 +489,14 @@
       case _PostAnchorField.ActionNumber:
         return wrappedNode.actionNumber;
       case _PostAnchorField.BuilderOptions:
-        return serializer._assetIdToId[wrappedNode.builderOptionsId];
+        return serializer.findAssetIndex(wrappedNode.builderOptionsId,
+            from: wrappedNode.id, field: 'builderOptions');
       case _PostAnchorField.PreviousInputsDigest:
         return _serializeDigest(wrappedNode.previousInputsDigest);
       case _PostAnchorField.PrimaryInput:
         return wrappedNode.primaryInput != null
-            ? serializer._assetIdToId[wrappedNode.primaryInput]
+            ? serializer.findAssetIndex(wrappedNode.primaryInput,
+                from: wrappedNode.id, field: 'primaryInput')
             : null;
       default:
         throw RangeError.index(index, this);
diff --git a/build_runner_core/lib/src/generate/build_definition.dart b/build_runner_core/lib/src/generate/build_definition.dart
index 6d45c48..ea7e6fa 100644
--- a/build_runner_core/lib/src/generate/build_definition.dart
+++ b/build_runner_core/lib/src/generate/build_definition.dart
@@ -439,7 +439,7 @@
 
   /// Handles cleanup of pre-existing outputs for initial builds (where there is
   /// no cached graph).
-  Future<Null> _initialBuildCleanup(
+  Future<void> _initialBuildCleanup(
       Set<AssetId> conflictingAssets, RunnerAssetWriter writer) async {
     if (conflictingAssets.isEmpty) return;
 
diff --git a/build_runner_core/lib/src/generate/build_impl.dart b/build_runner_core/lib/src/generate/build_impl.dart
index 0a9254d..2cf9736 100644
--- a/build_runner_core/lib/src/generate/build_impl.dart
+++ b/build_runner_core/lib/src/generate/build_impl.dart
@@ -72,7 +72,7 @@
   final BuildEnvironment _environment;
   final String _logPerformanceDir;
 
-  Future<Null> beforeExit() => _resourceManager.beforeExit();
+  Future<void> beforeExit() => _resourceManager.beforeExit();
 
   BuildImpl._(BuildDefinition buildDefinition, BuildOptions options,
       this._buildPhases, this._finalizedReader)
@@ -149,7 +149,7 @@
   final List<Pool> _buildPhasePool;
   final BuildEnvironment _environment;
   final _lazyPhases = <String, Future<Iterable<AssetId>>>{};
-  final _lazyGlobs = <AssetId, Future<Null>>{};
+  final _lazyGlobs = <AssetId, Future<void>>{};
   final PackageGraph _packageGraph;
   final BuildPerformanceTracker _performanceTracker;
   final AssetReader _reader;
@@ -234,7 +234,7 @@
     return result;
   }
 
-  Future<Null> _updateAssetGraph(Map<AssetId, ChangeType> updates) async {
+  Future<void> _updateAssetGraph(Map<AssetId, ChangeType> updates) async {
     await logTimedAsync(_logger, 'Updating asset graph', () async {
       var invalidated = await _assetGraph.updateAndInvalidate(
           _buildPhases, updates, _packageGraph.root.name, _delete, _reader);
@@ -764,7 +764,7 @@
   /// - Setting the `lastKnownDigest` on each output based on the new contents.
   /// - Setting the `previousInputsDigest` on each output based on the inputs.
   /// - Storing the error message with the [_failureReporter].
-  Future<Null> _setOutputsState(
+  Future<void> _setOutputsState(
       Iterable<AssetId> outputs,
       SingleStepReader reader,
       AssetWriterSpy writer,
diff --git a/build_runner_core/lib/src/generate/build_runner.dart b/build_runner_core/lib/src/generate/build_runner.dart
index d9838cc..e0b3a18 100644
--- a/build_runner_core/lib/src/generate/build_runner.dart
+++ b/build_runner_core/lib/src/generate/build_runner.dart
@@ -18,7 +18,7 @@
   final BuildImpl _build;
   BuildRunner._(this._build);
 
-  Future<Null> beforeExit() => _build.beforeExit();
+  Future<void> beforeExit() => _build.beforeExit();
 
   Future<BuildResult> run(Map<AssetId, ChangeType> updates,
           {Set<BuildDirectory> buildDirs}) =>
diff --git a/build_runner_core/lib/src/package_graph/apply_builders.dart b/build_runner_core/lib/src/package_graph/apply_builders.dart
index 57ef24f..2003a65 100644
--- a/build_runner_core/lib/src/package_graph/apply_builders.dart
+++ b/build_runner_core/lib/src/package_graph/apply_builders.dart
@@ -260,8 +260,9 @@
   final globalOptions = targetGraph.rootPackageConfig.globalOptions.map(
       (key, config) => MapEntry(
           key,
-          (config?.options ?? BuilderOptions.empty).overrideWith(
-              isReleaseMode ? config?.releaseOptions : config?.devOptions)));
+          _options(config?.options).overrideWith(isReleaseMode
+              ? _options(config?.releaseOptions)
+              : _options(config?.devOptions))));
   for (final key in builderConfigOverrides.keys) {
     final overrides = BuilderOptions(builderConfigOverrides[key]);
     globalOptions[key] =
@@ -340,10 +341,10 @@
               builderApplication, targetNode, applyWith, allBuilders))
           .map((node) {
         final builderConfig = targetConfig(node);
-        final options = (builderConfig?.options ?? BuilderOptions.empty)
+        final options = _options(builderConfig?.options)
             .overrideWith(isReleaseMode
-                ? builderConfig?.releaseOptions
-                : builderConfig?.devOptions)
+                ? _options(builderConfig?.releaseOptions)
+                : _options(builderConfig?.devOptions))
             .overrideWith(globalOptionOverrides);
         return createPhase(node.package, options, node.target.sources,
             builderConfig?.generateFor, isReleaseMode);
@@ -403,3 +404,6 @@
 String _factoryFailure(String packageName, BuilderOptions options) =>
     'Failed to instantiate builder for $packageName with configuration:\n'
     '${JsonEncoder.withIndent(' ').convert(options.config)}';
+
+BuilderOptions _options(Map<String, dynamic> options) =>
+    options?.isEmpty ?? true ? BuilderOptions.empty : BuilderOptions(options);
diff --git a/build_runner_core/pubspec.yaml b/build_runner_core/pubspec.yaml
index 3ebbf5a..59cd4d0 100644
--- a/build_runner_core/pubspec.yaml
+++ b/build_runner_core/pubspec.yaml
@@ -1,5 +1,5 @@
 name: build_runner_core
-version: 3.0.3
+version: 3.0.4
 description: Core tools to write binaries that run builders.
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/build/tree/master/build_runner_core
@@ -10,7 +10,7 @@
 dependencies:
   async: ">=1.13.3 <3.0.0"
   build: ">=1.1.0 <1.2.0"
-  build_config: ^0.3.1
+  build_config: ">=0.4.0 <0.4.1"
   build_resolvers: ^1.0.0
   collection: ^1.14.0
   convert: ^2.0.1
@@ -37,3 +37,7 @@
   test_process: ^1.0.0
   _test_common:
     path: ../_test_common
+
+    #dependency_overrides:
+    #  build_config:
+    #    path: ../build_config
diff --git a/build_test/BUILD.gn b/build_test/BUILD.gn
index 9546284..f098c96 100644
--- a/build_test/BUILD.gn
+++ b/build_test/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for build_test-0.10.7+1
+# This file is generated by importer.py for build_test-0.10.7+2
 
 import("//build/dart/dart_library.gni")
 
diff --git a/build_test/CHANGELOG.md b/build_test/CHANGELOG.md
index 9ef805f..f6287bc 100644
--- a/build_test/CHANGELOG.md
+++ b/build_test/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.10.7+2
+
+- Avoid throwing for missing files from `PackageAssetReader.canRead`.
+
 ## 0.10.7+1
 
 - Allow `build_config` `0.4.x`.
diff --git a/build_test/README.md b/build_test/README.md
index 1ecba2a..2f0ca5d 100644
--- a/build_test/README.md
+++ b/build_test/README.md
@@ -1,5 +1,3 @@
-# build_test
-
 <p align="center">
   Testing utilities for users of <a href="https://pub.dartlang.org/packages/build"><code>package:build</code></a>.
   <br>
diff --git a/build_test/lib/src/package_reader.dart b/build_test/lib/src/package_reader.dart
index a9024b5..f38d3fc 100644
--- a/build_test/lib/src/package_reader.dart
+++ b/build_test/lib/src/package_reader.dart
@@ -83,7 +83,7 @@
     if (id.package == _rootPackage) {
       return File(p.canonicalize(p.join(_rootPackagePath, id.path)));
     }
-    throw UnsupportedError('Unable to resolve $id');
+    return null;
   }
 
   String get _rootPackagePath {
@@ -125,29 +125,15 @@
   }
 
   @override
-  Future<bool> canRead(AssetId id) {
-    final file = _resolve(id);
-    if (file == null) {
-      return Future.value(false);
-    }
-    return file.exists();
-  }
+  Future<bool> canRead(AssetId id) =>
+      _resolve(id)?.exists() ?? Future.value(false);
 
   @override
-  Future<List<int>> readAsBytes(AssetId id) {
-    final file = _resolve(id);
-    if (file == null) {
-      throw ArgumentError('Could not read $id.');
-    }
-    return file.readAsBytes();
-  }
+  Future<List<int>> readAsBytes(AssetId id) =>
+      _resolve(id)?.readAsBytes() ?? (throw AssetNotFoundException(id));
 
   @override
-  Future<String> readAsString(AssetId id, {Encoding encoding = utf8}) {
-    final file = _resolve(id);
-    if (file == null) {
-      throw ArgumentError('Could not read $id.');
-    }
-    return file.readAsString(encoding: encoding);
-  }
+  Future<String> readAsString(AssetId id, {Encoding encoding = utf8}) =>
+      _resolve(id)?.readAsString(encoding: encoding) ??
+      (throw AssetNotFoundException(id));
 }
diff --git a/build_test/pubspec.yaml b/build_test/pubspec.yaml
index e58f811..f08035b 100644
--- a/build_test/pubspec.yaml
+++ b/build_test/pubspec.yaml
@@ -1,6 +1,6 @@
 name: build_test
 description: Utilities for writing unit tests of Builders.
-version: 0.10.7+1
+version: 0.10.7+2
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/build/tree/master/build_test
 
@@ -26,7 +26,7 @@
   watcher: ^0.9.7
 
 dev_dependencies:
-  analyzer: ">=0.27.1 <0.37.0"
-  build_runner: ^1.0.0
-  build_vm_compilers: ^0.1.0
+  analyzer: ">=0.35.4 <0.37.0"
+  build_runner: ^1.3.3
+  build_vm_compilers: '>=0.1.2 <2.0.0'
   collection: ^1.14.0
diff --git a/build_vm_compilers/BUILD.gn b/build_vm_compilers/BUILD.gn
index b88faf7..ef3dd62 100644
--- a/build_vm_compilers/BUILD.gn
+++ b/build_vm_compilers/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for build_vm_compilers-0.1.2
+# This file is generated by importer.py for build_vm_compilers-1.0.0
 
 import("//build/dart/dart_library.gni")
 
diff --git a/build_vm_compilers/CHANGELOG.md b/build_vm_compilers/CHANGELOG.md
index 9aceb32..de474ed 100644
--- a/build_vm_compilers/CHANGELOG.md
+++ b/build_vm_compilers/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 1.0.0
+
+- Support build_modules 2.0.0
+  - Define our own `vm` platform and builders explicitly.
+- Skip trying to compile apps that import known incompatible libraries.
+
 ## 0.1.2
 
 - Increased the upper bound for `package:analyzer` to `<0.37.0`.
diff --git a/build_vm_compilers/build.yaml b/build_vm_compilers/build.yaml
index bb089d0..4b13b98 100644
--- a/build_vm_compilers/build.yaml
+++ b/build_vm_compilers/build.yaml
@@ -1,10 +1,26 @@
 builders:
+  modules:
+    import: "package:build_vm_compilers/builders.dart"
+    builder_factories:
+      - metaModuleBuilder
+      - metaModuleCleanBuilder
+      - moduleBuilder
+    build_extensions:
+      $lib$:
+        - .vm.meta_module.raw
+        - .vm.meta_module.clean
+      .dart:
+        - .vm.module
+    is_optional: True
+    auto_apply: none
+    required_inputs: [".dart", ".module.library"]
+    applies_builders: ["build_modules|module_cleanup"]
   vm:
     import: "package:build_vm_compilers/builders.dart"
     builder_factories:
       - vmKernelModuleBuilder
     build_extensions:
-      .dart:
+      .vm.module:
         - .vm.dill
     is_optional: True
     auto_apply: all_packages
@@ -12,7 +28,7 @@
       - .dart
       - .vm.module
     applies_builders:
-      - build_modules|vm
+      - build_vm_compilers|modules
   entrypoint:
     import: "package:build_vm_compilers/builders.dart"
     builder_factories:
diff --git a/build_vm_compilers/lib/build_vm_compilers.dart b/build_vm_compilers/lib/build_vm_compilers.dart
index 1d7368b..e0ea675 100644
--- a/build_vm_compilers/lib/build_vm_compilers.dart
+++ b/build_vm_compilers/lib/build_vm_compilers.dart
@@ -2,4 +2,5 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+export 'src/platform.dart' show vmPlatform;
 export 'src/vm_entrypoint_builder.dart' show VmEntrypointBuilder;
diff --git a/build_vm_compilers/lib/builders.dart b/build_vm_compilers/lib/builders.dart
index 47ddd2d..6848a54 100644
--- a/build_vm_compilers/lib/builders.dart
+++ b/build_vm_compilers/lib/builders.dart
@@ -6,16 +6,22 @@
 import 'package:build_modules/build_modules.dart';
 import 'package:path/path.dart' as p;
 
+import 'src/platform.dart';
 import 'src/vm_entrypoint_builder.dart';
 
 const vmKernelModuleExtension = '.vm.dill';
 const vmKernelEntrypointExtension = '.vm.app.dill';
 
+Builder metaModuleBuilder(BuilderOptions options) =>
+    MetaModuleBuilder.forOptions(vmPlatform, options);
+Builder metaModuleCleanBuilder([_]) => MetaModuleCleanBuilder(vmPlatform);
+Builder moduleBuilder([_]) => ModuleBuilder(vmPlatform);
+
 Builder vmKernelModuleBuilder(_) => KernelBuilder(
       summaryOnly: false,
       sdkKernelPath: p.join('lib', '_internal', 'vm_platform_strong.dill'),
       outputExtension: vmKernelModuleExtension,
-      platform: DartPlatform.vm,
+      platform: vmPlatform,
     );
 
 Builder vmKernelEntrypointBuilder(_) => VmEntrypointBuilder();
diff --git a/build_vm_compilers/lib/src/platform.dart b/build_vm_compilers/lib/src/platform.dart
new file mode 100644
index 0000000..85bdf5c
--- /dev/null
+++ b/build_vm_compilers/lib/src/platform.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.
+
+import 'package:build_modules/build_modules.dart';
+
+final vmPlatform = DartPlatform.register('vm', [
+  'async',
+  'cli',
+  'collection',
+  'convert',
+  'core',
+  'developer',
+  'io',
+  'isolate',
+  'math',
+  'mirrors',
+  'nativewrappers',
+  'profiler',
+  'typed_data',
+  'vmservice_io',
+  '_internal',
+]);
diff --git a/build_vm_compilers/lib/src/vm_entrypoint_builder.dart b/build_vm_compilers/lib/src/vm_entrypoint_builder.dart
index 2025997..a97302e 100644
--- a/build_vm_compilers/lib/src/vm_entrypoint_builder.dart
+++ b/build_vm_compilers/lib/src/vm_entrypoint_builder.dart
@@ -12,6 +12,7 @@
 import 'package:pool/pool.dart';
 
 import '../builders.dart';
+import 'platform.dart';
 
 /// Because we hold bytes in memory we don't want to compile to many app entry
 /// points at once.
@@ -29,19 +30,38 @@
   };
 
   @override
-  Future<Null> build(BuildStep buildStep) async {
+  Future<void> build(BuildStep buildStep) async {
     await _buildPool.withResource(() async {
       var dartEntrypointId = buildStep.inputId;
       var isAppEntrypoint = await _isAppEntryPoint(dartEntrypointId, buildStep);
       if (!isAppEntrypoint) return;
 
       var moduleId =
-          buildStep.inputId.changeExtension(moduleExtension(DartPlatform.vm));
+          buildStep.inputId.changeExtension(moduleExtension(vmPlatform));
       var module = Module.fromJson(
           json.decode(await buildStep.readAsString(moduleId))
               as Map<String, dynamic>);
-      var transitiveModules =
-          await module.computeTransitiveDependencies(buildStep);
+
+      List<Module> transitiveModules;
+      try {
+        transitiveModules = await module
+            .computeTransitiveDependencies(buildStep, throwIfUnsupported: true);
+      } on UnsupportedModules catch (e) {
+        var librariesString = (await e.exactLibraries(buildStep).toList())
+            .map((lib) => AssetId(lib.id.package,
+                lib.id.path.replaceFirst(moduleLibraryExtension, '.dart')))
+            .join('\n');
+        log.warning('''
+Skipping compiling ${buildStep.inputId} for the vm because some of its
+transitive libraries have sdk dependencies that not supported on this platform:
+
+$librariesString
+
+https://github.com/dart-lang/build/blob/master/docs/faq.md#how-can-i-resolve-skipped-compiling-warnings
+''');
+        return;
+      }
+
       var transitiveKernelModules = [
         module.primarySource.changeExtension(vmKernelModuleExtension)
       ].followedBy(transitiveModules.map(
diff --git a/build_vm_compilers/mono_pkg.yaml b/build_vm_compilers/mono_pkg.yaml
index f077cc7..9bdc26f 100644
--- a/build_vm_compilers/mono_pkg.yaml
+++ b/build_vm_compilers/mono_pkg.yaml
@@ -8,6 +8,6 @@
         - dartanalyzer: --fatal-infos --fatal-warnings .
     - dartanalyzer: --fatal-warnings .
       dart:
-        - 2.1.0
+        - 2.3.0-dev.0.1
   - unit_test:
     - test
diff --git a/build_vm_compilers/pubspec.yaml b/build_vm_compilers/pubspec.yaml
index d4a7208..5a025c0 100644
--- a/build_vm_compilers/pubspec.yaml
+++ b/build_vm_compilers/pubspec.yaml
@@ -1,16 +1,16 @@
 name: build_vm_compilers
-version: 0.1.2
+version: 1.0.0
 description: Builder implementations wrapping Dart VM compilers.
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/build/tree/master/build_vm_compilers
 
 environment:
-  sdk: ">=2.1.0 <3.0.0"
+  sdk: ">=2.3.0-dev.0.1 <3.0.0"
 
 dependencies:
   analyzer: ">=0.30.0 <0.37.0"
   build: '>=0.12.0 <2.0.0'
-  build_modules: '>=0.4.0 <2.0.0'
+  build_modules: ^2.0.0
   path: ^1.6.0
   pool: ^1.3.0
 
diff --git a/built_collection/BUILD.gn b/built_collection/BUILD.gn
index 196c4de..d2b96c4 100644
--- a/built_collection/BUILD.gn
+++ b/built_collection/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for built_collection-4.2.0
+# This file is generated by importer.py for built_collection-4.2.1
 
 import("//build/dart/dart_library.gni")
 
diff --git a/built_collection/CHANGELOG.md b/built_collection/CHANGELOG.md
index 766963f..ca7b6c0 100644
--- a/built_collection/CHANGELOG.md
+++ b/built_collection/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Changelog
 
+## 4.2.1
+
+- Bug fix: `ListBuilder` `first` and `last` setters can no longer modify the
+  underlying collection.
+
 ## 4.2.0
 
 - Add benchmark for VM and dart2js.
diff --git a/built_collection/lib/src/list/list_builder.dart b/built_collection/lib/src/list/list_builder.dart
index dda3a5c..53d99e9 100644
--- a/built_collection/lib/src/list/list_builder.dart
+++ b/built_collection/lib/src/list/list_builder.dart
@@ -69,7 +69,8 @@
 
   /// As [List.first].
   set first(E value) {
-    _list.first = value;
+    _checkElement(value);
+    _safeList.first = value;
   }
 
   /// As [List.last].
@@ -77,7 +78,8 @@
 
   /// As [List.last].
   set last(E value) {
-    _list.last = value;
+    _checkElement(value);
+    _safeList.last = value;
   }
 
   /// As [List.length].
diff --git a/built_collection/pubspec.yaml b/built_collection/pubspec.yaml
index a18efd0..d02ca23 100644
--- a/built_collection/pubspec.yaml
+++ b/built_collection/pubspec.yaml
@@ -1,7 +1,9 @@
 name: built_collection
-version: 4.2.0
+version: 4.2.1
 description: >
-  Immutable collections using the builder pattern.
+  Immutable collections based on the SDK collections. Each SDK collection class
+  is split into a new immutable collection class and a corresponding mutable
+  builder class.
 authors:
 - David Morgan <davidmorgan@google.com>
 - Matan Lurey <matanl@google.com>
diff --git a/built_value/AUTHORS b/built_value/AUTHORS
index 9f876ac..ea1ad81 100644
--- a/built_value/AUTHORS
+++ b/built_value/AUTHORS
@@ -7,3 +7,4 @@
 Resul Alkan/MetGlobal <me@resulalkan.com>
 Ivan Inozemtsev/Google Inc. <iinozemtsev@google.com>
 Abhijeeth Padarthi <rkinabhi@gmail.com>
+John Dengis <jadengis@gmail.com>
diff --git a/built_value/BUILD.gn b/built_value/BUILD.gn
index 9c39cfb..5b06d6b 100644
--- a/built_value/BUILD.gn
+++ b/built_value/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for built_value-6.4.0
+# This file is generated by importer.py for built_value-6.5.0
 
 import("//build/dart/dart_library.gni")
 
diff --git a/built_value/CHANGELOG.md b/built_value/CHANGELOG.md
index b605942..fcb6095 100644
--- a/built_value/CHANGELOG.md
+++ b/built_value/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Changelog
 
+# 6.5.0
+
+- Add `Iso8601DurationSerializer` for use when you want ISO8601 serialization
+  instead of the default microseconds serialization.
+- Bump versions of `analyzer`, `analyzer_plugin` and `build_config`.
+
 # 6.4.0
 
 - Add `@BuiltValue(generateBuilderOnSetField: true)` which provides a way to
diff --git a/built_value/README.md b/built_value/README.md
index 31409a2..0bf40f5 100644
--- a/built_value/README.md
+++ b/built_value/README.md
@@ -30,7 +30,7 @@
  - [Flutter + built_value + Reddit Tutorial](https://steemit.com/utopian-io/@tensor/building-immutable-models-with-built-value-and-built-collection-in-dart-s-flutter-framework);
    [video](https://www.youtube.com/watch?v=hNbOSSgpneI);
    [source code](https://github.com/tensor-programming/built_flutter_tutorial)
-   
+
 ## Tools
 
  - The [Json to Dart built_value class converter](https://charafau.github.io/json2builtvalue/) creates classes for you that correspond to a snippet of JSON
diff --git a/built_value/lib/iso_8601_duration_serializer.dart b/built_value/lib/iso_8601_duration_serializer.dart
new file mode 100644
index 0000000..0b45146
--- /dev/null
+++ b/built_value/lib/iso_8601_duration_serializer.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2019, Google Inc. 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:built_collection/built_collection.dart';
+import 'package:built_value/serializer.dart';
+
+/// Alternative serializer for [Duration].
+///
+/// Install this to use ISO8601 compatible format instead of the default
+/// (microseconds). Use [SerializersBuilder.add] to install it.
+///
+/// Note that this serializer is not 100% compatible with the ISO8601 format
+/// due to limitations of the [Duration] class, but is designed to produce and
+/// consume reasonable strings that match the standard.
+class Iso8601DurationSerializer extends PrimitiveSerializer<Duration> {
+  @override
+  Duration deserialize(Serializers serializers, Object serialized,
+          {FullType specifiedType = FullType.unspecified}) =>
+      _parseDuration(serialized);
+
+  @override
+  Object serialize(Serializers serializers, Duration object,
+          {FullType specifiedType = FullType.unspecified}) =>
+      _writeIso8601Duration(object);
+
+  @override
+  Iterable<Type> get types => BuiltList(const [Duration]);
+
+  @override
+  String get wireName => 'Duration';
+
+  Duration _parseDuration(String value) {
+    final match = _parseFormat.firstMatch(value);
+    if (match == null) {
+      throw FormatException('Invalid duration format', value);
+    }
+    // Iterate through the capture groups to build the unit mappings.
+    final unitMappings = <String, int>{};
+
+    // Start iterating at 1, because match[0] is the full match.
+    for (var i = 1; i <= match.groupCount; i++) {
+      final group = match[i];
+      if (group == null) continue;
+
+      // Get all but last character in group.
+      // The RegExp ensures this must be an int.
+      final value = int.parse(group.substring(0, group.length - 1));
+      // Get last character.
+      final unit = group.substring(group.length - 1);
+      unitMappings[unit] = value;
+    }
+    return Duration(
+      days: unitMappings[_dayToken] ?? 0,
+      hours: unitMappings[_hourToken] ?? 0,
+      minutes: unitMappings[_minuteToken] ?? 0,
+      seconds: unitMappings[_secondToken] ?? 0,
+    );
+  }
+
+  String _writeIso8601Duration(Duration duration) {
+    if (duration == Duration.zero) {
+      return 'PT0S';
+    }
+    final days = duration.inDays;
+    final hours = (duration - Duration(days: days)).inHours;
+    final minutes = (duration - Duration(days: days, hours: hours)).inMinutes;
+    final seconds =
+        (duration - Duration(days: days, hours: hours, minutes: minutes))
+            .inSeconds;
+    final remainder = duration -
+        Duration(days: days, hours: hours, minutes: minutes, seconds: seconds);
+
+    if (remainder != Duration.zero) {
+      throw ArgumentError.value(duration, 'duration',
+          'Contains sub-second data which cannot be serialized.');
+    }
+    final buffer = StringBuffer(_durationToken)
+      ..write(days == 0 ? '' : '$days$_dayToken');
+    if (!(hours == 0 && minutes == 0 && seconds == 0)) {
+      buffer
+        ..write(_timeToken)
+        ..write(hours == 0 ? '' : '$hours$_hourToken')
+        ..write(minutes == 0 ? '' : '$minutes$_minuteToken')
+        ..write(seconds == 0 ? '' : '$seconds$_secondToken');
+    }
+    return buffer.toString();
+  }
+
+  // The unit tokens.
+  static const _durationToken = 'P';
+  static const _dayToken = 'D';
+  static const _timeToken = 'T';
+  static const _hourToken = 'H';
+  static const _minuteToken = 'M';
+  static const _secondToken = 'S';
+
+  // The parse format for ISO8601 durations.
+  static final _parseFormat = RegExp(
+    '^P(?!\$)(0D|[1-9][0-9]*D)?'
+    '(?:T(?!\$)(0H|[1-9][0-9]*H)?(0M|[1-9][0-9]*M)?(0S|[1-9][0-9]*S)?)?\$',
+  );
+}
diff --git a/built_value/pubspec.yaml b/built_value/pubspec.yaml
index 2a55674..f85df8b 100644
--- a/built_value/pubspec.yaml
+++ b/built_value/pubspec.yaml
@@ -1,5 +1,5 @@
 name: built_value
-version: 6.4.0
+version: 6.5.0
 description: >
   Value types with builders, Dart classes as enums, and serialization.
   This library is the runtime dependency.
diff --git a/dart_style/.travis.yml b/dart_style/.travis.yml
index 8b6048d..2477385 100644
--- a/dart_style/.travis.yml
+++ b/dart_style/.travis.yml
@@ -1,7 +1,9 @@
 language: dart
-sudo: false
+
 dart:
+  - 2.1.0
   - dev
+
 dart_task:
   - test
   - dartfmt
diff --git a/dart_style/BUILD.gn b/dart_style/BUILD.gn
index baf542c..b4dba57 100644
--- a/dart_style/BUILD.gn
+++ b/dart_style/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for dart_style-1.2.4
+# This file is generated by importer.py for dart_style-1.2.7
 
 import("//build/dart/dart_library.gni")
 
diff --git a/dart_style/CHANGELOG.md b/dart_style/CHANGELOG.md
index 6a26ada..b765aa4 100644
--- a/dart_style/CHANGELOG.md
+++ b/dart_style/CHANGELOG.md
@@ -1,3 +1,32 @@
+# 1.2.7
+
+* Improve indentation of adjacent strings inside `=>` functions.
+
+# 1.2.6
+
+* Properly format trailing commas in assertions.
+* Improve indentation of adjacent strings. This fixes a regression introduced
+  in 1.2.5 and hopefully makes adjacent strings generally look better.
+
+  Adjacent strings in argument lists now format the same regardless of whether
+  the argument list contains a trailing comma. The rule is that if the
+  argument list contains no other strings, then the adjacent strings do not
+  get extra indentation. This keeps them lined up when doing so is unlikely to
+  be confused as showing separate independent string arguments.
+
+  Previously, adjacent strings were never indented in argument lists without a
+  trailing comma and always in argument lists that did. With this change,
+  adjacent strings are still always indented in collection literals because
+  readers are likely to interpret a series of unindented lines there as showing
+  separate collection elements.
+
+# 1.2.5
+
+* Add support for spreads inside collections (#778).
+* Add support for `if` and `for` elements inside collections (#779).
+* Require at least Dart 2.1.0.
+* Require analyzer 0.36.0.
+
 # 1.2.4
 
 * Update to latest analyzer package AST API.
diff --git a/dart_style/analysis_options.yaml b/dart_style/analysis_options.yaml
index e4b1b8f..14bcb12 100644
--- a/dart_style/analysis_options.yaml
+++ b/dart_style/analysis_options.yaml
@@ -1,3 +1,9 @@
+include: package:pedantic/analysis_options.yaml
 linter:
   rules:
+    - prefer_equal_for_default_values
+    - prefer_generic_function_type_aliases
+    - slash_for_doc_comments
     - unawaited_futures
+    - unnecessary_const
+    - unnecessary_new
diff --git a/dart_style/benchmark/benchmark.dart b/dart_style/benchmark/benchmark.dart
index ab960f5..117558c 100644
--- a/dart_style/benchmark/benchmark.dart
+++ b/dart_style/benchmark/benchmark.dart
@@ -25,7 +25,7 @@
   // Run the benchmark several times. This ensures the VM is warmed up and lets
   // us see how much variance there is.
   for (var i = 0; i <= NUM_TRIALS; i++) {
-    var start = new DateTime.now();
+    var start = DateTime.now();
 
     // For a single benchmark, format the source multiple times.
     var result;
@@ -34,7 +34,7 @@
     }
 
     var elapsed =
-        new DateTime.now().difference(start).inMilliseconds / FORMATS_PER_TRIAL;
+        DateTime.now().difference(start).inMilliseconds / FORMATS_PER_TRIAL;
 
     // Keep track of the best run so far.
     if (elapsed >= best) continue;
@@ -58,7 +58,7 @@
 
 String loadFile(String name) {
   var path = p.join(p.dirname(p.fromUri(Platform.script)), name);
-  return new File(path).readAsStringSync();
+  return File(path).readAsStringSync();
 }
 
 void printResult(String label, double time) {
@@ -76,6 +76,6 @@
 }
 
 String formatSource() {
-  var formatter = new DartFormatter();
+  var formatter = DartFormatter();
   return formatter.format(source);
 }
diff --git a/dart_style/bin/format.dart b/dart_style/bin/format.dart
index 04e4f0c..5a70dc4 100644
--- a/dart_style/bin/format.dart
+++ b/dart_style/bin/format.dart
@@ -15,10 +15,10 @@
 import 'package:dart_style/src/style_fix.dart';
 
 // Note: The following line of code is modified by tool/grind.dart.
-const version = "1.2.4";
+const version = "1.2.7";
 
 void main(List<String> args) {
-  var parser = new ArgParser(allowTrailingOptions: true);
+  var parser = ArgParser(allowTrailingOptions: true);
 
   parser.addSeparator("Common options:");
   parser.addFlag("help",
@@ -131,11 +131,11 @@
   }
 
   if (argResults["profile"]) {
-    reporter = new ProfileReporter(reporter);
+    reporter = ProfileReporter(reporter);
   }
 
   if (argResults["set-exit-if-changed"]) {
-    reporter = new SetExitReporter(reporter);
+    reporter = SetExitReporter(reporter);
   }
 
   int pageWidth;
@@ -151,7 +151,7 @@
   int indent;
   try {
     indent = int.parse(argResults["indent"]);
-    if (indent < 0 || indent.toInt() != indent) throw new FormatException();
+    if (indent < 0 || indent.toInt() != indent) throw FormatException();
   } on FormatException catch (_) {
     usageError(
         parser,
@@ -173,11 +173,11 @@
     }
   }
 
-  if (argResults.wasParsed("stdin-name") && !argResults.rest.isEmpty) {
+  if (argResults.wasParsed("stdin-name") && argResults.rest.isNotEmpty) {
     usageError(parser, "Cannot pass --stdin-name when not reading from stdin.");
   }
 
-  var options = new FormatterOptions(reporter,
+  var options = FormatterOptions(reporter,
       indent: indent,
       pageWidth: pageWidth,
       followLinks: followLinks,
@@ -199,7 +199,7 @@
 
   var coordinates = selection.split(":");
   if (coordinates.length != 2) {
-    throw new FormatException(
+    throw FormatException(
         'Selection should be a colon-separated pair of integers, "123:45".');
   }
 
@@ -216,15 +216,15 @@
     selectionLength = selection[1];
   }
 
-  var input = new StringBuffer();
-  stdin.transform(new Utf8Decoder()).listen(input.write, onDone: () {
-    var formatter = new DartFormatter(
+  var input = StringBuffer();
+  stdin.transform(Utf8Decoder()).listen(input.write, onDone: () {
+    var formatter = DartFormatter(
         indent: options.indent,
         pageWidth: options.pageWidth,
         fixes: options.fixes);
     try {
       options.reporter.beforeFile(null, name);
-      var source = new SourceCode(input.toString(),
+      var source = SourceCode(input.toString(),
           uri: name,
           selectionStart: selectionStart,
           selectionLength: selectionLength);
@@ -248,7 +248,7 @@
 /// Formats all of the files and directories given by [paths].
 void formatPaths(FormatterOptions options, List<String> paths) {
   for (var path in paths) {
-    var directory = new Directory(path);
+    var directory = Directory(path);
     if (directory.existsSync()) {
       if (!processDirectory(options, directory)) {
         exitCode = 65;
@@ -256,7 +256,7 @@
       continue;
     }
 
-    var file = new File(path);
+    var file = File(path);
     if (file.existsSync()) {
       if (!processFile(options, file)) {
         exitCode = 65;
diff --git a/dart_style/example/format.dart b/dart_style/example/format.dart
index 6d3ea61..6edbfe0 100644
--- a/dart_style/example/format.dart
+++ b/dart_style/example/format.dart
@@ -35,7 +35,7 @@
 
 void runFormatter(String source, int pageWidth, {bool isCompilationUnit}) {
   try {
-    var formatter = new DartFormatter(pageWidth: pageWidth);
+    var formatter = DartFormatter(pageWidth: pageWidth);
 
     var result;
     if (isCompilationUnit) {
@@ -61,7 +61,7 @@
 /// Runs the formatter test starting on [line] at [path] inside the "test"
 /// directory.
 void runTest(String path, int line) {
-  var indentPattern = new RegExp(r"^\(indent (\d+)\)\s*");
+  var indentPattern = RegExp(r"^\(indent (\d+)\)\s*");
 
   // Locate the "test" directory. Use mirrors so that this works with the test
   // package, which loads this suite into an isolate.
@@ -72,7 +72,7 @@
           .path),
       "../test");
 
-  var lines = new File(p.join(testDir, path)).readAsLinesSync();
+  var lines = File(p.join(testDir, path)).readAsLinesSync();
 
   // The first line may have a "|" to indicate the page width.
   var pageWidth = 80;
@@ -121,8 +121,7 @@
     var expected =
         _extractSelection(expectedOutput, isCompilationUnit: isCompilationUnit);
 
-    var formatter =
-        new DartFormatter(pageWidth: pageWidth, indent: leadingIndent);
+    var formatter = DartFormatter(pageWidth: pageWidth, indent: leadingIndent);
 
     var actual = formatter.formatSource(inputCode);
 
@@ -151,14 +150,14 @@
 /// Given a source string that contains ‹ and › to indicate a selection, returns
 /// a [SourceCode] with the text (with the selection markers removed) and the
 /// correct selection range.
-SourceCode _extractSelection(String source, {bool isCompilationUnit: false}) {
+SourceCode _extractSelection(String source, {bool isCompilationUnit = false}) {
   var start = source.indexOf("‹");
   source = source.replaceAll("‹", "");
 
   var end = source.indexOf("›");
   source = source.replaceAll("›", "");
 
-  return new SourceCode(source,
+  return SourceCode(source,
       isCompilationUnit: isCompilationUnit,
       selectionStart: start == -1 ? null : start,
       selectionLength: end == -1 ? null : end - start);
diff --git a/dart_style/lib/src/argument_list_visitor.dart b/dart_style/lib/src/argument_list_visitor.dart
index c71b9f0..25bbb75 100644
--- a/dart_style/lib/src/argument_list_visitor.dart
+++ b/dart_style/lib/src/argument_list_visitor.dart
@@ -57,7 +57,7 @@
       _arguments._blocks.isNotEmpty || _functions != null;
 
   factory ArgumentListVisitor(SourceVisitor visitor, ArgumentList node) {
-    return new ArgumentListVisitor.forArguments(
+    return ArgumentListVisitor.forArguments(
         visitor, node.leftParenthesis, node.rightParenthesis, node.arguments);
   }
 
@@ -147,14 +147,8 @@
 
     if (functionsStart == null) {
       // No functions, so there is just a single argument list.
-      return new ArgumentListVisitor._(
-          visitor,
-          leftParenthesis,
-          rightParenthesis,
-          arguments,
-          new ArgumentSublist(arguments, arguments),
-          null,
-          null);
+      return ArgumentListVisitor._(visitor, leftParenthesis, rightParenthesis,
+          arguments, ArgumentSublist(arguments, arguments), null, null);
     }
 
     // Split the arguments into two independent argument lists with the
@@ -163,14 +157,14 @@
     var functions = arguments.sublist(functionsStart, functionsEnd);
     var argumentsAfter = arguments.skip(functionsEnd).toList();
 
-    return new ArgumentListVisitor._(
+    return ArgumentListVisitor._(
         visitor,
         leftParenthesis,
         rightParenthesis,
         arguments,
-        new ArgumentSublist(arguments, argumentsBefore),
+        ArgumentSublist(arguments, argumentsBefore),
         functions,
-        new ArgumentSublist(arguments, argumentsAfter));
+        ArgumentSublist(arguments, argumentsAfter));
   }
 
   ArgumentListVisitor._(
@@ -370,7 +364,7 @@
       blocks.clear();
     }
 
-    return new ArgumentSublist._(
+    return ArgumentSublist._(
         allArguments, positional, named, blocks, leadingBlocks, trailingBlocks);
   }
 
@@ -379,7 +373,7 @@
 
   void visit(SourceVisitor visitor) {
     if (_blocks.isNotEmpty) {
-      _blockRule = new Rule(Cost.splitBlocks);
+      _blockRule = Rule(Cost.splitBlocks);
     }
 
     var rule = _visitPositional(visitor);
@@ -394,7 +388,7 @@
     // Only count the blocks in the positional rule.
     var leadingBlocks = math.min(_leadingBlocks, _positional.length);
     var trailingBlocks = math.max(_trailingBlocks - _named.length, 0);
-    var rule = new PositionalRule(_blockRule, leadingBlocks, trailingBlocks);
+    var rule = PositionalRule(_blockRule, leadingBlocks, trailingBlocks);
     _visitArguments(visitor, _positional, rule);
 
     return rule;
@@ -407,7 +401,7 @@
     // Only count the blocks in the named rule.
     var leadingBlocks = math.max(_leadingBlocks - _positional.length, 0);
     var trailingBlocks = math.min(_trailingBlocks, _named.length);
-    var namedRule = new NamedRule(_blockRule, leadingBlocks, trailingBlocks);
+    var namedRule = NamedRule(_blockRule, leadingBlocks, trailingBlocks);
 
     // Let the positional args force the named ones to split.
     if (positionalRule != null) {
@@ -453,7 +447,7 @@
       rule.disableSplitOnInnerRules();
 
       // Tell it to use the rule we've already created.
-      visitor.beforeBlock(_blocks[argument], this);
+      visitor.beforeBlock(_blocks[argument], blockRule, previousSplit);
     } else if (_allArguments.length > 1) {
       // Edge case: Only bump the nesting if there are multiple arguments. This
       // lets us avoid spurious indentation in cases like:
diff --git a/dart_style/lib/src/call_chain_visitor.dart b/dart_style/lib/src/call_chain_visitor.dart
index b7289b0..936beee 100644
--- a/dart_style/lib/src/call_chain_visitor.dart
+++ b/dart_style/lib/src/call_chain_visitor.dart
@@ -157,7 +157,7 @@
       // See if this call is a method call whose arguments are block formatted.
       var isBlockCall = false;
       if (call is MethodInvocation) {
-        var args = new ArgumentListVisitor(visitor, call.argumentList);
+        var args = ArgumentListVisitor(visitor, call.argumentList);
         isBlockCall = args.hasBlockArguments;
       }
 
@@ -187,7 +187,7 @@
       calls.remove(hangingCall);
     }
 
-    return new CallChainVisitor._(
+    return CallChainVisitor._(
         visitor, target, properties, calls, blockCalls, hangingCall);
   }
 
@@ -214,7 +214,7 @@
 
     if (splitOnTarget) {
       if (_properties.length > 1) {
-        _propertyRule = new PositionalRule(null, 0, 0);
+        _propertyRule = PositionalRule(null, 0, 0);
         _visitor.builder.startLazyRule(_propertyRule);
       } else {
         _enableRule(lazy: true);
@@ -230,7 +230,7 @@
       _writeCall(_properties.single);
     } else if (_properties.length > 1) {
       if (!splitOnTarget) {
-        _propertyRule = new PositionalRule(null, 0, 0);
+        _propertyRule = PositionalRule(null, 0, 0);
         _visitor.builder.startRule(_propertyRule);
       }
 
@@ -432,11 +432,11 @@
   }
 
   /// Creates a new method chain [Rule] if one is not already active.
-  void _enableRule({bool lazy: false}) {
+  void _enableRule({bool lazy = false}) {
     if (_ruleEnabled) return;
 
     // If the properties split, force the calls to split too.
-    var rule = new Rule();
+    var rule = Rule();
     if (_propertyRule != null) _propertyRule.setNamedArgsRule(rule);
 
     if (lazy) {
diff --git a/dart_style/lib/src/chunk.dart b/dart_style/lib/src/chunk.dart
index d1f33ca..5dfe201 100644
--- a/dart_style/lib/src/chunk.dart
+++ b/dart_style/lib/src/chunk.dart
@@ -225,7 +225,7 @@
   /// Turns this chunk into one that can contain a block of child chunks.
   void makeBlock(Chunk blockArgument) {
     assert(_block == null);
-    _block = new ChunkBlock(blockArgument);
+    _block = ChunkBlock(blockArgument);
   }
 
   /// Returns `true` if the block body owned by this chunk should be expression
diff --git a/dart_style/lib/src/chunk_builder.dart b/dart_style/lib/src/chunk_builder.dart
index c6cb303..20c7505 100644
--- a/dart_style/lib/src/chunk_builder.dart
+++ b/dart_style/lib/src/chunk_builder.dart
@@ -16,14 +16,14 @@
 import 'whitespace.dart';
 
 /// Matches if the last character of a string is an identifier character.
-final _trailingIdentifierChar = new RegExp(r"[a-zA-Z0-9_]$");
+final _trailingIdentifierChar = RegExp(r"[a-zA-Z0-9_]$");
 
 /// Matches a JavaDoc-style doc comment that starts with "/**" and ends with
 /// "*/" or "**/".
-final _javaDocComment = new RegExp(r"^/\*\*([^*/][\s\S]*?)\*?\*/$");
+final _javaDocComment = RegExp(r"^/\*\*([^*/][\s\S]*?)\*?\*/$");
 
 /// Matches the leading "*" in a line in the middle of a JavaDoc-style comment.
-var _javaDocLine = new RegExp(r"^\s*\*(.*)");
+var _javaDocLine = RegExp(r"^\s*\*(.*)");
 
 /// Takes the incremental serialized output of [SourceVisitor]--the source text
 /// along with any comments and preserved whitespace--and produces a coherent
@@ -66,7 +66,7 @@
   /// the hard split appears. For example, a hard split in a positional
   /// argument list needs to force the named arguments to split too, but we
   /// don't create that rule until after the positional arguments are done.
-  final _hardSplitRules = new Set<Rule>();
+  final _hardSplitRules = Set<Rule>();
 
   /// The list of rules that are waiting until the next whitespace has been
   /// written before they start.
@@ -76,7 +76,7 @@
   final _openSpans = <OpenSpan>[];
 
   /// The current state.
-  final _nesting = new NestingBuilder();
+  final _nesting = NestingBuilder();
 
   /// The stack of nesting levels where block arguments may start.
   ///
@@ -438,7 +438,7 @@
   ///
   /// Each call to this needs a later matching call to [endSpan].
   void startSpan([int cost = Cost.normal]) {
-    _openSpans.add(new OpenSpan(_currentChunkIndex, cost));
+    _openSpans.add(OpenSpan(_currentChunkIndex, cost));
   }
 
   /// Ends the innermost span.
@@ -450,7 +450,7 @@
     if (openSpan.start == end) return;
 
     // Add the span to every chunk that can split it.
-    var span = new Span(openSpan.cost);
+    var span = Span(openSpan.cost);
     for (var i = openSpan.start; i < end; i++) {
       var chunk = _chunks[i];
       if (!chunk.rule.isHardened) chunk.spans.add(span);
@@ -461,7 +461,7 @@
   ///
   /// If omitted, defaults to a new [Rule].
   void startRule([Rule rule]) {
-    if (rule == null) rule = new Rule();
+    if (rule == null) rule = Rule();
 
     // If there are any pending lazy rules, start them now so that the proper
     // stack ordering of rules is maintained.
@@ -489,7 +489,7 @@
   ///
   /// If [rule] is omitted, defaults to a new [Rule].
   void startLazyRule([Rule rule]) {
-    if (rule == null) rule = new Rule();
+    if (rule == null) rule = Rule();
 
     _lazyRules.add(rule);
   }
@@ -580,8 +580,7 @@
     var chunk = _chunks.last;
     chunk.makeBlock(argumentChunk);
 
-    var builder =
-        new ChunkBuilder._(this, _formatter, _source, chunk.block.chunks);
+    var builder = ChunkBuilder._(this, _formatter, _source, chunk.block.chunks);
 
     // A block always starts off indented one level.
     builder.indent();
@@ -653,7 +652,7 @@
       debug.log();
     }
 
-    var writer = new LineWriter(_formatter, _chunks);
+    var writer = LineWriter(_formatter, _chunks);
     var result = writer.writeLines(_formatter.indent,
         isCompilationUnit: _source.isCompilationUnit);
 
@@ -671,7 +670,7 @@
       selectionLength = selectionEnd - selectionStart;
     }
 
-    return new SourceCode(result.text,
+    return SourceCode(result.text,
         uri: _source.uri,
         isCompilationUnit: _source.isCompilationUnit,
         selectionStart: selectionStart,
@@ -822,10 +821,10 @@
   /// If [flushLeft] is `true`, then the split will always cause the next line
   /// to be at column zero. Otherwise, it uses the normal indentation and
   /// nesting behavior.
-  void _writeHardSplit({bool isDouble, bool flushLeft, bool nest: false}) {
+  void _writeHardSplit({bool isDouble, bool flushLeft, bool nest = false}) {
     // A hard split overrides any other whitespace.
     _pendingWhitespace = null;
-    _writeSplit(new Rule.hard(),
+    _writeSplit(Rule.hard(),
         flushLeft: flushLeft, isDouble: isDouble, nest: nest);
   }
 
@@ -843,8 +842,8 @@
       return null;
     }
 
-    _chunks.last.applySplit(rule, _nesting.indentation,
-        nest ? _nesting.nesting : new NestingLevel(),
+    _chunks.last.applySplit(
+        rule, _nesting.indentation, nest ? _nesting.nesting : NestingLevel(),
         flushLeft: flushLeft, isDouble: isDouble, space: space);
 
     if (_chunks.last.rule.isHardened) _handleHardSplit();
@@ -857,7 +856,7 @@
     if (_chunks.isNotEmpty && _chunks.last.canAddText) {
       _chunks.last.appendText(text);
     } else {
-      _chunks.add(new Chunk(text));
+      _chunks.add(Chunk(text));
     }
   }
 
diff --git a/dart_style/lib/src/dart_formatter.dart b/dart_style/lib/src/dart_formatter.dart
index afd0626..4824302 100644
--- a/dart_style/lib/src/dart_formatter.dart
+++ b/dart_style/lib/src/dart_formatter.dart
@@ -37,7 +37,7 @@
   /// The number of characters of indentation to prefix the output lines with.
   final int indent;
 
-  final Set<StyleFix> fixes = new Set();
+  final Set<StyleFix> fixes = Set();
 
   /// Creates a new formatter for Dart code.
   ///
@@ -69,17 +69,16 @@
     } else if (uri is String) {
       // Do nothing.
     } else {
-      throw new ArgumentError("uri must be `null`, a Uri, or a String.");
+      throw ArgumentError("uri must be `null`, a Uri, or a String.");
     }
 
-    return formatSource(
-            new SourceCode(source, uri: uri, isCompilationUnit: true))
+    return formatSource(SourceCode(source, uri: uri, isCompilationUnit: true))
         .text;
   }
 
   /// Formats the given [source] string containing a single Dart statement.
   String formatStatement(String source) {
-    return formatSource(new SourceCode(source, isCompilationUnit: false)).text;
+    return formatSource(SourceCode(source, isCompilationUnit: false)).text;
   }
 
   /// Formats the given [source].
@@ -87,14 +86,14 @@
   /// Returns a new [SourceCode] containing the formatted code and the resulting
   /// selection, if any.
   SourceCode formatSource(SourceCode source) {
-    var errorListener = new ErrorListener();
+    var errorListener = ErrorListener();
 
     // Tokenize the source.
-    var reader = new CharSequenceReader(source.text);
-    var stringSource = new StringSource(source.text, source.uri);
-    var scanner = new Scanner(stringSource, reader, errorListener);
+    var reader = CharSequenceReader(source.text);
+    var stringSource = StringSource(source.text, source.uri);
+    var scanner = Scanner(stringSource, reader, errorListener);
     var startToken = scanner.tokenize();
-    var lineInfo = new LineInfo(scanner.lineStarts);
+    var lineInfo = LineInfo(scanner.lineStarts);
 
     // Infer the line ending if not given one. Do it here since now we know
     // where the lines start.
@@ -112,8 +111,11 @@
     errorListener.throwIfErrors();
 
     // Parse it.
-    var parser = new Parser(stringSource, errorListener);
+    var parser = Parser(stringSource, errorListener);
     parser.enableOptionalNewAndConst = true;
+    parser.enableSetLiterals = true;
+    parser.enableSpreadCollections = true;
+    parser.enableControlFlowCollections = true;
 
     AstNode node;
     if (source.isCompilationUnit) {
@@ -124,27 +126,27 @@
       // Make sure we consumed all of the source.
       var token = node.endToken.next;
       if (token.type != TokenType.EOF) {
-        var error = new AnalysisError(
+        var error = AnalysisError(
             stringSource,
             token.offset,
             math.max(token.length, 1),
             ParserErrorCode.UNEXPECTED_TOKEN,
             [token.lexeme]);
 
-        throw new FormatterException([error]);
+        throw FormatterException([error]);
       }
     }
 
     errorListener.throwIfErrors();
 
     // Format it.
-    var visitor = new SourceVisitor(this, lineInfo, source);
+    var visitor = SourceVisitor(this, lineInfo, source);
     var output = visitor.run(node);
 
     // Sanity check that only whitespace was changed if that's all we expect.
     if (fixes.isEmpty &&
         !string_compare.equalIgnoringWhitespace(source.text, output.text)) {
-      throw new UnexpectedOutputException(source.text, output.text);
+      throw UnexpectedOutputException(source.text, output.text);
     }
 
     return output;
diff --git a/dart_style/lib/src/debug.dart b/dart_style/lib/src/debug.dart
index 67322ce..ea04a41 100644
--- a/dart_style/lib/src/debug.dart
+++ b/dart_style/lib/src/debug.dart
@@ -67,7 +67,7 @@
 
   // Show the spans as vertical bands over their range (unless there are too
   // many).
-  var spanSet = new Set<Span>();
+  var spanSet = Set<Span>();
   addSpans(List<Chunk> chunks) {
     for (var chunk in chunks) {
       spanSet.addAll(chunk.spans);
@@ -167,14 +167,14 @@
     addChunk(chunks, "", i);
   }
 
-  var rowWidths = new List.filled(rows.first.length, 0);
+  var rowWidths = List.filled(rows.first.length, 0);
   for (var row in rows) {
     for (var i = 0; i < row.length; i++) {
       rowWidths[i] = math.max(rowWidths[i], row[i].length);
     }
   }
 
-  var buffer = new StringBuffer();
+  var buffer = StringBuffer();
   for (var row in rows) {
     for (var i = 0; i < row.length; i++) {
       var cell = row[i].padRight(rowWidths[i]);
@@ -223,7 +223,7 @@
 /// It will determine how best to split it into multiple lines of output and
 /// return a single string that may contain one or more newline characters.
 void dumpLines(List<Chunk> chunks, int firstLineIndent, SplitSet splits) {
-  var buffer = new StringBuffer();
+  var buffer = StringBuffer();
 
   writeIndent(indent) => buffer.write(gray("| " * (indent ~/ 2)));
 
diff --git a/dart_style/lib/src/error_listener.dart b/dart_style/lib/src/error_listener.dart
index 19e4076..bceb91e 100644
--- a/dart_style/lib/src/error_listener.dart
+++ b/dart_style/lib/src/error_listener.dart
@@ -25,6 +25,6 @@
   void throwIfErrors() {
     if (_errors.isEmpty) return;
 
-    throw new FormatterException(_errors);
+    throw FormatterException(_errors);
   }
 }
diff --git a/dart_style/lib/src/exceptions.dart b/dart_style/lib/src/exceptions.dart
index 5494183..c517f40 100644
--- a/dart_style/lib/src/exceptions.dart
+++ b/dart_style/lib/src/exceptions.dart
@@ -18,7 +18,7 @@
 
   /// Creates a human-friendly representation of the analysis errors.
   String message({bool color}) {
-    var buffer = new StringBuffer();
+    var buffer = StringBuffer();
     buffer.writeln("Could not format because the source could not be parsed:");
 
     // In case we get a huge series of cascaded errors, just show the first few.
@@ -35,7 +35,7 @@
         source += " " * (error.offset + error.length - source.length);
       }
 
-      var file = new SourceFile.fromString(source, url: error.source.fullName);
+      var file = SourceFile.fromString(source, url: error.source.fullName);
       var span = file.span(error.offset, error.offset + error.length);
       if (buffer.isNotEmpty) buffer.writeln();
       buffer.write(span.message(error.message, color: color));
diff --git a/dart_style/lib/src/formatter_options.dart b/dart_style/lib/src/formatter_options.dart
index 1edb15a..2940b79 100644
--- a/dart_style/lib/src/formatter_options.dart
+++ b/dart_style/lib/src/formatter_options.dart
@@ -29,9 +29,9 @@
   final Iterable<StyleFix> fixes;
 
   FormatterOptions(this.reporter,
-      {this.indent: 0,
-      this.pageWidth: 80,
-      this.followLinks: false,
+      {this.indent = 0,
+      this.pageWidth = 80,
+      this.followLinks = false,
       this.fixes});
 }
 
@@ -39,17 +39,17 @@
 abstract class OutputReporter {
   /// Prints only the names of files whose contents are different from their
   /// formatted version.
-  static final OutputReporter dryRun = new _DryRunReporter();
+  static final OutputReporter dryRun = _DryRunReporter();
 
   /// Prints the formatted results of each file to stdout.
-  static final OutputReporter print = new _PrintReporter();
+  static final OutputReporter print = _PrintReporter();
 
   /// Prints the formatted result and selection info of each file to stdout as
   /// a JSON map.
-  static final OutputReporter printJson = new _PrintJsonReporter();
+  static final OutputReporter printJson = _PrintJsonReporter();
 
   /// Overwrites each file with its formatted result.
-  static final OutputReporter overwrite = new _OverwriteReporter();
+  static final OutputReporter overwrite = _OverwriteReporter();
 
   /// Describe the directory whose contents are about to be processed.
   void showDirectory(String path) {}
@@ -200,7 +200,7 @@
   /// Called when [file] is about to be formatted.
   void beforeFile(File file, String label) {
     super.beforeFile(file, label);
-    _ongoing[label] = new DateTime.now();
+    _ongoing[label] = DateTime.now();
   }
 
   /// Describe the processed file at [path] whose formatted result is [output].
@@ -208,7 +208,7 @@
   /// If the contents of the file are the same as the formatted output,
   /// [changed] will be false.
   void afterFile(File file, String label, SourceCode output, {bool changed}) {
-    var elapsed = new DateTime.now().difference(_ongoing.remove(label));
+    var elapsed = DateTime.now().difference(_ongoing.remove(label));
     if (elapsed.inMilliseconds >= 10) {
       _elapsed[label] = elapsed;
     } else {
diff --git a/dart_style/lib/src/io.dart b/dart_style/lib/src/io.dart
index 28f1a71..40fc1f7 100644
--- a/dart_style/lib/src/io.dart
+++ b/dart_style/lib/src/io.dart
@@ -22,7 +22,7 @@
   options.reporter.showDirectory(directory.path);
 
   var success = true;
-  var shownHiddenPaths = new Set<String>();
+  var shownHiddenPaths = Set<String>();
 
   for (var entry in directory.listSync(
       recursive: true, followLinks: options.followLinks)) {
@@ -67,12 +67,12 @@
 bool processFile(FormatterOptions options, File file, {String label}) {
   if (label == null) label = file.path;
 
-  var formatter = new DartFormatter(
+  var formatter = DartFormatter(
       indent: options.indent,
       pageWidth: options.pageWidth,
       fixes: options.fixes);
   try {
-    var source = new SourceCode(file.readAsStringSync(), uri: file.path);
+    var source = SourceCode(file.readAsStringSync(), uri: file.path);
     options.reporter.beforeFile(file, label);
     var output = formatter.formatSource(source);
     options.reporter
diff --git a/dart_style/lib/src/line_splitting/line_splitter.dart b/dart_style/lib/src/line_splitting/line_splitter.dart
index 420c509..95d545a 100644
--- a/dart_style/lib/src/line_splitting/line_splitter.dart
+++ b/dart_style/lib/src/line_splitting/line_splitter.dart
@@ -119,7 +119,7 @@
   /// This is sorted lowest-cost first. This ensures that as soon as we find a
   /// solution that fits in the page, we know it will be the lowest cost one
   /// and can stop looking.
-  final _queue = new SolveStateQueue();
+  final _queue = SolveStateQueue();
 
   /// The lowest cost solution found so far.
   SolveState _bestSolution;
@@ -128,7 +128,7 @@
   /// page width.
   LineSplitter(this.writer, List<Chunk> chunks, int blockIndentation,
       int firstLineIndent,
-      {bool flushLeft: false})
+      {bool flushLeft = false})
       : chunks = chunks,
         // Collect the set of rules that we need to select values for.
         rules = chunks
@@ -163,7 +163,7 @@
   /// first line of output with.
   SplitSet apply() {
     // Start with a completely unbound, unsplit solution.
-    _queue.add(new SolveState(this, new RuleSet(rules.length)));
+    _queue.add(SolveState(this, RuleSet(rules.length)));
 
     var attempts = 0;
     while (_queue.isNotEmpty) {
diff --git a/dart_style/lib/src/line_splitting/rule_set.dart b/dart_style/lib/src/line_splitting/rule_set.dart
index 714875d..7011393 100644
--- a/dart_style/lib/src/line_splitting/rule_set.dart
+++ b/dart_style/lib/src/line_splitting/rule_set.dart
@@ -18,7 +18,7 @@
 class RuleSet {
   List<int> _values;
 
-  RuleSet(int numRules) : this._(new List(numRules));
+  RuleSet(int numRules) : this._(List(numRules));
 
   RuleSet._(this._values);
 
@@ -53,7 +53,7 @@
   }
 
   /// Creates a new [RuleSet] with the same bound rule values as this one.
-  RuleSet clone() => new RuleSet._(_values.toList(growable: false));
+  RuleSet clone() => RuleSet._(_values.toList(growable: false));
 
   /// Binds [rule] to [value] then checks to see if that violates any
   /// constraints.
@@ -137,7 +137,7 @@
   int _cost;
 
   /// Creates a new empty split set for a line with [numChunks].
-  SplitSet(int numChunks) : _columns = new List(numChunks - 1);
+  SplitSet(int numChunks) : _columns = List(numChunks - 1);
 
   /// Marks the line after chunk [index] as starting at [column].
   void add(int index, int column) {
diff --git a/dart_style/lib/src/line_splitting/solve_state.dart b/dart_style/lib/src/line_splitting/solve_state.dart
index f77fe13..0ae7a70 100644
--- a/dart_style/lib/src/line_splitting/solve_state.dart
+++ b/dart_style/lib/src/line_splitting/solve_state.dart
@@ -63,7 +63,7 @@
   /// There is one other set of rules that go in here. Sometimes a bound rule
   /// in the solve state constrains some other unbound rule to split. In that
   /// case, we also consider that active so we know to not leave it at zero.
-  final _liveRules = new Set<Rule>();
+  final _liveRules = Set<Rule>();
 
   /// The set of splits chosen for this state.
   SplitSet get splits => _splits;
@@ -205,7 +205,7 @@
           // Make sure we don't violate the constraints of the bound rules.
           if (!valid) continue;
 
-          var state = new SolveState(_splitter, boundRules);
+          var state = SolveState(_splitter, boundRules);
 
           // If some unbound rules are constrained to split, remember that.
           if (mustSplitRules != null) {
@@ -281,7 +281,7 @@
   void _calculateSplits() {
     // Figure out which expression nesting levels got split and need to be
     // assigned columns.
-    var usedNestingLevels = new Set<NestingLevel>();
+    var usedNestingLevels = Set<NestingLevel>();
     for (var i = 0; i < _splitter.chunks.length - 1; i++) {
       var chunk = _splitter.chunks[i];
       if (chunk.rule.isSplit(getValue(chunk.rule), chunk)) {
@@ -294,7 +294,7 @@
       nesting.refreshTotalUsedIndent(usedNestingLevels);
     }
 
-    _splits = new SplitSet(_splitter.chunks.length);
+    _splits = SplitSet(_splitter.chunks.length);
     for (var i = 0; i < _splitter.chunks.length - 1; i++) {
       var chunk = _splitter.chunks[i];
       if (chunk.rule.isSplit(getValue(chunk.rule), chunk)) {
@@ -354,7 +354,7 @@
     // The set of spans that contain chunks that ended up splitting. We store
     // these in a set so a span's cost doesn't get double-counted if more than
     // one split occurs in it.
-    var splitSpans = new Set();
+    var splitSpans = Set();
 
     // The nesting level of the chunk that ended the previous line.
     var previousNesting;
@@ -454,9 +454,9 @@
   void _ensureBoundRulesInUnboundLines() {
     if (_boundRulesInUnboundLines != null) return;
 
-    _boundRulesInUnboundLines = new Set<Rule>();
+    _boundRulesInUnboundLines = Set<Rule>();
 
-    var boundInLine = new Set<Rule>();
+    var boundInLine = Set<Rule>();
     var hasUnbound = false;
 
     for (var i = 0; i < _splitter.chunks.length - 1; i++) {
@@ -488,8 +488,8 @@
   void _ensureConstraints() {
     if (_constraints != null) return;
 
-    _unboundRules = new Set();
-    _boundRules = new Set();
+    _unboundRules = Set();
+    _boundRules = Set();
 
     for (var rule in _splitter.rules) {
       if (_ruleValues.contains(rule)) {
@@ -553,7 +553,7 @@
           }
 
           if (disallowedValues == null) {
-            disallowedValues = new Set<int>();
+            disallowedValues = Set<int>();
             _unboundConstraints[unbound] = disallowedValues;
           }
 
@@ -564,7 +564,7 @@
   }
 
   String toString() {
-    var buffer = new StringBuffer();
+    var buffer = StringBuffer();
 
     buffer.writeAll(_splitter.rules.map((rule) {
       var valueLength = "${rule.fullySplitValue}".length;
diff --git a/dart_style/lib/src/line_splitting/solve_state_queue.dart b/dart_style/lib/src/line_splitting/solve_state_queue.dart
index 2247cb3..a22731a 100644
--- a/dart_style/lib/src/line_splitting/solve_state_queue.dart
+++ b/dart_style/lib/src/line_splitting/solve_state_queue.dart
@@ -25,7 +25,7 @@
   LineSplitter _splitter;
 
   /// List implementation of a heap.
-  List<SolveState> _queue = new List<SolveState>(_INITIAL_CAPACITY);
+  List<SolveState> _queue = List<SolveState>(_INITIAL_CAPACITY);
 
   /// Number of elements in queue.
   /// The heap is implemented in the first [_length] entries of [_queue].
@@ -50,7 +50,7 @@
       var newCapacity = _queue.length * 2 + 1;
       if (newCapacity < _INITIAL_CAPACITY) newCapacity = _INITIAL_CAPACITY;
 
-      var newQueue = new List<SolveState>(newCapacity);
+      var newQueue = List<SolveState>(newCapacity);
       newQueue.setRange(0, _length, _queue);
       _queue = newQueue;
     }
diff --git a/dart_style/lib/src/line_writer.dart b/dart_style/lib/src/line_writer.dart
index 9fb5d39..2c6d103 100644
--- a/dart_style/lib/src/line_writer.dart
+++ b/dart_style/lib/src/line_writer.dart
@@ -13,7 +13,7 @@
 /// Given a series of chunks, splits them into lines and writes the result to
 /// a buffer.
 class LineWriter {
-  final _buffer = new StringBuffer();
+  final _buffer = StringBuffer();
 
   final List<Chunk> _chunks;
 
@@ -75,13 +75,13 @@
   ///
   /// When we format the anonymous lambda, [column] will be 2, not 4.
   FormatResult formatBlock(Chunk chunk, int column) {
-    var key = new _BlockKey(chunk, column);
+    var key = _BlockKey(chunk, column);
 
     // Use the cached one if we have it.
     var cached = _blockCache[key];
     if (cached != null) return cached;
 
-    var writer = new LineWriter._(
+    var writer = LineWriter._(
         chunk.block.chunks, _lineEnding, pageWidth, column, _blockCache);
 
     // TODO(rnystrom): Passing in an initial indent here is hacky. The
@@ -97,7 +97,7 @@
   /// Since this is linear and line splitting is worse it's good to feed the
   /// line splitter smaller lists of chunks when possible.
   FormatResult writeLines(int firstLineIndent,
-      {bool isCompilationUnit: false, bool flushLeft: false}) {
+      {bool isCompilationUnit = false, bool flushLeft = false}) {
     // Now that we know what hard splits there will be, break the chunks into
     // independently splittable lines.
     var newlines = 0;
@@ -127,7 +127,7 @@
     // Be a good citizen, end with a newline.
     if (isCompilationUnit) _buffer.write(_lineEnding);
 
-    return new FormatResult(
+    return FormatResult(
         _buffer.toString(), totalCost, _selectionStart, _selectionEnd);
   }
 
@@ -149,7 +149,7 @@
     }
 
     // Run the line splitter.
-    var splitter = new LineSplitter(this, chunks, _blockIndentation, indent,
+    var splitter = LineSplitter(this, chunks, _blockIndentation, indent,
         flushLeft: flushLeft);
     var splits = splitter.apply();
 
diff --git a/dart_style/lib/src/nesting_builder.dart b/dart_style/lib/src/nesting_builder.dart
index 2efebb3..bbae652 100644
--- a/dart_style/lib/src/nesting_builder.dart
+++ b/dart_style/lib/src/nesting_builder.dart
@@ -58,28 +58,17 @@
 
   /// The current nesting, ignoring any pending nesting.
   NestingLevel get nesting => _nesting;
-  NestingLevel _nesting = new NestingLevel();
+  NestingLevel _nesting = NestingLevel();
 
   /// The current nesting, including any pending nesting.
   NestingLevel get currentNesting =>
       _pendingNesting != null ? _pendingNesting : _nesting;
 
-  /// The top "nesting level" that represents no expression nesting for the
-  /// current block.
-  NestingLevel get blockNesting {
-    // Walk the nesting levels until we bottom out.
-    var result = _nesting;
-    while (result.parent != null) {
-      result = result.parent;
-    }
-    return result;
-  }
-
   /// Creates a new indentation level [spaces] deeper than the current one.
   ///
   /// If omitted, [spaces] defaults to [Indent.block].
   void indent([int spaces]) {
-    if (spaces == null) spaces = Indent.block;
+    spaces ??= Indent.block;
 
     // Indentation should only change outside of nesting.
     assert(_pendingNesting == null);
diff --git a/dart_style/lib/src/nesting_level.dart b/dart_style/lib/src/nesting_level.dart
index 4e74983..3be1a83 100644
--- a/dart_style/lib/src/nesting_level.dart
+++ b/dart_style/lib/src/nesting_level.dart
@@ -48,7 +48,7 @@
 
   /// Creates a new deeper level of nesting indented [spaces] more characters
   /// that the outer level.
-  NestingLevel nest(int spaces) => new NestingLevel._(this, spaces);
+  NestingLevel nest(int spaces) => NestingLevel._(this, spaces);
 
   /// Clears the previously calculated total indent of this nesting level.
   void clearTotalUsedIndent() {
diff --git a/dart_style/lib/src/rule/combinator.dart b/dart_style/lib/src/rule/combinator.dart
index 1d73031..29b2550 100644
--- a/dart_style/lib/src/rule/combinator.dart
+++ b/dart_style/lib/src/rule/combinator.dart
@@ -46,7 +46,7 @@
 /// the beginning of the line.
 class CombinatorRule extends Rule {
   /// The set of chunks before the combinators.
-  final Set<Chunk> _combinators = new Set();
+  final Set<Chunk> _combinators = Set();
 
   /// A list of sets of chunks prior to each name in a combinator.
   ///
@@ -72,7 +72,7 @@
   /// This must be called before adding any names.
   void addCombinator(Chunk chunk) {
     _combinators.add(chunk);
-    _names.add(new Set());
+    _names.add(Set());
   }
 
   /// Adds a chunk prior to a name to the current combinator.
diff --git a/dart_style/lib/src/rule/rule.dart b/dart_style/lib/src/rule/rule.dart
index fdda621..acca87f 100644
--- a/dart_style/lib/src/rule/rule.dart
+++ b/dart_style/lib/src/rule/rule.dart
@@ -59,7 +59,7 @@
   ///
   /// This contains all direct as well as transitive relationships. If A
   /// contains B which contains C, C's outerRules contains both B and A.
-  final Set<Rule> _implied = new Set<Rule>();
+  final Set<Rule> _implied = Set<Rule>();
 
   /// Marks [other] as implied by this one.
   ///
@@ -172,7 +172,7 @@
         rule.constrainedRules.forEach(visit);
       }
 
-      _allConstrainedRules = new Set();
+      _allConstrainedRules = Set();
       visit(this);
     }
 
diff --git a/dart_style/lib/src/source_code.dart b/dart_style/lib/src/source_code.dart
index a79c220..061a0f3 100644
--- a/dart_style/lib/src/source_code.dart
+++ b/dart_style/lib/src/source_code.dart
@@ -51,32 +51,32 @@
 
   SourceCode(this.text,
       {this.uri,
-      this.isCompilationUnit: true,
+      this.isCompilationUnit = true,
       this.selectionStart,
       this.selectionLength}) {
     // Must either provide both selection bounds or neither.
     if ((selectionStart == null) != (selectionLength == null)) {
-      throw new ArgumentError(
+      throw ArgumentError(
           "Is selectionStart is provided, selectionLength must be too.");
     }
 
     if (selectionStart != null) {
       if (selectionStart < 0) {
-        throw new ArgumentError("selectionStart must be non-negative.");
+        throw ArgumentError("selectionStart must be non-negative.");
       }
 
       if (selectionStart > text.length) {
-        throw new ArgumentError("selectionStart must be within text.");
+        throw ArgumentError("selectionStart must be within text.");
       }
     }
 
     if (selectionLength != null) {
       if (selectionLength < 0) {
-        throw new ArgumentError("selectionLength must be non-negative.");
+        throw ArgumentError("selectionLength must be non-negative.");
       }
 
       if (selectionStart + selectionLength > text.length) {
-        throw new ArgumentError("selectionLength must end within text.");
+        throw ArgumentError("selectionLength must end within text.");
       }
     }
   }
diff --git a/dart_style/lib/src/source_visitor.dart b/dart_style/lib/src/source_visitor.dart
index 6aa452a..8d649c0 100644
--- a/dart_style/lib/src/source_visitor.dart
+++ b/dart_style/lib/src/source_visitor.dart
@@ -23,7 +23,7 @@
 import 'style_fix.dart';
 import 'whitespace.dart';
 
-final _capitalPattern = new RegExp(r"^_?[A-Z].*[a-z]");
+final _capitalPattern = RegExp(r"^_?[A-Z].*[a-z]");
 
 /// Visits every token of the AST and passes all of the relevant bits to a
 /// [ChunkBuilder].
@@ -153,12 +153,17 @@
   /// Before a block argument is visited, [ArgumentSublist] binds itself to the
   /// beginning token of each block it controls. When we later visit that
   /// literal, we use the token to find that association.
-  final Map<Token, ArgumentSublist> _blockArgumentLists = {};
+  ///
+  /// This mapping is also used for spread collection literals that appear
+  /// inside control flow elements to ensure that when a "then" collection
+  /// splits, the corresponding "else" one does too.
+  final Map<Token, Rule> _blockRules = {};
+  final Map<Token, Chunk> _blockPreviousChunks = {};
 
   /// Initialize a newly created visitor to write source code representing
   /// the visited nodes to the given [writer].
   SourceVisitor(this._formatter, this._lineInfo, this._source) {
-    builder = new ChunkBuilder(_formatter, _source);
+    builder = ChunkBuilder(_formatter, _source);
   }
 
   /// Runs the visitor on [node], formatting its contents.
@@ -181,9 +186,70 @@
   }
 
   visitAdjacentStrings(AdjacentStrings node) {
+    // We generally want to indent adjacent strings because it can be confusing
+    // otherwise when they appear in a list of expressions, like:
+    //
+    //     [
+    //       "one",
+    //       "two"
+    //       "three",
+    //       "four"
+    //     ]
+    //
+    // Especially when these stings are longer, it can be hard to tell that
+    // "three" is a continuation of the previous argument.
+    //
+    // However, the indentation is distracting in argument lists that don't
+    // suffer from this ambiguity:
+    //
+    //     test(
+    //         "A very long test description..."
+    //             "this indentation looks bad.", () { ... });
+    //
+    // To balance these, we omit the indentation when an adjacent string
+    // expression is the only string in an argument list.
+    var shouldNest = true;
+
+    var parent = node.parent;
+    if (parent is ArgumentList) {
+      shouldNest = false;
+
+      for (var argument in parent.arguments) {
+        if (argument == node) continue;
+        if (argument is StringLiteral) {
+          shouldNest = true;
+          break;
+        }
+      }
+    } else if (parent is Assertion) {
+      // Treat asserts like argument lists.
+      shouldNest = false;
+      if (parent.condition != node && parent.condition is StringLiteral) {
+        shouldNest = true;
+      }
+
+      if (parent.message != node && parent.message is StringLiteral) {
+        shouldNest = true;
+      }
+    } else if (parent is VariableDeclaration ||
+        parent is AssignmentExpression &&
+            parent.rightHandSide == node &&
+            parent.parent is ExpressionStatement) {
+      // Don't add extra indentation in a variable initializer or assignment:
+      //
+      //     var variable =
+      //         "no extra"
+      //         "indent";
+      shouldNest = false;
+    } else if (parent is NamedExpression || parent is ExpressionFunctionBody) {
+      shouldNest = false;
+    }
+
     builder.startSpan();
     builder.startRule();
+    if (shouldNest) builder.nestExpression();
     visitNodes(node.strings, between: splitOrNewline);
+    if (shouldNest) builder.unnest();
     builder.endRule();
     builder.endSpan();
   }
@@ -211,7 +277,7 @@
   /// 4. Split between one or more positional arguments, trying to keep as many
   ///    on earlier lines as possible.
   /// 5. Split the named arguments each onto their own line.
-  visitArgumentList(ArgumentList node, {bool nestExpression: true}) {
+  visitArgumentList(ArgumentList node, {bool nestExpression = true}) {
     // Corner case: handle empty argument lists.
     if (node.arguments.isEmpty) {
       token(node.leftParenthesis);
@@ -233,7 +299,7 @@
     }
 
     if (nestExpression) builder.nestExpression();
-    new ArgumentListVisitor(this, node).visit();
+    ArgumentListVisitor(this, node).visit();
     if (nestExpression) builder.unnest();
   }
 
@@ -255,8 +321,17 @@
     var arguments = <Expression>[node.condition];
     if (node.message != null) arguments.add(node.message);
 
+    // If the argument list has a trailing comma, format it like a collection
+    // literal where each argument goes on its own line, they are indented +2,
+    // and the ")" ends up on its own line.
+    if (arguments.last.endToken.next.type == TokenType.COMMA) {
+      _visitCollectionLiteral(
+          null, node.leftParenthesis, arguments, node.rightParenthesis);
+      return;
+    }
+
     builder.nestExpression();
-    var visitor = new ArgumentListVisitor.forArguments(
+    var visitor = ArgumentListVisitor.forArguments(
         this, node.leftParenthesis, node.rightParenthesis, arguments);
     visitor.visit();
     builder.unnest();
@@ -269,7 +344,16 @@
       var arguments = [node.condition];
       if (node.message != null) arguments.add(node.message);
 
-      var visitor = new ArgumentListVisitor.forArguments(
+      // If the argument list has a trailing comma, format it like a collection
+      // literal where each argument goes on its own line, they are indented +2,
+      // and the ")" ends up on its own line.
+      if (arguments.last.endToken.next.type == TokenType.COMMA) {
+        _visitCollectionLiteral(
+            null, node.leftParenthesis, arguments, node.rightParenthesis);
+        return;
+      }
+
+      var visitor = ArgumentListVisitor.forArguments(
           this, node.leftParenthesis, node.rightParenthesis, arguments);
       visitor.visit();
     });
@@ -434,8 +518,7 @@
     // If the cascade sections have consistent names they can be broken
     // normally otherwise they always get their own line.
     if (splitIfOperandsSplit) {
-      builder.startLazyRule(
-          _allowInlineCascade(node) ? new Rule() : new Rule.hard());
+      builder.startLazyRule(_allowInlineCascade(node) ? Rule() : Rule.hard());
     }
 
     // If the target of the cascade is a method call (or chain of them), we
@@ -458,7 +541,7 @@
     //           ..cascade()
     //           ..cascade();
     if (node.target is MethodInvocation) {
-      new CallChainVisitor(this, node.target).visit(unnest: false);
+      CallChainVisitor(this, node.target).visit(unnest: false);
     } else {
       visit(node.target);
     }
@@ -469,8 +552,7 @@
     // If the cascade section shouldn't cause the cascade to split, end the
     // rule early so it isn't affected by it.
     if (!splitIfOperandsSplit) {
-      builder
-          .startRule(_allowInlineCascade(node) ? new Rule() : new Rule.hard());
+      builder.startRule(_allowInlineCascade(node) ? Rule() : Rule.hard());
     }
 
     zeroSplit();
@@ -593,7 +675,7 @@
     visit(node.typeParameters);
     visit(node.extendsClause);
 
-    builder.startRule(new CombinatorRule());
+    builder.startRule(CombinatorRule());
     visit(node.withClause);
     visit(node.implementsClause);
     builder.endRule();
@@ -622,7 +704,7 @@
 
       visit(node.superclass);
 
-      builder.startRule(new CombinatorRule());
+      builder.startRule(CombinatorRule());
       visit(node.withClause);
       visit(node.implementsClause);
       builder.endRule();
@@ -972,7 +1054,7 @@
 
       _visitConfigurations(node.configurations);
 
-      builder.startRule(new CombinatorRule());
+      builder.startRule(CombinatorRule());
       visitNodes(node.combinators);
       builder.endRule();
     });
@@ -1049,7 +1131,7 @@
   }
 
   visitFormalParameterList(FormalParameterList node,
-      {bool nestExpression: true}) {
+      {bool nestExpression = true}) {
     // Corner case: empty parameter lists.
     if (node.parameters.isEmpty) {
       token(node.leftParenthesis);
@@ -1079,11 +1161,11 @@
     if (nestExpression) builder.nestExpression();
     token(node.leftParenthesis);
 
-    _metadataRules.add(new MetadataRule());
+    _metadataRules.add(MetadataRule());
 
     var rule;
     if (requiredParams.isNotEmpty) {
-      rule = new PositionalRule(null, 0, 0);
+      rule = PositionalRule(null, 0, 0);
       _metadataRules.last.bindPositionalRule(rule);
 
       builder.startRule(rule);
@@ -1115,7 +1197,7 @@
     }
 
     if (optionalParams.isNotEmpty) {
-      var namedRule = new NamedRule(null, 0, 0);
+      var namedRule = NamedRule(null, 0, 0);
       if (rule != null) rule.setNamedArgsRule(namedRule);
 
       _metadataRules.last.bindNamedRule(namedRule);
@@ -1154,7 +1236,46 @@
     if (nestExpression) builder.unnest();
   }
 
-  visitForStatement2(ForStatement2 node) {
+  void visitForElement(ForElement node) {
+    // Treat a spread of a collection literal like a block in a for statement
+    // and don't split after the for parts.
+    var isSpreadBody = _isSpreadCollection(node.body);
+
+    builder.nestExpression();
+    token(node.awaitKeyword, after: space);
+    token(node.forKeyword);
+    space();
+    token(node.leftParenthesis);
+
+    // Start the body rule so that if the parts split, the body does too.
+    builder.startRule();
+
+    // The rule for the parts.
+    builder.startRule();
+    visit(node.forLoopParts);
+    token(node.rightParenthesis);
+    builder.endRule();
+    builder.unnest();
+
+    builder.nestExpression(indent: 2, now: true);
+
+    if (isSpreadBody) {
+      space();
+    } else {
+      split();
+
+      // If the body is a non-spread collection or lambda, indent it.
+      builder.startBlockArgumentNesting();
+    }
+
+    visit(node.body);
+
+    if (!isSpreadBody) builder.endBlockArgumentNesting();
+    builder.unnest();
+    builder.endRule();
+  }
+
+  visitForStatement(ForStatement node) {
     builder.nestExpression();
     token(node.awaitKeyword, after: space);
     token(node.forKeyword);
@@ -1387,6 +1508,104 @@
     _visitCombinator(node.keyword, node.hiddenNames);
   }
 
+  void visitIfElement(IfElement node) {
+    // Wrap the whole thing in a single rule. If a split happens inside the
+    // condition or the then clause, we want the then and else clauses to split.
+    builder.startRule();
+
+    token(node.ifKeyword);
+    space();
+    token(node.leftParenthesis);
+    visit(node.condition);
+    token(node.rightParenthesis);
+
+    // If the body of the then or else branch is a spread of a collection
+    // literal, then we want to format those collections more like blocks than
+    // like standalone objects. In particular, if both the then and else branch
+    // are spread collection literals, we want to ensure that they both split
+    // if either splits. So this:
+    //
+    //     [
+    //       if (condition) ...[
+    //         thenClause
+    //       ] else ...[
+    //         elseClause
+    //       ]
+    //     ]
+    //
+    // And not something like this:
+    //
+    //     [
+    //       if (condition) ...[
+    //         thenClause
+    //       ] else ...[elseClause]
+    //     ]
+    //
+    // To do that, if we see that either clause is a spread collection, we
+    // create a single rule and force both collections to use it.
+    var thenSpreadBracket = _findSpreadCollectionBracket(node.thenElement);
+    var elseSpreadBracket = _findSpreadCollectionBracket(node.elseElement);
+
+    if (thenSpreadBracket != null || elseSpreadBracket != null) {
+      var spreadRule = Rule();
+      if (thenSpreadBracket != null) {
+        beforeBlock(thenSpreadBracket, spreadRule, null);
+      }
+
+      if (elseSpreadBracket != null) {
+        beforeBlock(elseSpreadBracket, spreadRule, null);
+      }
+    }
+
+    builder.nestExpression(indent: 2, now: true);
+
+    // Treat a spread of a collection literal like a block in an if statement
+    // and don't split after the "else".
+    if (thenSpreadBracket != null) {
+      space();
+    } else {
+      split();
+
+      // If the then clause is a non-spread collection or lambda, make sure the
+      // body is indented.
+      builder.startBlockArgumentNesting();
+    }
+
+    visit(node.thenElement);
+
+    if (thenSpreadBracket == null) builder.endBlockArgumentNesting();
+    builder.unnest();
+
+    if (node.elseElement != null) {
+      if (thenSpreadBracket != null) {
+        space();
+      } else {
+        split();
+      }
+
+      token(node.elseKeyword);
+
+      builder.nestExpression(indent: 2, now: true);
+
+      if (elseSpreadBracket != null) {
+        space();
+      } else {
+        split();
+
+        // If the else clause is a non-spread collection or lambda, make sure
+        // the body is indented.
+        builder.startBlockArgumentNesting();
+      }
+
+      visit(node.elseElement);
+
+      if (elseSpreadBracket == null) builder.endBlockArgumentNesting();
+      builder.unnest();
+    }
+
+    builder.endRule();
+  }
+
   visitIfStatement(IfStatement node) {
     builder.nestExpression();
     token(node.ifKeyword);
@@ -1460,7 +1679,7 @@
         visit(node.prefix);
       }
 
-      builder.startRule(new CombinatorRule());
+      builder.startRule(CombinatorRule());
       visitNodes(node.combinators);
       builder.endRule();
     });
@@ -1604,17 +1823,18 @@
   visitListLiteral(ListLiteral node) {
     // Corner case: Splitting inside a list looks bad if there's only one
     // element, so make those more costly.
-    var cost =
-        node.elements2.length <= 1 ? Cost.singleElementList : Cost.normal;
+    var cost = node.elements.length <= 1 ? Cost.singleElementList : Cost.normal;
     _visitCollectionLiteral(
-        node, node.leftBracket, node.elements2, node.rightBracket, cost);
+        node, node.leftBracket, node.elements, node.rightBracket, cost);
   }
 
   visitMapLiteralEntry(MapLiteralEntry node) {
+    builder.nestExpression();
     visit(node.key);
     token(node.separator);
     soloSplit();
     visit(node.value);
+    builder.unnest();
   }
 
   visitMethodDeclaration(MethodDeclaration node) {
@@ -1672,7 +1892,7 @@
       return;
     }
 
-    new CallChainVisitor(this, node).visit();
+    CallChainVisitor(this, node).visit();
   }
 
   visitMixinDeclaration(MixinDeclaration node) {
@@ -1694,7 +1914,7 @@
       visit(node.onClause.superclassConstraints.single);
     }
 
-    builder.startRule(new CombinatorRule());
+    builder.startRule(CombinatorRule());
 
     // If there are multiple superclass constraints, format them like the
     // "implements" clause.
@@ -1779,7 +1999,7 @@
   }
 
   visitPrefixedIdentifier(PrefixedIdentifier node) {
-    new CallChainVisitor(this, node).visit();
+    CallChainVisitor(this, node).visit();
   }
 
   visitPrefixExpression(PrefixExpression node) {
@@ -1803,7 +2023,7 @@
       return;
     }
 
-    new CallChainVisitor(this, node).visit();
+    CallChainVisitor(this, node).visit();
   }
 
   visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
@@ -1839,7 +2059,7 @@
 
   visitSetOrMapLiteral(SetOrMapLiteral node) {
     _visitCollectionLiteral(
-        node, node.leftBracket, node.elements2, node.rightBracket);
+        node, node.leftBracket, node.elements, node.rightBracket);
   }
 
   visitShowCombinator(ShowCombinator node) {
@@ -1882,6 +2102,11 @@
     _writeStringLiteral(node.literal);
   }
 
+  visitSpreadElement(SpreadElement node) {
+    token(node.spreadOperator);
+    visit(node.expression);
+  }
+
   visitStringInterpolation(StringInterpolation node) {
     for (var element in node.elements) {
       visit(element);
@@ -2009,7 +2234,7 @@
   }
 
   visitTypeParameterList(TypeParameterList node) {
-    _metadataRules.add(new MetadataRule());
+    _metadataRules.add(MetadataRule());
 
     _visitGenericList(node.leftBracket, node.rightBracket, node.typeParameters);
 
@@ -2198,7 +2423,7 @@
   /// If [nest] is true, an extra level of expression nesting is added after
   /// the "=".
   void _visitAssignment(Token equalsOperator, Expression rightHandSide,
-      {bool nest: false}) {
+      {bool nest = false}) {
     space();
     token(equalsOperator);
 
@@ -2215,7 +2440,7 @@
   /// Visits a type parameter or type argument list.
   void _visitGenericList(
       Token leftBracket, Token rightBracket, List<AstNode> nodes) {
-    var rule = new TypeArgumentRule();
+    var rule = TypeArgumentRule();
     builder.startLazyRule(rule);
     builder.startSpan();
     builder.nestExpression();
@@ -2345,7 +2570,7 @@
       builder.nestExpression();
 
       // This rule is ended by visitExpressionFunctionBody().
-      builder.startLazyRule(new Rule(Cost.arrow));
+      builder.startLazyRule(Rule(Cost.arrow));
     }
 
     _visitParameterSignature(typeParameters, parameters);
@@ -2481,13 +2706,13 @@
       // on the same line all share an argument-list-like rule that allows
       // splitting between zero, one, or all of them. This is faster in long
       // lists than using individual splits after each element.
-      lineRule = new TypeArgumentRule();
+      lineRule = TypeArgumentRule();
       builder.startLazyRule(lineRule);
     } else {
       // Newlines aren't significant, so use a hard rule to split the elements.
       // The parent chunk of the collection will handle the unsplit case, so
       // this only comes into play when the collection is split.
-      rule = new Rule.hard();
+      rule = Rule.hard();
       builder.startRule(rule);
     }
 
@@ -2501,7 +2726,7 @@
 
             // Start a new rule for the new line.
             builder.endRule();
-            lineRule = new TypeArgumentRule();
+            lineRule = TypeArgumentRule();
             builder.startLazyRule(lineRule);
           } else {
             lineRule.beforeArgument(split());
@@ -2511,15 +2736,12 @@
         }
       }
 
-      builder.nestExpression();
       visit(element);
 
       // The comma after the element.
       if (element.endToken.next.type == TokenType.COMMA) {
         token(element.endToken.next);
       }
-
-      builder.unnest();
     }
 
     builder.endRule();
@@ -2550,10 +2772,10 @@
     // Can't have a trailing comma if there are no parameters.
     assert(parameters.parameters.isNotEmpty);
 
-    _metadataRules.add(new MetadataRule());
+    _metadataRules.add(MetadataRule());
 
     // Always split the parameters.
-    builder.startRule(new Rule.hard());
+    builder.startRule(Rule.hard());
 
     token(parameters.leftParenthesis);
 
@@ -2612,7 +2834,7 @@
 
   /// Begins writing a formal parameter of any kind.
   void _beginFormalParameter(FormalParameter node) {
-    builder.startLazyRule(new Rule(Cost.parameterType));
+    builder.startLazyRule(Rule(Cost.parameterType));
     builder.nestExpression();
     modifier(node.covariantKeyword);
   }
@@ -2678,6 +2900,27 @@
     builder.endRule();
   }
 
+  /// Whether [node] is a spread of a collection literal.
+  bool _isSpreadCollection(AstNode node) =>
+      _findSpreadCollectionBracket(node) != null;
+
+  /// If [node] is a spread of a collection literal, then this returns the
+  /// token for the opening bracket of the collection, as in:
+  ///
+  ///     [ ...[a, list] ]
+  ///     //   ^
+  ///
+  /// Otherwise, returns `null`.
+  Token _findSpreadCollectionBracket(AstNode node) {
+    if (node is SpreadElement) {
+      var expression = node.expression;
+      if (expression is ListLiteral) return expression.leftBracket;
+      if (expression is SetOrMapLiteral) return expression.leftBracket;
+    }
+
+    return null;
+  }
+
   /// Gets the cost to split at an assignment (or `:` in the case of a named
   /// default value) with the given [rightHandSide].
   ///
@@ -2741,14 +2984,17 @@
   void _startLiteralBody(Token leftBracket) {
     token(leftBracket);
 
-    // See if this literal is associated with an argument list that wants to
-    // handle splitting and indenting it. If not, we'll use a default rule.
-    var rule;
-    var argumentChunk;
-    if (_blockArgumentLists.containsKey(leftBracket)) {
-      var argumentList = _blockArgumentLists[leftBracket];
-      rule = argumentList.blockRule;
-      argumentChunk = argumentList.previousSplit;
+    // See if this literal is associated with an argument list or if element
+    // that wants to handle splitting and indenting it. If not, we'll use a
+    // default rule.
+    Rule rule;
+    if (_blockRules.containsKey(leftBracket)) {
+      rule = _blockRules[leftBracket];
+    }
+
+    Chunk argumentChunk;
+    if (_blockPreviousChunks.containsKey(leftBracket)) {
+      argumentChunk = _blockPreviousChunks[leftBracket];
     }
 
     // Create a rule for whether or not to split the block contents.
@@ -2844,17 +3090,20 @@
   }
 
   /// Marks the block that starts with [token] as being controlled by
-  /// [argumentList].
+  /// [rule] and following [previousChunk].
   ///
-  /// When the block is visited, [argumentList] will determine the
-  /// indentation and splitting rule for the block.
-  void beforeBlock(Token token, ArgumentSublist argumentList) {
-    _blockArgumentLists[token] = argumentList;
+  /// When the block is visited, these will determine the indentation and
+  /// splitting rule for the block. These are used for handling block-like
+  /// expressions inside argument lists and spread collections inside if
+  /// elements.
+  void beforeBlock(Token token, Rule rule, [Chunk previousChunk]) {
+    _blockRules[token] = rule;
+    if (previousChunk != null) _blockPreviousChunks[token] = previousChunk;
   }
 
   /// Writes the beginning of a brace-delimited body and handles indenting and
   /// starting the rule used to split the contents.
-  void _beginBody(Token leftBracket, {bool space: false}) {
+  void _beginBody(Token leftBracket, {bool space = false}) {
     token(leftBracket);
 
     // Indent the body.
@@ -2866,7 +3115,7 @@
   }
 
   /// Finishes the body started by a call to [_beginBody].
-  void _endBody(Token rightBracket, {bool space: false}) {
+  void _endBody(Token rightBracket, {bool space = false}) {
     token(rightBracket, before: () {
       // Split before the closing bracket character.
       builder.unindent();
@@ -2960,7 +3209,7 @@
 
   /// Writes a single space split with its own rule.
   Rule soloSplit([int cost]) {
-    var rule = new Rule(cost);
+    var rule = Rule(cost);
     builder.startRule(rule);
     split();
     builder.endRule();
@@ -3037,7 +3286,7 @@
         if (comment == token.precedingComments) linesBefore = 2;
       }
 
-      var sourceComment = new SourceComment(text, linesBefore,
+      var sourceComment = SourceComment(text, linesBefore,
           isLineComment: comment.type == TokenType.SINGLE_LINE_COMMENT,
           flushLeft: flushLeft);
 
diff --git a/dart_style/lib/src/style_fix.dart b/dart_style/lib/src/style_fix.dart
index f15d7f6..b23f3b8 100644
--- a/dart_style/lib/src/style_fix.dart
+++ b/dart_style/lib/src/style_fix.dart
@@ -6,23 +6,22 @@
 /// Enum-like class for the different syntactic fixes that can be applied while
 /// formatting.
 class StyleFix {
-  static const docComments = const StyleFix._(
+  static const docComments = StyleFix._(
       "doc-comments", 'Use triple slash for documentation comments.');
 
-  static const functionTypedefs = const StyleFix._(
+  static const functionTypedefs = StyleFix._(
       "function-typedefs", 'Use new syntax for function type typedefs.');
 
-  static const namedDefaultSeparator = const StyleFix._(
-      "named-default-separator",
+  static const namedDefaultSeparator = StyleFix._("named-default-separator",
       'Use "=" as the separator before named parameter default values.');
 
-  static const optionalConst = const StyleFix._(
+  static const optionalConst = StyleFix._(
       "optional-const", 'Remove "const" keyword inside constant context.');
 
   static const optionalNew =
-      const StyleFix._("optional-new", 'Remove "new" keyword.');
+      StyleFix._("optional-new", 'Remove "new" keyword.');
 
-  static const all = const [
+  static const all = [
     docComments,
     functionTypedefs,
     namedDefaultSeparator,
diff --git a/dart_style/lib/src/whitespace.dart b/dart_style/lib/src/whitespace.dart
index c405063..aff33c1 100644
--- a/dart_style/lib/src/whitespace.dart
+++ b/dart_style/lib/src/whitespace.dart
@@ -26,33 +26,33 @@
 /// encountered to avoid trailing whitespace.
 class Whitespace {
   /// No whitespace.
-  static const none = const Whitespace._("none");
+  static const none = Whitespace._("none");
 
   /// A single non-breaking space.
-  static const space = const Whitespace._("space");
+  static const space = Whitespace._("space");
 
   /// A single newline.
-  static const newline = const Whitespace._("newline");
+  static const newline = Whitespace._("newline");
 
   /// A single newline that takes into account the current expression nesting
   /// for the next line.
-  static const nestedNewline = const Whitespace._("nestedNewline");
+  static const nestedNewline = Whitespace._("nestedNewline");
 
   /// A single newline with all indentation eliminated at the beginning of the
   /// next line.
   ///
   /// Used for subsequent lines in a multiline string.
-  static const newlineFlushLeft = const Whitespace._("newlineFlushLeft");
+  static const newlineFlushLeft = Whitespace._("newlineFlushLeft");
 
   /// Two newlines, a single blank line of separation.
-  static const twoNewlines = const Whitespace._("twoNewlines");
+  static const twoNewlines = Whitespace._("twoNewlines");
 
   /// A split or newline should be output based on whether the current token is
   /// on the same line as the previous one or not.
   ///
   /// In general, we like to avoid using this because it makes the formatter
   /// less prescriptive over the user's whitespace.
-  static const splitOrNewline = const Whitespace._("splitOrNewline");
+  static const splitOrNewline = Whitespace._("splitOrNewline");
 
   /// A split or blank line (two newlines) should be output based on whether
   /// the current token is on the same line as the previous one or not.
@@ -62,14 +62,14 @@
   ///
   /// In general, we like to avoid using this because it makes the formatter
   /// less prescriptive over the user's whitespace.
-  static const splitOrTwoNewlines = const Whitespace._("splitOrTwoNewlines");
+  static const splitOrTwoNewlines = Whitespace._("splitOrTwoNewlines");
 
   /// One or two newlines should be output based on how many newlines are
   /// present between the next token and the previous one.
   ///
   /// In general, we like to avoid using this because it makes the formatter
   /// less prescriptive over the user's whitespace.
-  static const oneOrTwoNewlines = const Whitespace._("oneOrTwoNewlines");
+  static const oneOrTwoNewlines = Whitespace._("oneOrTwoNewlines");
 
   final String name;
 
diff --git a/dart_style/pubspec.yaml b/dart_style/pubspec.yaml
index 386d163..fec1a76 100644
--- a/dart_style/pubspec.yaml
+++ b/dart_style/pubspec.yaml
@@ -1,26 +1,26 @@
 name: dart_style
 # Note: See tool/grind.dart for how to bump the version.
-version: 1.2.4
+version: 1.2.7
 author: Dart Team <misc@dartlang.org>
-description: Opinionated, automatic Dart source code formatter.
+description: >-
+  Opinionated, automatic Dart source code formatter.
+  Provides an API and a CLI tool.
 homepage: https://github.com/dart-lang/dart_style
 
 environment:
-  sdk: '>=2.0.0 <3.0.0'
+  sdk: '>=2.1.0 <3.0.0'
 
 dependencies:
-  analyzer: '>=0.35.3 <0.36.0'
+  analyzer: '>=0.36.0 <0.37.0'
   args: '>=0.12.1 <2.0.0'
   path: ^1.0.0
   source_span: ^1.4.0
 
 dev_dependencies:
-  async: '>=1.0.0 <=3.0.0'
   grinder: ^0.8.0
-  js: ^0.6.0
-  node_preamble: ^1.0.0
+  pedantic: ^1.0.0
   pub_semver: ^1.2.3
-  test: ^1.2.0
+  test: ^1.6.0
   test_descriptor: ^1.0.0
   test_process: ^1.0.0
   yaml: ^2.0.0
diff --git a/dart_style/tool/grind.dart b/dart_style/tool/grind.dart
index 31938d1..d5d794d 100644
--- a/dart_style/tool/grind.dart
+++ b/dart_style/tool/grind.dart
@@ -2,16 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:convert';
-import 'dart:io';
-
 import 'package:grinder/grinder.dart';
-import "package:node_preamble/preamble.dart" as preamble;
 import 'package:pub_semver/pub_semver.dart';
 import 'package:yaml/yaml.dart' as yaml;
 
 /// Matches the version line in dart_style's pubspec.
-final _versionPattern = new RegExp(r"^version: .*$", multiLine: true);
+final _versionPattern = RegExp(r"^version: .*$", multiLine: true);
 
 main(List<String> args) => grind(args);
 
@@ -19,7 +15,7 @@
 @Task()
 validate() async {
   // Test it.
-  await new TestRunner().testAsync();
+  await TestRunner().testAsync();
 
   // Make sure it's warning clean.
   Analyzer.analyze("bin/format.dart", fatalWarnings: true);
@@ -28,41 +24,6 @@
   Dart.run("bin/format.dart", arguments: ["-w", "."]);
 }
 
-@Task('Publish to npm')
-npm() {
-  var out = 'dist';
-
-  var pubspec = yaml.loadYaml(getFile("pubspec.yaml").readAsStringSync());
-  var homepage = pubspec["homepage"];
-  var fileName = 'index.js';
-
-  // Generate modified dart2js output suitable to run on node.
-  var tempFile = new File('${Directory.systemTemp.path}/temp.js');
-
-  Dart2js.compile(new File('tool/node_format_service.dart'),
-      outFile: tempFile, categories: 'all');
-  var dart2jsOutput = tempFile.readAsStringSync();
-  new File('$out/$fileName').writeAsStringSync('''${preamble.getPreamble()}
-self.exports = exports; // Temporary hack for Dart-JS Interop under node.
-$dart2jsOutput''');
-
-  new File('$out/package.json')
-      .writeAsStringSync(const JsonEncoder.withIndent('  ').convert({
-    "name": "dart-style",
-    "version": pubspec["version"],
-    "description": pubspec["description"],
-    "main": fileName,
-    "typings": "dart-style.d.ts",
-    "scripts": {"test": "echo \"Error: no test specified\" && exit 1"},
-    "repository": {"type": "git", "url": "git+$homepage"},
-    "author": pubspec["author"],
-    "license": "BSD",
-    "bugs": {"url": "$homepage/issues"},
-    "homepage": homepage
-  }));
-  run('npm', arguments: ['publish', out]);
-}
-
 /// Gets ready to publish a new version of the package.
 ///
 /// To publish a version, you need to:
@@ -99,7 +60,7 @@
   // Read the version from the pubspec.
   var pubspecFile = getFile("pubspec.yaml");
   var pubspec = pubspecFile.readAsStringSync();
-  var version = new Version.parse(yaml.loadYaml(pubspec)["version"]);
+  var version = Version.parse(yaml.loadYaml(pubspec)["version"]);
 
   // Require a "-dev" version since we don't otherwise know what to bump it to.
   if (!version.isPreRelease) throw "Cannot publish non-dev version $version.";
@@ -108,7 +69,7 @@
   // user intended the "+4" to be discarded or not.
   if (version.build.isNotEmpty) throw "Cannot publish build version $version.";
 
-  var bumped = new Version(version.major, version.minor, version.patch);
+  var bumped = Version(version.major, version.minor, version.patch);
 
   // Update the version in the pubspec.
   pubspec = pubspec.replaceAll(_versionPattern, "version: $bumped");
@@ -117,7 +78,7 @@
   // Update the version constant in bin/format.dart.
   var binFormatFile = getFile("bin/format.dart");
   var binFormat = binFormatFile.readAsStringSync().replaceAll(
-      new RegExp(r'const version = "[^"]+";'), 'const version = "$bumped";');
+      RegExp(r'const version = "[^"]+";'), 'const version = "$bumped";');
   binFormatFile.writeAsStringSync(binFormat);
 
   // Update the version in the CHANGELOG.
diff --git a/dart_style/tool/node_format_service.dart b/dart_style/tool/node_format_service.dart
deleted file mode 100644
index d063a3d..0000000
--- a/dart_style/tool/node_format_service.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:math' as math;
-
-import 'package:js/js.dart';
-
-import 'package:dart_style/dart_style.dart';
-
-@JS()
-@anonymous
-class FormatResult {
-  external factory FormatResult({String code, String error});
-  external String get code;
-  external String get error;
-}
-
-@JS('exports.formatCode')
-external set formatCode(Function formatter);
-
-void main() {
-  formatCode = allowInterop((String source) {
-    var formatter = new DartFormatter();
-
-    var exception;
-    try {
-      return new FormatResult(code: new DartFormatter().format(source));
-    } on FormatterException catch (err) {
-      // Couldn't parse it as a compilation unit.
-      exception = err;
-    }
-
-    // Maybe it's a statement.
-    try {
-      return new FormatResult(code: formatter.formatStatement(source));
-    } on FormatterException catch (err) {
-      // There is an error when parsing it both as a compilation unit and a
-      // statement, so we aren't sure which one the user intended. As a
-      // heuristic, we'll choose that whichever one we managed to parse more of
-      // before hitting an error is probably the right one.
-      if (_firstOffset(exception) < _firstOffset(err)) {
-        exception = err;
-      }
-    }
-
-    // If we get here, it couldn't be parsed at all.
-    return new FormatResult(code: source, error: "$exception");
-  });
-}
-
-/// Returns the offset of the error nearest the beginning of the file out of
-/// all the errors in [exception].
-int _firstOffset(FormatterException exception) =>
-    exception.errors.map((error) => error.offset).reduce(math.min);
diff --git a/front_end/BUILD.gn b/front_end/BUILD.gn
index 8e3e7e4..8d49d8f 100644
--- a/front_end/BUILD.gn
+++ b/front_end/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for front_end-0.1.14
+# This file is generated by importer.py for front_end-0.1.18
 
 import("//build/dart/dart_library.gni")
 
@@ -13,13 +13,8 @@
 
   deps = [
     "//third_party/dart-pkg/pub/kernel",
-    "//third_party/dart-pkg/pub/convert",
-    "//third_party/dart-pkg/pub/package_config",
-    "//third_party/dart-pkg/pub/crypto",
-    "//third_party/dart-pkg/pub/yaml",
-    "//third_party/dart-pkg/pub/meta",
     "//third_party/dart-pkg/pub/path",
-    "//third_party/dart-pkg/pub/source_span",
-    "//third_party/dart-pkg/pub/charcode",
+    "//third_party/dart-pkg/pub/package_config",
+    "//third_party/dart-pkg/pub/yaml",
   ]
 }
diff --git a/front_end/lib/src/api_prototype/compiler_options.dart b/front_end/lib/src/api_prototype/compiler_options.dart
index a1c0ef4..1d75bc5 100644
--- a/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/front_end/lib/src/api_prototype/compiler_options.dart
@@ -8,7 +8,8 @@
 
 import 'diagnostic_message.dart' show DiagnosticMessageHandler;
 
-import 'experimental_flags.dart' show ExperimentalFlag, parseExperimentalFlag;
+import 'experimental_flags.dart'
+    show defaultExperimentalFlags, ExperimentalFlag, parseExperimentalFlag;
 
 import 'file_system.dart' show FileSystem;
 
@@ -133,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:
@@ -209,30 +215,38 @@
 
 /// Parse experimental flags from a list of strings, each of which is either a
 /// flag name or a flag name prefixed by 'no-'. Return a map of flags to their
-/// values that can be passed to [experimentalFlags].
+/// values that can be passed to [experimentalFlags]. The returned map is
+/// normalized to contain default values for unmentioned flags.
 ///
 /// If an unknown flag is mentioned, or a flag is mentioned more than once,
 /// the supplied error handler is called with an error message.
 Map<ExperimentalFlag, bool> parseExperimentalFlags(
     Iterable<String> experiments, void onError(String message)) {
   Map<ExperimentalFlag, bool> flags = <ExperimentalFlag, bool>{};
-  if (experiments == null) return flags;
-  for (String experiment in experiments) {
-    bool value = true;
-    if (experiment.startsWith("no-")) {
-      value = false;
-      experiment = experiment.substring(3);
-    }
-    ExperimentalFlag flag = parseExperimentalFlag(experiment);
-    if (flag == null) {
-      onError("Unknown experiment: " + experiment);
-    } else if (flags.containsKey(flag)) {
-      if (flags[flag] != value) {
-        onError("Experiment specified with conflicting values: " + experiment);
+  if (experiments != null) {
+    for (String experiment in experiments) {
+      bool value = true;
+      if (experiment.startsWith("no-")) {
+        value = false;
+        experiment = experiment.substring(3);
       }
-    } else {
-      flags[flag] = value;
+      ExperimentalFlag flag = parseExperimentalFlag(experiment);
+      if (flag == null) {
+        onError("Unknown experiment: " + experiment);
+      } else if (flags.containsKey(flag)) {
+        if (flags[flag] != value) {
+          onError(
+              "Experiment specified with conflicting values: " + experiment);
+        }
+      } else {
+        flags[flag] = value;
+      }
     }
   }
+  for (ExperimentalFlag flag in ExperimentalFlag.values) {
+    assert(defaultExperimentalFlags.containsKey(flag),
+        "No default value for $flag.");
+    flags[flag] ??= defaultExperimentalFlags[flag];
+  }
   return flags;
 }
diff --git a/front_end/lib/src/api_prototype/constant_evaluator.dart b/front_end/lib/src/api_prototype/constant_evaluator.dart
new file mode 100644
index 0000000..5eeb2a6
--- /dev/null
+++ b/front_end/lib/src/api_prototype/constant_evaluator.dart
@@ -0,0 +1,15 @@
+// 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 front_end.constant_evaluator;
+
+export '../fasta/kernel/constant_evaluator.dart'
+    show
+        ConstantEvaluator,
+        ConstantsTransformer,
+        ErrorReporter,
+        EvaluationEnvironment,
+        SimpleErrorReporter,
+        transformComponent,
+        transformLibraries;
diff --git a/front_end/lib/src/api_prototype/experimental_flags.dart b/front_end/lib/src/api_prototype/experimental_flags.dart
index a9b772d..d0615fd 100644
--- a/front_end/lib/src/api_prototype/experimental_flags.dart
+++ b/front_end/lib/src/api_prototype/experimental_flags.dart
@@ -24,3 +24,10 @@
   }
   return null;
 }
+
+const Map<ExperimentalFlag, bool> defaultExperimentalFlags = {
+  ExperimentalFlag.constantUpdate2018: false,
+  ExperimentalFlag.controlFlowCollections: true,
+  ExperimentalFlag.setLiterals: true,
+  ExperimentalFlag.spreadCollections: true,
+};
diff --git a/front_end/lib/src/api_unstable/bazel_worker.dart b/front_end/lib/src/api_unstable/bazel_worker.dart
index 5555840..89d8a56 100644
--- a/front_end/lib/src/api_unstable/bazel_worker.dart
+++ b/front_end/lib/src/api_unstable/bazel_worker.dart
@@ -7,6 +7,8 @@
 
 import 'dart:async' show Future;
 
+import 'package:kernel/kernel.dart' show Component, CanonicalName;
+
 import 'package:kernel/target/targets.dart' show Target;
 
 import '../api_prototype/compiler_options.dart' show CompilerOptions;
@@ -17,11 +19,16 @@
 
 import '../base/processed_options.dart' show ProcessedOptions;
 
+import '../fasta/compiler_context.dart' show CompilerContext;
+
+import '../fasta/incremental_compiler.dart' show IncrementalCompiler;
+
 import '../fasta/kernel/utils.dart' show serializeComponent;
 
 import '../kernel_generator_impl.dart' show generateKernel;
 
-import 'compiler_state.dart' show InitializedCompilerState;
+import 'compiler_state.dart'
+    show InitializedCompilerState, WorkerInputComponent, digestsEqual;
 
 export '../api_prototype/diagnostic_message.dart' show DiagnosticMessage;
 
@@ -30,10 +37,133 @@
 export '../api_prototype/terminal_color_support.dart'
     show printDiagnosticMessage;
 
+export '../fasta/kernel/utils.dart' show serializeComponent;
+
 export '../fasta/severity.dart' show Severity;
 
 export 'compiler_state.dart' show InitializedCompilerState;
 
+/// Initializes the compiler for a modular build.
+///
+/// Re-uses cached components from [_workerInputCache], and reloads them
+/// as necessary based on [workerInputDigests].
+Future<InitializedCompilerState> initializeIncrementalCompiler(
+    InitializedCompilerState oldState,
+    Uri sdkSummary,
+    Uri packagesFile,
+    Uri librariesSpecificationUri,
+    List<Uri> summaryInputs,
+    Map<Uri, List<int>> workerInputDigests,
+    Target target,
+    FileSystem fileSystem,
+    bool outlineOnly) async {
+  List<int> sdkDigest = workerInputDigests[sdkSummary];
+  IncrementalCompiler incrementalCompiler;
+  CompilerOptions options;
+  ProcessedOptions processedOpts;
+  WorkerInputComponent cachedSdkInput;
+  Map<Uri, WorkerInputComponent> workerInputCache =
+      oldState?.workerInputCache ?? new Map<Uri, WorkerInputComponent>();
+  bool startOver = false;
+
+  if (oldState == null ||
+      oldState.incrementalCompiler == null ||
+      oldState.incrementalCompiler.outlineOnly != outlineOnly) {
+    // No previous state.
+    startOver = true;
+  } else {
+    // We do have a previous state.
+    cachedSdkInput = workerInputCache[sdkSummary];
+    if (cachedSdkInput == null ||
+        !digestsEqual(cachedSdkInput.digest, workerInputDigests[sdkSummary])) {
+      // The sdk is out of date.
+      startOver = true;
+    }
+  }
+
+  if (startOver) {
+    // The sdk was either not cached or it has changed.
+    options = new CompilerOptions()
+      ..sdkSummary = sdkSummary
+      ..packagesFileUri = packagesFile
+      ..librariesSpecificationUri = librariesSpecificationUri
+      ..target = target
+      ..fileSystem = fileSystem
+      ..omitPlatform = true
+      ..environmentDefines = const {};
+
+    processedOpts = new ProcessedOptions(options: options);
+    cachedSdkInput = WorkerInputComponent(
+        sdkDigest, await processedOpts.loadSdkSummary(null));
+    workerInputCache[sdkSummary] = cachedSdkInput;
+
+    incrementalCompiler = new IncrementalCompiler.fromComponent(
+        new CompilerContext(processedOpts),
+        cachedSdkInput.component,
+        outlineOnly);
+  } else {
+    options = oldState.options;
+    processedOpts = oldState.processedOpts;
+
+    var sdkComponent = cachedSdkInput.component;
+    // Reset the state of the component.
+    for (var lib in sdkComponent.libraries) {
+      lib.isExternal = cachedSdkInput.externalLibs.contains(lib.importUri);
+    }
+    sdkComponent.adoptChildren();
+    for (WorkerInputComponent cachedInput in workerInputCache.values) {
+      cachedInput.component.adoptChildren();
+    }
+
+    // Reuse the incremental compiler, but reset as needed.
+    incrementalCompiler = oldState.incrementalCompiler;
+    incrementalCompiler.invalidateAllSources();
+    options.packagesFileUri = packagesFile;
+    options.fileSystem = fileSystem;
+  }
+
+  // Then read all the input summary components.
+  CanonicalName nameRoot = cachedSdkInput.component.root;
+  final inputSummaries = <Component>[];
+  List<Uri> loadFromDill = new List<Uri>();
+  for (Uri summary in summaryInputs) {
+    var cachedInput = workerInputCache[summary];
+    var summaryDigest = workerInputDigests[summary];
+    if (cachedInput == null ||
+        cachedInput.component.root != nameRoot ||
+        !digestsEqual(cachedInput.digest, summaryDigest)) {
+      loadFromDill.add(summary);
+    } else {
+      // Need to reset cached components so they are usable again.
+      var component = cachedInput.component;
+      for (var lib in component.libraries) {
+        lib.isExternal = cachedInput.externalLibs.contains(lib.importUri);
+      }
+      component.adoptChildren();
+      component.computeCanonicalNames();
+      inputSummaries.add(component);
+    }
+  }
+
+  for (int i = 0; i < loadFromDill.length; i++) {
+    Uri summary = loadFromDill[i];
+    var summaryDigest = workerInputDigests[summary];
+    WorkerInputComponent cachedInput = WorkerInputComponent(
+        summaryDigest,
+        await processedOpts.loadComponent(
+            await fileSystem.entityForUri(summary).readAsBytes(), nameRoot,
+            alwaysCreateNewNamedNodes: true));
+    workerInputCache[summary] = cachedInput;
+    inputSummaries.add(cachedInput.component);
+  }
+
+  incrementalCompiler.setModulesToLoadOnNextComputeDelta(inputSummaries);
+
+  return new InitializedCompilerState(options, processedOpts,
+      workerInputCache: workerInputCache,
+      incrementalCompiler: incrementalCompiler);
+}
+
 Future<InitializedCompilerState> initializeCompiler(
     InitializedCompilerState oldState,
     Uri sdkSummary,
@@ -55,7 +185,8 @@
     ..inputSummaries = summaryInputs
     ..linkedDependencies = linkedInputs
     ..target = target
-    ..fileSystem = fileSystem;
+    ..fileSystem = fileSystem
+    ..environmentDefines = const {};
 
   ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
diff --git a/front_end/lib/src/api_unstable/compiler_state.dart b/front_end/lib/src/api_unstable/compiler_state.dart
index 13d1327..dc80525 100644
--- a/front_end/lib/src/api_unstable/compiler_state.dart
+++ b/front_end/lib/src/api_unstable/compiler_state.dart
@@ -6,9 +6,41 @@
 
 import '../base/processed_options.dart' show ProcessedOptions;
 
+import 'package:front_end/src/fasta/incremental_compiler.dart'
+    show IncrementalCompiler;
+
+import 'package:kernel/kernel.dart' show Component;
+
 class InitializedCompilerState {
   final CompilerOptions options;
   final ProcessedOptions processedOpts;
+  final Map<Uri, WorkerInputComponent> workerInputCache;
+  final IncrementalCompiler incrementalCompiler;
 
-  InitializedCompilerState(this.options, this.processedOpts);
+  InitializedCompilerState(this.options, this.processedOpts,
+      {this.workerInputCache, this.incrementalCompiler});
+}
+
+/// A cached [Component] for a summary input file.
+///
+/// Tracks the originally marked "external" libs so that they can be restored,
+/// since the kernel generator mutates the state.
+class WorkerInputComponent {
+  final List<int> digest;
+  final Component component;
+  final Set<Uri> externalLibs;
+  WorkerInputComponent(this.digest, this.component)
+      : externalLibs = component.libraries
+            .where((lib) => lib.isExternal)
+            .map((lib) => lib.importUri)
+            .toSet();
+}
+
+bool digestsEqual(List<int> a, List<int> b) {
+  if (a == null || b == null) return false;
+  if (a.length != b.length) return false;
+  for (int i = 0; i < a.length; i++) {
+    if (a[i] != b[i]) return false;
+  }
+  return true;
 }
diff --git a/front_end/lib/src/api_unstable/dart2js.dart b/front_end/lib/src/api_unstable/dart2js.dart
index d716845..8ec174d 100644
--- a/front_end/lib/src/api_unstable/dart2js.dart
+++ b/front_end/lib/src/api_unstable/dart2js.dart
@@ -44,7 +44,8 @@
         getMessageRelatedInformation,
         getMessageUri;
 
-export '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
+export '../api_prototype/experimental_flags.dart'
+    show defaultExperimentalFlags, ExperimentalFlag;
 
 export '../api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
@@ -56,6 +57,8 @@
 export '../compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
 
+export '../fasta/fasta_codes.dart' show LocatedMessage;
+
 export '../fasta/kernel/redirecting_factory_body.dart'
     show RedirectingFactoryBody;
 
@@ -107,9 +110,12 @@
     InitializedCompilerState oldState,
     Target target,
     Uri librariesSpecificationUri,
-    Uri sdkPlatformUri,
+    List<Uri> linkedDependencies,
     Uri packagesFileUri,
-    {Map<ExperimentalFlag, bool> experimentalFlags}) {
+    {List<Uri> dependencies,
+    Map<ExperimentalFlag, bool> experimentalFlags,
+    bool verify: false,
+    bool enableAsserts: false}) {
   bool mapEqual(Map<ExperimentalFlag, bool> a, Map<ExperimentalFlag, bool> b) {
     if (a == null || b == null) return a == b;
     if (a.length != b.length) return false;
@@ -119,10 +125,20 @@
     return true;
   }
 
+  bool listEqual(List<Uri> a, List<Uri> b) {
+    if (a.length != b.length) return false;
+    for (int i = 0; i < a.length; ++i) {
+      if (a[i] != b[i]) return false;
+    }
+    return true;
+  }
+
+  linkedDependencies.sort((a, b) => a.toString().compareTo(b.toString()));
+
   if (oldState != null &&
       oldState.options.packagesFileUri == packagesFileUri &&
       oldState.options.librariesSpecificationUri == librariesSpecificationUri &&
-      oldState.options.linkedDependencies[0] == sdkPlatformUri &&
+      listEqual(oldState.options.linkedDependencies, linkedDependencies) &&
       mapEqual(oldState.options.experimentalFlags, experimentalFlags)) {
     return oldState;
   }
@@ -130,10 +146,12 @@
   CompilerOptions options = new CompilerOptions()
     ..target = target
     ..legacyMode = target.legacyMode
-    ..linkedDependencies = [sdkPlatformUri]
+    ..linkedDependencies = linkedDependencies
     ..librariesSpecificationUri = librariesSpecificationUri
     ..packagesFileUri = packagesFileUri
-    ..experimentalFlags = experimentalFlags;
+    ..experimentalFlags = experimentalFlags
+    ..verify = verify
+    ..enableAsserts = enableAsserts;
 
   ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
diff --git a/front_end/lib/src/api_unstable/ddc.dart b/front_end/lib/src/api_unstable/ddc.dart
index 0a129d8..ef61212 100644
--- a/front_end/lib/src/api_unstable/ddc.dart
+++ b/front_end/lib/src/api_unstable/ddc.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async' show Future;
 
-import 'package:kernel/kernel.dart' show Component;
+import 'package:kernel/kernel.dart' show Component, CanonicalName;
 
 import 'package:kernel/target/targets.dart' show Target;
 
@@ -20,9 +20,14 @@
 
 import '../base/processed_options.dart' show ProcessedOptions;
 
+import '../fasta/compiler_context.dart' show CompilerContext;
+
+import '../fasta/incremental_compiler.dart' show IncrementalCompiler;
+
 import '../kernel_generator_impl.dart' show generateKernel;
 
-import 'compiler_state.dart' show InitializedCompilerState;
+import 'compiler_state.dart'
+    show InitializedCompilerState, WorkerInputComponent, digestsEqual;
 
 export '../api_prototype/compiler_options.dart' show CompilerOptions;
 
@@ -40,6 +45,12 @@
 export '../api_prototype/terminal_color_support.dart'
     show printDiagnosticMessage;
 
+export '../base/processed_options.dart' show ProcessedOptions;
+
+export '../fasta/compiler_context.dart' show CompilerContext;
+
+export '../fasta/incremental_compiler.dart' show IncrementalCompiler;
+
 export '../fasta/kernel/redirecting_factory_body.dart'
     show RedirectingFactoryBody;
 
@@ -48,7 +59,8 @@
 export '../fasta/type_inference/type_schema_environment.dart'
     show TypeSchemaEnvironment;
 
-export 'compiler_state.dart' show InitializedCompilerState;
+export 'compiler_state.dart'
+    show InitializedCompilerState, WorkerInputComponent, digestsEqual;
 
 class DdcResult {
   final Component component;
@@ -119,6 +131,117 @@
   return new InitializedCompilerState(options, processedOpts);
 }
 
+Future<InitializedCompilerState> initializeIncrementalCompiler(
+    InitializedCompilerState oldState,
+    List<Component> doneInputSummaries,
+    Uri sdkSummary,
+    Uri packagesFile,
+    Uri librariesSpecificationUri,
+    List<Uri> inputSummaries,
+    Target target,
+    {FileSystem fileSystem,
+    Map<ExperimentalFlag, bool> experiments}) async {
+  inputSummaries.sort((a, b) => a.toString().compareTo(b.toString()));
+
+  IncrementalCompiler incrementalCompiler;
+  WorkerInputComponent cachedSdkInput;
+  CompilerOptions options;
+  ProcessedOptions processedOpts;
+
+  Map<Uri, WorkerInputComponent> workerInputCache =
+      oldState?.workerInputCache ?? new Map<Uri, WorkerInputComponent>();
+  cachedSdkInput = workerInputCache[sdkSummary];
+
+  if (oldState == null ||
+      oldState.incrementalCompiler == null ||
+      cachedSdkInput == null) {
+    // No previous state.
+    options = new CompilerOptions()
+      ..sdkSummary = sdkSummary
+      ..packagesFileUri = packagesFile
+      ..inputSummaries = inputSummaries
+      ..librariesSpecificationUri = librariesSpecificationUri
+      ..target = target
+      ..fileSystem = fileSystem ?? StandardFileSystem.instance;
+    if (experiments != null) options.experimentalFlags = experiments;
+
+    processedOpts = new ProcessedOptions(options: options);
+
+    cachedSdkInput = new WorkerInputComponent(null /* not compared anyway */,
+        await processedOpts.loadSdkSummary(null));
+    workerInputCache[sdkSummary] = cachedSdkInput;
+    incrementalCompiler = new IncrementalCompiler.fromComponent(
+        new CompilerContext(processedOpts), cachedSdkInput.component);
+  } else {
+    options = oldState.options;
+    options.inputSummaries = inputSummaries;
+    processedOpts = oldState.processedOpts;
+
+    for (var lib in cachedSdkInput.component.libraries) {
+      lib.isExternal = false;
+    }
+    cachedSdkInput.component.adoptChildren();
+    for (WorkerInputComponent cachedInput in workerInputCache.values) {
+      cachedInput.component.adoptChildren();
+    }
+
+    // Reuse the incremental compiler, but reset as needed.
+    incrementalCompiler = oldState.incrementalCompiler;
+    incrementalCompiler.invalidateAllSources();
+    options.packagesFileUri = packagesFile;
+    options.fileSystem = fileSystem;
+  }
+  InitializedCompilerState compilerState = new InitializedCompilerState(
+      options, processedOpts,
+      workerInputCache: workerInputCache,
+      incrementalCompiler: incrementalCompiler);
+
+  CanonicalName nameRoot = cachedSdkInput.component.root;
+  List<int> loadFromDillIndexes = new List<int>();
+
+  // Notice that the ordering of the input summaries matter, so we need to
+  // keep them in order.
+  if (doneInputSummaries.length != inputSummaries.length) {
+    throw new ArgumentError("Invalid length.");
+  }
+  for (int i = 0; i < inputSummaries.length; i++) {
+    Uri inputSummary = inputSummaries[i];
+    WorkerInputComponent cachedInput = workerInputCache[inputSummary];
+    if (cachedInput == null ||
+        cachedInput.component.root != nameRoot ||
+        !digestsEqual(await fileSystem.entityForUri(inputSummary).readAsBytes(),
+            cachedInput.digest)) {
+      loadFromDillIndexes.add(i);
+    } else {
+      // Need to reset cached components so they are usable again.
+      var component = cachedInput.component;
+      for (var lib in component.libraries) {
+        lib.isExternal = cachedInput.externalLibs.contains(lib.importUri);
+      }
+      component.computeCanonicalNames();
+      doneInputSummaries[i] = component;
+    }
+  }
+
+  for (int i = 0; i < loadFromDillIndexes.length; i++) {
+    int index = loadFromDillIndexes[i];
+    Uri summary = inputSummaries[index];
+    List<int> data = await fileSystem.entityForUri(summary).readAsBytes();
+    WorkerInputComponent cachedInput = WorkerInputComponent(
+        data,
+        await compilerState.processedOpts
+            .loadComponent(data, nameRoot, alwaysCreateNewNamedNodes: true));
+    workerInputCache[summary] = cachedInput;
+    doneInputSummaries[index] = cachedInput.component;
+  }
+
+  incrementalCompiler.setModulesToLoadOnNextComputeDelta(doneInputSummaries);
+
+  return new InitializedCompilerState(options, processedOpts,
+      workerInputCache: workerInputCache,
+      incrementalCompiler: incrementalCompiler);
+}
+
 Future<DdcResult> compile(InitializedCompilerState compilerState,
     List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler) async {
   CompilerOptions options = compilerState.options;
diff --git a/front_end/lib/src/api_unstable/vm.dart b/front_end/lib/src/api_unstable/vm.dart
index e3ef443..20ad6ad 100644
--- a/front_end/lib/src/api_unstable/vm.dart
+++ b/front_end/lib/src/api_unstable/vm.dart
@@ -34,25 +34,6 @@
 export '../fasta/fasta_codes.dart'
     show
         LocatedMessage,
-        Message,
-        messageConstEvalCircularity,
-        messageConstEvalContext,
-        messageConstEvalFailedAssertion,
-        noLength,
-        templateConstEvalFreeTypeParameter,
-        templateConstEvalDeferredLibrary,
-        templateConstEvalDuplicateKey,
-        templateConstEvalFailedAssertionWithMessage,
-        templateConstEvalInvalidBinaryOperandType,
-        templateConstEvalInvalidMethodInvocation,
-        templateConstEvalInvalidStaticInvocation,
-        templateConstEvalInvalidStringInterpolationOperand,
-        templateConstEvalInvalidSymbolName,
-        templateConstEvalInvalidType,
-        templateConstEvalNegativeShift,
-        templateConstEvalNonConstantLiteral,
-        templateConstEvalNonConstantVariableGet,
-        templateConstEvalZeroDivisor,
         templateFfiFieldAnnotation,
         templateFfiStructAnnotation,
         templateFfiNotStatic,
diff --git a/front_end/lib/src/base/errors.dart b/front_end/lib/src/base/errors.dart
index 1f01f89..2fbd323 100644
--- a/front_end/lib/src/base/errors.dart
+++ b/front_end/lib/src/base/errors.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -26,6 +26,12 @@
   final String correction;
 
   /**
+   * The URL of a page containing documentation for errors with this code, or
+   * `null` if there is no known documentation.
+   */
+  final String url;
+
+  /**
    * Whether this error is caused by an unresolved identifier.
    */
   final bool isUnresolvedIdentifier;
@@ -36,7 +42,7 @@
    * template. The correction associated with the error will be created from the
    * given [correction] template.
    */
-  const ErrorCode(this.name, this.message, [this.correction])
+  const ErrorCode(this.name, this.message, [this.correction, this.url])
       : isUnresolvedIdentifier = false;
 
   /**
@@ -46,7 +52,7 @@
    * given [correction] template.
    */
   const ErrorCode.temporary(this.name, this.message,
-      {this.correction, this.isUnresolvedIdentifier: false});
+      {this.correction, this.isUnresolvedIdentifier: false, this.url});
 
   /**
    * The severity of the error.
diff --git a/front_end/lib/src/base/instrumentation.dart b/front_end/lib/src/base/instrumentation.dart
index ab62b21..5c16ee9 100644
--- a/front_end/lib/src/base/instrumentation.dart
+++ b/front_end/lib/src/base/instrumentation.dart
@@ -2,9 +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:kernel/ast.dart';
-
-import '../fasta/problems.dart';
+import 'package:kernel/ast.dart' show DartType, Member;
 
 /// Convert '→' to '->' because '→' doesn't show up in some terminals.
 /// Remove prefixes that are used very often in tests.
@@ -36,94 +34,6 @@
   bool matches(String description) => description == toString();
 }
 
-/// Instance of [InstrumentationValue] describing a forwarding stub.
-class InstrumentationValueForForwardingStub extends InstrumentationValue {
-  final Procedure procedure;
-
-  InstrumentationValueForForwardingStub(this.procedure);
-
-  @override
-  String toString() {
-    var buffer = new StringBuffer();
-    void writeParameter(VariableDeclaration parameter) {
-      var covariances = <String>[];
-      if (parameter.isGenericCovariantImpl) {
-        covariances.add('genericImpl');
-      }
-      if (parameter.isCovariant) {
-        covariances.add('explicit');
-      }
-      buffer.write('covariance=(${covariances.join(', ')}) ');
-      buffer.write(parameter.type);
-      buffer.write(' ');
-      buffer.write(parameter.name);
-    }
-
-    if (procedure.isAbstract) {
-      buffer.write('abstract ');
-    }
-    var function = procedure.function;
-    buffer.write(function.returnType);
-    buffer.write(' ');
-    switch (procedure.kind) {
-      case ProcedureKind.Operator:
-        buffer.write('operator');
-        break;
-      case ProcedureKind.Method:
-        break;
-      case ProcedureKind.Setter:
-        buffer.write('set ');
-        break;
-      case ProcedureKind.Getter:
-        buffer.write('get ');
-        break;
-      default:
-        unhandled('${procedure.kind}', 'InstrumentationValueForForwardingStub',
-            -1, null);
-        break;
-    }
-    buffer.write(procedure.name.name);
-    if (function.typeParameters.isNotEmpty) {
-      buffer.write('<');
-      for (int i = 0; i < function.typeParameters.length; i++) {
-        if (i != 0) buffer.write(', ');
-        var typeParameter = function.typeParameters[i];
-        var covariances = <String>[];
-        if (typeParameter.isGenericCovariantImpl) {
-          covariances.add('genericImpl');
-        }
-        buffer.write('covariance=(${covariances.join(', ')}) ');
-        buffer.write(typeParameter.name);
-        buffer.write(' extends ');
-        buffer.write(
-            new InstrumentationValueForType(typeParameter.bound).toString());
-      }
-      buffer.write('>');
-    }
-    buffer.write('(');
-    for (int i = 0; i < function.positionalParameters.length; i++) {
-      if (i != 0) buffer.write(', ');
-      if (i == function.requiredParameterCount) buffer.write('[');
-      writeParameter(function.positionalParameters[i]);
-    }
-    if (function.requiredParameterCount <
-        function.positionalParameters.length) {
-      buffer.write(']');
-    }
-    if (function.namedParameters.isNotEmpty) {
-      if (function.positionalParameters.length != 0) buffer.write(', ');
-      buffer.write('{');
-      for (int i = 0; i < function.namedParameters.length; i++) {
-        if (i != 0) buffer.write(', ');
-        writeParameter(function.namedParameters[i]);
-      }
-      buffer.write('}');
-    }
-    buffer.write(')');
-    return _shortenInstrumentationString(buffer.toString());
-  }
-}
-
 /// Instance of [InstrumentationValue] describing a [Member].
 class InstrumentationValueForMember extends InstrumentationValue {
   final Member member;
diff --git a/front_end/lib/src/base/processed_options.dart b/front_end/lib/src/base/processed_options.dart
index e56f20f..3746481 100644
--- a/front_end/lib/src/base/processed_options.dart
+++ b/front_end/lib/src/base/processed_options.dart
@@ -24,7 +24,8 @@
 import '../api_prototype/compiler_options.dart'
     show CompilerOptions, DiagnosticMessage;
 
-import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
+import '../api_prototype/experimental_flags.dart'
+    show defaultExperimentalFlags, ExperimentalFlag;
 
 import '../api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
@@ -183,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(),
@@ -310,9 +313,11 @@
       _raw.target ?? new NoneTarget(new TargetFlags(legacyMode: legacyMode));
 
   bool isExperimentEnabled(ExperimentalFlag flag) {
+    assert(defaultExperimentalFlags.containsKey(flag),
+        "No default value for $flag.");
     // TODO(askesc): Determine default flag value from specification file.
     if (flag == ExperimentalFlag.setLiterals) return true;
-    return _raw.experimentalFlags[flag] ?? false;
+    return _raw.experimentalFlags[flag] ?? defaultExperimentalFlags[flag];
   }
 
   /// Get an outline component that summarizes the SDK, if any.
@@ -374,12 +379,16 @@
   }
 
   /// Helper to load a .dill file from [uri] using the existing [nameRoot].
-  Component loadComponent(List<int> bytes, CanonicalName nameRoot) {
+  Component loadComponent(List<int> bytes, CanonicalName nameRoot,
+      {bool alwaysCreateNewNamedNodes}) {
     Component component =
         target.configureComponent(new Component(nameRoot: nameRoot));
     // TODO(ahe): Pass file name to BinaryBuilder.
     // TODO(ahe): Control lazy loading via an option.
-    new BinaryBuilder(bytes, filename: null, disableLazyReading: false)
+    new BinaryBuilder(bytes,
+            filename: null,
+            disableLazyReading: false,
+            alwaysCreateNewNamedNodes: alwaysCreateNewNamedNodes)
         .readComponent(component);
     return component;
   }
diff --git a/front_end/lib/src/compute_platform_binaries_location.dart b/front_end/lib/src/compute_platform_binaries_location.dart
index 9ac1f54..ad98f28 100644
--- a/front_end/lib/src/compute_platform_binaries_location.dart
+++ b/front_end/lib/src/compute_platform_binaries_location.dart
@@ -69,8 +69,11 @@
           Map<Uri, Source> uriToSource = CompilerContext.current.uriToSource;
           Source source = uriToSource[uri];
           if (source.source.isEmpty) {
-            uriToSource[uri] = new Source(source.lineStarts,
-                new File.fromUri(candidate).readAsBytesSync());
+            uriToSource[uri] = new Source(
+                source.lineStarts,
+                new File.fromUri(candidate).readAsBytesSync(),
+                source.importUri,
+                source.fileUri);
           }
         }
         return candidate;
diff --git a/front_end/lib/src/fasta/builder/declaration.dart b/front_end/lib/src/fasta/builder/declaration.dart
index 392b3e6..4b3d601 100644
--- a/front_end/lib/src/fasta/builder/declaration.dart
+++ b/front_end/lib/src/fasta/builder/declaration.dart
@@ -83,6 +83,4 @@
   /// Resolve constructors (lookup names in scope) recorded in this builder and
   /// return the number of constructors resolved.
   int resolveConstructors(covariant Declaration parent) => 0;
-
-  void instrumentTopLevelInference(covariant instrumentation) {}
 }
diff --git a/front_end/lib/src/fasta/command_line_reporting.dart b/front_end/lib/src/fasta/command_line_reporting.dart
index fbfd9df..1577804 100644
--- a/front_end/lib/src/fasta/command_line_reporting.dart
+++ b/front_end/lib/src/fasta/command_line_reporting.dart
@@ -12,7 +12,7 @@
 
 import 'dart:typed_data' show Uint8List;
 
-import 'package:kernel/ast.dart' show Location;
+import 'package:kernel/ast.dart' show Location, TreeNode;
 
 import '../compute_platform_binaries_location.dart' show translateSdk;
 
@@ -77,6 +77,9 @@
       String path = relativizeUri(translateSdk(message.uri));
       int offset = message.charOffset;
       location ??= (offset == -1 ? null : getLocation(message.uri, offset));
+      if (location?.line == TreeNode.noOffset) {
+        location = null;
+      }
       String sourceLine = getSourceLine(location);
       if (sourceLine == null) {
         sourceLine = "";
@@ -110,7 +113,7 @@
         sourceLine = "\n$sourceLine\n$pointer";
       }
       String position =
-          location == null ? ":1" : ":${location.line}:${location.column}";
+          location == null ? "" : ":${location.line}:${location.column}";
       return "$path$position: $text$sourceLine";
     } else {
       return text;
diff --git a/front_end/lib/src/fasta/dill/dill_library_builder.dart b/front_end/lib/src/fasta/dill/dill_library_builder.dart
index 610dcea..c76a2bc 100644
--- a/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -53,7 +53,7 @@
 class DillLibraryBuilder extends LibraryBuilder<KernelTypeBuilder, Library> {
   final Library library;
 
-  final DillLoader loader;
+  DillLoader loader;
 
   /// Exports that can't be serialized.
   ///
diff --git a/front_end/lib/src/fasta/dill/dill_member_builder.dart b/front_end/lib/src/fasta/dill/dill_member_builder.dart
index cfd35fb..a648190 100644
--- a/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -57,10 +57,8 @@
   }
 
   bool get isSynthetic {
-    // TODO(ahe): Kernel should eventually support a synthetic bit.
-    return isConstructor &&
-        name == "" &&
-        (charOffset == parent.charOffset || charOffset == -1);
+    final Member member = this.member;
+    return member is Constructor && member.isSynthetic;
   }
 
   bool get isField => member is Field;
diff --git a/front_end/lib/src/fasta/dill/dill_target.dart b/front_end/lib/src/fasta/dill/dill_target.dart
index 4771d2c..59386d9 100644
--- a/front_end/lib/src/fasta/dill/dill_target.dart
+++ b/front_end/lib/src/fasta/dill/dill_target.dart
@@ -39,7 +39,7 @@
 
   @override
   void addSourceInformation(
-      Uri uri, List<int> lineStarts, List<int> sourceCode) {
+      Uri importUri, Uri fileUri, List<int> lineStarts, List<int> sourceCode) {
     unsupported("addSourceInformation", -1, null);
   }
 
diff --git a/front_end/lib/src/fasta/fasta_codes_generated.dart b/front_end/lib/src/fasta/fasta_codes_generated.dart
index 574152c..0c4177b 100644
--- a/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/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
@@ -733,6 +757,36 @@
     tip: r"""Try replacing the colon with the keyword 'in'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String string,
+        String
+            string2)> templateConflictingModifiers = const Template<
+        Message Function(String string, String string2)>(
+    messageTemplate:
+        r"""Members can't be declared to be both '#string' and '#string2'.""",
+    tipTemplate: r"""Try removing one of the keywords.""",
+    withArguments: _withArgumentsConflictingModifiers);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string, String string2)>
+    codeConflictingModifiers =
+    const Code<Message Function(String string, String string2)>(
+        "ConflictingModifiers", templateConflictingModifiers,
+        index: 59);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConflictingModifiers(String string, String string2) {
+  if (string.isEmpty) throw 'No string provided';
+  if (string2.isEmpty) throw 'No string provided';
+  return new Message(codeConflictingModifiers,
+      message:
+          """Members can't be declared to be both '${string}' and '${string2}'.""",
+      tip: """Try removing one of the keywords.""",
+      arguments: {'string': string, 'string2': string2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateConflictsWithConstructor =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Conflicts with constructor '#name'.""",
@@ -896,28 +950,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.
-const MessageCode messageConstAndCovariant = const MessageCode(
-    "ConstAndCovariant",
-    index: 57,
-    message:
-        r"""Members can't be declared to be both 'const' and 'covariant'.""",
-    tip: r"""Try removing either the 'const' or 'covariant' keyword.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstAndFinal = messageConstAndFinal;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -927,15 +959,6 @@
     tip: r"""Try removing either the 'const' or 'final' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeConstAndVar = messageConstAndVar;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageConstAndVar = const MessageCode("ConstAndVar",
-    index: 59,
-    message: r"""Members can't be declared to be both 'const' and 'var'.""",
-    tip: r"""Try removing either the 'const' or 'var' keyword.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstClass = messageConstClass;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1049,6 +1072,34 @@
 const Template<
     Message Function(
         Constant
+            _constant)> templateConstEvalDuplicateElement = const Template<
+        Message Function(Constant _constant)>(
+    messageTemplate:
+        r"""The element '#constant' conflicts with another existing element in the set.""",
+    withArguments: _withArgumentsConstEvalDuplicateElement);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(Constant _constant)> codeConstEvalDuplicateElement =
+    const Code<Message Function(Constant _constant)>(
+        "ConstEvalDuplicateElement", templateConstEvalDuplicateElement,
+        analyzerCodes: <String>["EQUAL_ELEMENTS_IN_CONST_SET"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalDuplicateElement(Constant _constant) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> constantParts = labeler.labelConstant(_constant);
+  String constant = constantParts.join();
+  return new Message(codeConstEvalDuplicateElement,
+      message:
+          """The element '${constant}' conflicts with another existing element in the set.""" +
+              labeler.originMessages,
+      arguments: {'constant': _constant});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        Constant
             _constant)> templateConstEvalDuplicateKey = const Template<
         Message Function(Constant _constant)>(
     messageTemplate:
@@ -1059,7 +1110,7 @@
 const Code<Message Function(Constant _constant)> codeConstEvalDuplicateKey =
     const Code<Message Function(Constant _constant)>(
         "ConstEvalDuplicateKey", templateConstEvalDuplicateKey,
-        analyzerCodes: <String>["EQUAL_KEYS_IN_MAP"]);
+        analyzerCodes: <String>["EQUAL_KEYS_IN_CONST_MAP"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalDuplicateKey(Constant _constant) {
@@ -1074,6 +1125,36 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        Constant
+            _constant)> templateConstEvalElementImplementsEqual = const Template<
+        Message Function(Constant _constant)>(
+    messageTemplate:
+        r"""The element '#constant' does not have a primitive operator '=='.""",
+    withArguments: _withArgumentsConstEvalElementImplementsEqual);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(Constant _constant)>
+    codeConstEvalElementImplementsEqual =
+    const Code<Message Function(Constant _constant)>(
+        "ConstEvalElementImplementsEqual",
+        templateConstEvalElementImplementsEqual,
+        analyzerCodes: <String>["CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalElementImplementsEqual(Constant _constant) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> constantParts = labeler.labelConstant(_constant);
+  String constant = constantParts.join();
+  return new Message(codeConstEvalElementImplementsEqual,
+      message:
+          """The element '${constant}' does not have a primitive operator '=='.""" +
+              labeler.originMessages,
+      arguments: {'constant': _constant});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstEvalFailedAssertion = messageConstEvalFailedAssertion;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1184,6 +1265,40 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
+        Constant _constant,
+        DartType
+            _type)> templateConstEvalInvalidEqualsOperandType = const Template<
+        Message Function(Constant _constant, DartType _type)>(
+    messageTemplate:
+        r"""Binary operator '==' requires receiver constant '#constant' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type '#type'.""",
+    withArguments: _withArgumentsConstEvalInvalidEqualsOperandType);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(Constant _constant, DartType _type)>
+    codeConstEvalInvalidEqualsOperandType =
+    const Code<Message Function(Constant _constant, DartType _type)>(
+  "ConstEvalInvalidEqualsOperandType",
+  templateConstEvalInvalidEqualsOperandType,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalInvalidEqualsOperandType(
+    Constant _constant, DartType _type) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> constantParts = labeler.labelConstant(_constant);
+  List<Object> typeParts = labeler.labelType(_type);
+  String constant = constantParts.join();
+  String type = typeParts.join();
+  return new Message(codeConstEvalInvalidEqualsOperandType,
+      message:
+          """Binary operator '==' requires receiver constant '${constant}' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type '${type}'.""" +
+              labeler.originMessages,
+      arguments: {'constant': _constant, 'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
         String string,
         Constant
             _constant)> templateConstEvalInvalidMethodInvocation = const Template<
@@ -1217,6 +1332,38 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
+        String string,
+        Constant
+            _constant)> templateConstEvalInvalidPropertyGet = const Template<
+        Message Function(String string, Constant _constant)>(
+    messageTemplate:
+        r"""The property '#string' can't be accessed on '#constant' within a const context.""",
+    withArguments: _withArgumentsConstEvalInvalidPropertyGet);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string, Constant _constant)>
+    codeConstEvalInvalidPropertyGet =
+    const Code<Message Function(String string, Constant _constant)>(
+        "ConstEvalInvalidPropertyGet", templateConstEvalInvalidPropertyGet,
+        analyzerCodes: <String>["CONST_EVAL_THROWS_EXCEPTION"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalInvalidPropertyGet(
+    String string, Constant _constant) {
+  if (string.isEmpty) throw 'No string provided';
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> constantParts = labeler.labelConstant(_constant);
+  String constant = constantParts.join();
+  return new Message(codeConstEvalInvalidPropertyGet,
+      message:
+          """The property '${string}' can't be accessed on '${constant}' within a const context.""" +
+              labeler.originMessages,
+      arguments: {'string': string, 'constant': _constant});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
         String
             name)> templateConstEvalInvalidStaticInvocation = const Template<
         Message Function(String name)>(
@@ -1339,6 +1486,65 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstEvalIterationInConstList =
+    messageConstEvalIterationInConstList;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstEvalIterationInConstList = const MessageCode(
+    "ConstEvalIterationInConstList",
+    analyzerCodes: <String>["NON_CONSTANT_LIST_ELEMENT"],
+    message: r"""Iteration can't be used in a constant list.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstEvalIterationInConstMap =
+    messageConstEvalIterationInConstMap;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstEvalIterationInConstMap = const MessageCode(
+    "ConstEvalIterationInConstMap",
+    analyzerCodes: <String>["NON_CONSTANT_MAP_ELEMENT"],
+    message: r"""Iteration can't be used in a constant map.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstEvalIterationInConstSet =
+    messageConstEvalIterationInConstSet;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstEvalIterationInConstSet = const MessageCode(
+    "ConstEvalIterationInConstSet",
+    analyzerCodes: <String>["NON_CONSTANT_SET_ELEMENT"],
+    message: r"""Iteration can't be used in a constant set.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(Constant _constant)>
+    templateConstEvalKeyImplementsEqual =
+    const Template<Message Function(Constant _constant)>(
+        messageTemplate:
+            r"""The key '#constant' does not have a primitive operator '=='.""",
+        withArguments: _withArgumentsConstEvalKeyImplementsEqual);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(Constant _constant)>
+    codeConstEvalKeyImplementsEqual =
+    const Code<Message Function(Constant _constant)>(
+        "ConstEvalKeyImplementsEqual", templateConstEvalKeyImplementsEqual,
+        analyzerCodes: <String>[
+      "CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS"
+    ]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalKeyImplementsEqual(Constant _constant) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> constantParts = labeler.labelConstant(_constant);
+  String constant = constantParts.join();
+  return new Message(codeConstEvalKeyImplementsEqual,
+      message:
+          """The key '${constant}' does not have a primitive operator '=='.""" +
+              labeler.originMessages,
+      arguments: {'constant': _constant});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String string,
@@ -1423,6 +1629,43 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstEvalNotListOrSetInSpread =
+    messageConstEvalNotListOrSetInSpread;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstEvalNotListOrSetInSpread = const MessageCode(
+    "ConstEvalNotListOrSetInSpread",
+    analyzerCodes: <String>["CONST_SPREAD_EXPECTED_LIST_OR_SET"],
+    message:
+        r"""Only lists and sets can be used in spreads in constant lists and sets.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstEvalNotMapInSpread = messageConstEvalNotMapInSpread;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstEvalNotMapInSpread = const MessageCode(
+    "ConstEvalNotMapInSpread",
+    analyzerCodes: <String>["CONST_SPREAD_EXPECTED_MAP"],
+    message: r"""Only maps can be used in spreads in constant maps.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstEvalNullValue = messageConstEvalNullValue;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstEvalNullValue = const MessageCode(
+    "ConstEvalNullValue",
+    analyzerCodes: <String>["CONST_EVAL_THROWS_EXCEPTION"],
+    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,
@@ -1712,17 +1955,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeCovariantAfterFinal = messageCovariantAfterFinal;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageCovariantAfterFinal = const MessageCode(
-    "CovariantAfterFinal",
-    index: 65,
-    message:
-        r"""The modifier 'covariant' should be before the modifier 'final'.""",
-    tip: r"""Try re-ordering the modifiers.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeCovariantAfterVar = messageCovariantAfterVar;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2420,7 +2652,7 @@
 const Template<Message Function(Token token)> templateDuplicatedModifier =
     const Template<Message Function(Token token)>(
         messageTemplate: r"""The modifier '#lexeme' was already specified.""",
-        tipTemplate: r"""Try removing all but one occurance of the modifier.""",
+        tipTemplate: r"""Try removing all but one occurence of the modifier.""",
         withArguments: _withArgumentsDuplicatedModifier);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2434,7 +2666,7 @@
   String lexeme = token.lexeme;
   return new Message(codeDuplicatedModifier,
       message: """The modifier '${lexeme}' was already specified.""",
-      tip: """Try removing all but one occurance of the modifier.""",
+      tip: """Try removing all but one occurence of the modifier.""",
       arguments: {'token': token});
 }
 
@@ -3013,7 +3245,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);
@@ -3028,7 +3260,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});
@@ -3040,7 +3272,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExportAfterPart = const MessageCode("ExportAfterPart",
     index: 75,
-    message: r"""Export directives must preceed part directives.""",
+    message: r"""Export directives must precede part directives.""",
     tip: r"""Try moving the export directives before the part directives.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4296,7 +4528,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageImportAfterPart = const MessageCode("ImportAfterPart",
     index: 10,
-    message: r"""Import directives must preceed part directives.""",
+    message: r"""Import directives must precede part directives.""",
     tip: r"""Try moving the import directives before the part directives.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6107,6 +6339,17 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInvalidSuperInInitializer =
+    messageInvalidSuperInInitializer;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInvalidSuperInInitializer = const MessageCode(
+    "InvalidSuperInInitializer",
+    index: 95,
+    message:
+        r"""Can only use 'super' in an initializer for calling the superclass constructor (e.g. 'super()' or 'super.namedConstructor()')""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInvalidSyncModifier = messageInvalidSyncModifier;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6117,6 +6360,16 @@
     tip: r"""Try replacing 'sync' with 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInvalidThisInInitializer = messageInvalidThisInInitializer;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInvalidThisInInitializer = const MessageCode(
+    "InvalidThisInInitializer",
+    index: 65,
+    message:
+        r"""Can only use 'this' in an initializer for field initialization (e.g. 'this.x = something') and constructor redirection (e.g. 'this()' or 'this.namedConstructor())""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInvalidUnicodeEscape = messageInvalidUnicodeEscape;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6553,7 +6806,7 @@
     "MissingOperatorKeyword",
     index: 31,
     message:
-        r"""Operator declarations must be preceeded by the keyword 'operator'.""",
+        r"""Operator declarations must be preceded by the keyword 'operator'.""",
     tip: r"""Try adding the keyword 'operator'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6671,6 +6924,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;
 
@@ -7068,6 +7351,27 @@
     message: r"""Can't assign to this.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(Token token)> templateNotBinaryOperator =
+    const Template<Message Function(Token token)>(
+        messageTemplate: r"""'#lexeme' isn't a binary operator.""",
+        withArguments: _withArgumentsNotBinaryOperator);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(Token token)> codeNotBinaryOperator =
+    const Code<Message Function(Token token)>(
+  "NotBinaryOperator",
+  templateNotBinaryOperator,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNotBinaryOperator(Token token) {
+  String lexeme = token.lexeme;
+  return new Message(codeNotBinaryOperator,
+      message: """'${lexeme}' isn't a binary operator.""",
+      arguments: {'token': token});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)> templateNotConstantExpression =
     const Template<Message Function(String string)>(
         messageTemplate: r"""#string is not a constant expression.""",
@@ -8871,7 +9175,7 @@
 const Code<Message Function(String name)> codeThisAccessInFieldInitializer =
     const Code<Message Function(String name)>(
         "ThisAccessInFieldInitializer", templateThisAccessInFieldInitializer,
-        analyzerCodes: <String>["THIS_ACCESS_FROM_INITIALIZER"]);
+        analyzerCodes: <String>["THIS_ACCESS_FROM_FIELD_INITIALIZER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsThisAccessInFieldInitializer(String name) {
@@ -9050,6 +9354,16 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeTypeBeforeFactory = messageTypeBeforeFactory;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageTypeBeforeFactory = const MessageCode(
+    "TypeBeforeFactory",
+    index: 57,
+    message: r"""Factory constructors cannot have a return type.""",
+    tip: r"""Try removing the type appearing before 'factory'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateTypeNotFound =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Type '#name' not found.""",
diff --git a/front_end/lib/src/fasta/incremental_compiler.dart b/front_end/lib/src/fasta/incremental_compiler.dart
index e938d69..52264f2 100644
--- a/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/front_end/lib/src/fasta/incremental_compiler.dart
@@ -27,6 +27,7 @@
         Procedure,
         ProcedureKind,
         ReturnStatement,
+        Source,
         TreeNode,
         TypeParameter;
 
@@ -210,6 +211,8 @@
 
       Set<Uri> invalidatedUris = this.invalidatedUris.toSet();
 
+      invalidateNotKeptUserBuilders(invalidatedUris);
+
       ClassHierarchy hierarchy = userCode?.loader?.hierarchy;
       Set<LibraryBuilder> notReusedLibraries = new Set<LibraryBuilder>();
       List<LibraryBuilder> reusedLibraries = computeReusedLibraries(
@@ -219,14 +222,36 @@
           new Set<Uri>.from(reusedLibraries.map((b) => b.uri));
       for (Uri uri in new Set<Uri>.from(dillLoadedData.loader.builders.keys)
         ..removeAll(reusedLibraryUris)) {
-        dillLoadedData.loader.builders.remove(uri);
+        LibraryBuilder builder = dillLoadedData.loader.builders.remove(uri);
         userBuilders?.remove(uri);
+        CompilerContext.current.uriToSource.remove(builder.fileUri);
       }
 
-      // Remove component problems for libraries we don't reuse.
-      if (remainingComponentProblems.isNotEmpty) {
-        for (LibraryBuilder builder in notReusedLibraries) {
-          Library lib = builder.target;
+      if (hasToCheckPackageUris) {
+        // The package file was changed.
+        // Make sure the dill loader is on the same page.
+        DillTarget oldDillLoadedData = dillLoadedData;
+        dillLoadedData =
+            new DillTarget(ticker, uriTranslator, c.options.target);
+        for (DillLibraryBuilder library
+            in oldDillLoadedData.loader.builders.values) {
+          library.loader = dillLoadedData.loader;
+          dillLoadedData.loader.builders[library.uri] = library;
+          if (library.uri.scheme == "dart" && library.uri.path == "core") {
+            dillLoadedData.loader.coreLibrary = library;
+          }
+        }
+        dillLoadedData.loader.first = oldDillLoadedData.loader.first;
+        dillLoadedData.loader.libraries
+            .addAll(oldDillLoadedData.loader.libraries);
+      }
+
+      for (LibraryBuilder builder in notReusedLibraries) {
+        Library lib = builder.target;
+        CompilerContext.current.uriToSource.remove(builder.fileUri);
+
+        // Remove component problems for libraries we don't reuse.
+        if (remainingComponentProblems.isNotEmpty) {
           removeLibraryFromRemainingComponentProblems(lib, uriTranslator);
         }
       }
@@ -246,6 +271,8 @@
             " of ${userCode.loader.builders.length} libraries");
       }
 
+      await loadEnsureLoadedComponents(reusedLibraryUris, reusedLibraries);
+
       KernelTarget userCodeOld = userCode;
       userCode = new KernelTarget(
           new HybridFileSystem(
@@ -269,12 +296,20 @@
           userCode.loader.builders[entryPoints.first] != null) {
         userCode.loader.first = userCode.loader.builders[entryPoints.first];
       }
-      await userCode.buildOutlines();
+      Component componentWithDill = await userCode.buildOutlines();
 
-      // This is not the full component. It is the component including all
-      // libraries loaded from .dill files.
-      Component componentWithDill =
-          await userCode.buildComponent(verify: c.options.verify);
+      // This is not the full component. It is the component consisting of all
+      // newly compiled libraries and all libraries loaded from .dill files or
+      // directly from components.
+      // Technically, it's the combination of userCode.loader.libraries and
+      // dillLoadedData.loader.libraries.
+      if (!outlineOnly) {
+        componentWithDill =
+            await userCode.buildComponent(verify: c.options.verify);
+      }
+
+      recordNonFullComponentForTesting(componentWithDill);
+
       if (componentWithDill != null) {
         this.invalidatedUris.clear();
         hasToCheckPackageUris = false;
@@ -291,9 +326,15 @@
 
       List<Library> outputLibraries;
       Set<Library> allLibraries;
+      Map<Uri, Source> uriToSource = componentWithDill?.uriToSource;
       if (data.component != null || fullComponent) {
-        outputLibraries = computeTransitiveClosure(compiledLibraries,
-            entryPoints, reusedLibraries, hierarchy, uriTranslator);
+        outputLibraries = computeTransitiveClosure(
+            compiledLibraries,
+            entryPoints,
+            reusedLibraries,
+            hierarchy,
+            uriTranslator,
+            uriToSource);
         allLibraries = outputLibraries.toSet();
         if (!c.options.omitPlatform) {
           for (int i = 0; i < platformBuilders.length; i++) {
@@ -303,8 +344,14 @@
         }
       } else {
         outputLibraries = new List<Library>();
-        allLibraries = computeTransitiveClosure(compiledLibraries, entryPoints,
-                reusedLibraries, hierarchy, uriTranslator, outputLibraries)
+        allLibraries = computeTransitiveClosure(
+                compiledLibraries,
+                entryPoints,
+                reusedLibraries,
+                hierarchy,
+                uriTranslator,
+                uriToSource,
+                outputLibraries)
             .toSet();
       }
 
@@ -317,9 +364,8 @@
       }
 
       // This is the incremental component.
-      return context.options.target.configureComponent(new Component(
-          libraries: outputLibraries,
-          uriToSource: componentWithDill?.uriToSource))
+      return context.options.target.configureComponent(
+          new Component(libraries: outputLibraries, uriToSource: uriToSource))
         ..mainMethod = mainMethod
         ..problemsAsJson = problemsAsJson;
     });
@@ -327,13 +373,57 @@
 
   /// Internal method.
   void invalidateNotKeptUserBuilders(Set<Uri> invalidatedUris) {
-    throw UnimplementedError("Not implemented yet.");
+    if (modulesToLoad != null && userBuilders != null) {
+      Set<Library> loadedNotKept = new Set<Library>();
+      for (LibraryBuilder builder in userBuilders.values) {
+        loadedNotKept.add(builder.target);
+      }
+      for (Component module in modulesToLoad) {
+        loadedNotKept.removeAll(module.libraries);
+      }
+      for (Library lib in loadedNotKept) {
+        invalidatedUris.add(lib.importUri);
+      }
+    }
   }
 
   /// Internal method.
   Future loadEnsureLoadedComponents(
       Set<Uri> reusedLibraryUris, List<LibraryBuilder> reusedLibraries) async {
-    throw UnimplementedError("Not implemented yet.");
+    if (modulesToLoad != null) {
+      bool loadedAnything = false;
+      for (Component module in modulesToLoad) {
+        bool usedComponent = false;
+        for (Library lib in module.libraries) {
+          if (!reusedLibraryUris.contains(lib.importUri)) {
+            dillLoadedData.loader.libraries.add(lib);
+            dillLoadedData.addLibrary(lib);
+            reusedLibraries.add(dillLoadedData.loader.read(lib.importUri, -1));
+            usedComponent = true;
+          }
+        }
+        if (usedComponent) {
+          dillLoadedData.uriToSource.addAll(module.uriToSource);
+          loadedAnything = true;
+        }
+      }
+      if (loadedAnything) {
+        await dillLoadedData.buildOutlines();
+        userBuilders = <Uri, LibraryBuilder>{};
+        platformBuilders = <LibraryBuilder>[];
+        dillLoadedData.loader.builders.forEach((uri, builder) {
+          if (builder.uri.scheme == "dart") {
+            platformBuilders.add(builder);
+          } else {
+            userBuilders[uri] = builder;
+          }
+        });
+        if (userBuilders.isEmpty) {
+          userBuilders = null;
+        }
+      }
+      modulesToLoad = null;
+    }
   }
 
   /// Internal method.
@@ -415,6 +505,7 @@
       List<LibraryBuilder> reusedLibraries,
       ClassHierarchy hierarchy,
       UriTranslator uriTranslator,
+      Map<Uri, Source> uriToSource,
       [List<Library> inputLibrariesFiltered]) {
     List<Library> result = new List<Library>();
     Map<Uri, Library> libraryMap = <Uri, Library>{};
@@ -468,6 +559,8 @@
         Library lib = builder.target;
         removedLibraries.add(lib);
         dillLoadedData.loader.builders.remove(uri);
+        CompilerContext.current.uriToSource.remove(uri);
+        uriToSource.remove(uri);
         userBuilders?.remove(uri);
         removeLibraryFromRemainingComponentProblems(lib, uriTranslator);
       }
@@ -515,7 +608,7 @@
         c.options.fileSystem.entityForUri(initializeFromDillUri);
     if (await entity.exists()) {
       List<int> initializationBytes = await entity.readAsBytes();
-      if (initializationBytes != null) {
+      if (initializationBytes != null && initializationBytes.isNotEmpty) {
         ticker.logMs("Read $initializeFromDillUri");
         data.initializationBytes = initializationBytes;
 
@@ -637,8 +730,7 @@
           debugExprUri,
           userCode.loader,
           null,
-          library.scope.createNestedScope("expression"),
-          library.target);
+          library.scope.createNestedScope("expression"));
 
       if (library is DillLibraryBuilder) {
         for (LibraryDependency dependency in library.target.dependencies) {
@@ -699,6 +791,10 @@
       userCode.uriToSource.remove(debugExprUri);
       userCode.loader.sourceBytes.remove(debugExprUri);
 
+      // Make sure the library has a canonical name.
+      Component c = new Component(libraries: [debugLibrary.target]);
+      c.computeCanonicalNames();
+
       userCode.runProcedureTransformations(procedure);
 
       return procedure;
@@ -831,15 +927,22 @@
 
   @override
   void invalidateAllSources() {
-    throw UnimplementedError("Not implemented yet.");
+    if (userCode != null) {
+      Set<Uri> uris = new Set<Uri>.from(userCode.loader.builders.keys);
+      uris.removeAll(dillLoadedData.loader.builders.keys);
+      invalidatedUris.addAll(uris);
+    }
   }
 
   @override
   void setModulesToLoadOnNextComputeDelta(List<Component> components) {
-    throw UnimplementedError("Not implemented yet.");
+    modulesToLoad = components.toList();
   }
 
   /// Internal method.
+  void recordNonFullComponentForTesting(Component component) {}
+
+  /// Internal method.
   void recordInvalidatedImportUrisForTesting(List<Uri> uris) {}
 
   /// Internal method.
diff --git a/front_end/lib/src/fasta/kernel/body_builder.dart b/front_end/lib/src/fasta/kernel/body_builder.dart
index 7655108..cbd139f 100644
--- a/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -45,7 +45,8 @@
 
 import '../scanner.dart' show Token;
 
-import '../scanner/token.dart' show isBinaryOperator, isMinusOperator;
+import '../scanner/token.dart'
+    show isBinaryOperator, isMinusOperator, isUserDefinableOperator;
 
 import '../scope.dart' show ProblemBuilder;
 
@@ -65,7 +66,12 @@
 import '../type_inference/type_promotion.dart'
     show TypePromoter, TypePromotionFact, TypePromotionScope;
 
-import 'collections.dart' show SpreadElement, SpreadMapEntry;
+import 'collections.dart'
+    show
+        SpreadElement,
+        SpreadMapEntry,
+        convertToMapEntry,
+        isConvertibleToMapEntry;
 
 import 'constness.dart' show Constness;
 
@@ -525,16 +531,26 @@
   }
 
   @override
-  void endTopLevelFields(Token staticToken, Token covariantToken,
-      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
+  void endTopLevelFields(
+      Token staticToken,
+      Token covariantToken,
+      Token lateToken,
+      Token varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
     debugEvent("TopLevelFields");
+    // TODO(danrubel): handle NNBD 'late' modifier
+    reportNonNullableModifierError(lateToken);
     push(count);
   }
 
   @override
-  void endFields(Token staticToken, Token covariantToken, Token varFinalOrConst,
-      int count, Token beginToken, Token endToken) {
+  void endFields(Token staticToken, Token covariantToken, Token lateToken,
+      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
     debugEvent("Fields");
+    // TODO(danrubel): handle NNBD 'late' modifier
+    reportNonNullableModifierError(lateToken);
     push(count);
   }
 
@@ -585,7 +601,9 @@
       buildDartType(pop()); // Type.
     }
     List<Expression> annotations = pop();
-    if (annotations != null) {
+    // Fields with duplicate names are sorted out in the else branch of the
+    // `declaration.next == null` above.
+    if (annotations != null && fields.isNotEmpty) {
       inferAnnotations(annotations);
       Field field = fields.first.target;
       // The first (and often only field) will not get a clone.
@@ -904,10 +922,22 @@
 
   void resolveRedirectingFactoryTargets() {
     for (StaticInvocation invocation in redirectingFactoryInvocations) {
-      // If the invocation was invalid, it has already been desugared into
-      // an exception throwing expression. There is nothing to resolve anymore.
-      if (invocation.parent == null) {
-        continue;
+      // If the invocation was invalid, it or its parent has already been
+      // desugared into an exception throwing expression.  There is nothing to
+      // resolve anymore.  Note that in the case where the invocation's parent
+      // was invalid, type inference won't reach the invocation node and won't
+      // set its inferredType field.  If type inference is disabled, reach to
+      // the outtermost parent to check if the node is a dead code.
+      if (invocation.parent == null) continue;
+      if (_typeInferrer != null) {
+        if (invocation is FactoryConstructorInvocationJudgment &&
+            invocation.inferredType == null) {
+          continue;
+        }
+      } else {
+        TreeNode parent = invocation.parent;
+        while (parent is! Component && parent != null) parent = parent.parent;
+        if (parent == null) continue;
       }
 
       Procedure initialTarget = invocation.target;
@@ -1374,8 +1404,15 @@
       negate = true;
     }
     if (!isBinaryOperator(operator) && !isMinusOperator(operator)) {
-      return buildProblem(fasta.templateInvalidOperator.withArguments(token),
-          token.charOffset, token.length);
+      if (isUserDefinableOperator(operator)) {
+        return buildProblem(
+            fasta.templateNotBinaryOperator.withArguments(token),
+            token.charOffset,
+            token.length);
+      } else {
+        return buildProblem(fasta.templateInvalidOperator.withArguments(token),
+            token.charOffset, token.length);
+      }
     } else {
       Expression result = buildMethodInvocation(a, new Name(operator),
           forest.arguments(<Expression>[b], noLocation), token.charOffset,
@@ -1464,7 +1501,7 @@
       int offset = candidate.fileOffset;
       Message contextMessage;
       int length = noLength;
-      if (offset == -1 && candidate is Constructor) {
+      if (candidate is Constructor && candidate.isSynthetic) {
         offset = candidate.enclosingClass.fileOffset;
         contextMessage = fasta.templateCandidateFoundIsDefaultConstructor
             .withArguments(candidate.enclosingClass.name);
@@ -2105,8 +2142,11 @@
   }
 
   @override
-  void beginVariablesDeclaration(Token token, Token varFinalOrConst) {
+  void beginVariablesDeclaration(
+      Token token, Token lateToken, Token varFinalOrConst) {
     debugEvent("beginVariablesDeclaration");
+    // TODO(danrubel): handle NNBD 'late' modifier
+    reportNonNullableModifierError(lateToken);
     UnresolvedType<KernelTypeBuilder> type = pop();
     int modifiers = Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme);
     super.push(currentLocalVariableModifiers);
@@ -2270,22 +2310,18 @@
 
   @override
   void endForControlFlow(Token token) {
-    debugEvent("endForControlFlow");
-    // TODO(danrubel) implement control flow support
-
+    debugEvent("ForControlFlow");
     var entry = pop();
     int updateExpressionCount = pop();
     pop(); // left separator
     pop(); // left parenthesis
     Token forToken = pop();
-
-    popListForEffect(updateExpressionCount); // updates
-    popStatement(); // condition
+    List<Expression> updates = popListForEffect(updateExpressionCount);
+    Statement conditionStatement = popStatement(); // condition
     Object variableOrExpression = pop();
+    exitLocalScope();
 
-    if (entry != invalidCollectionElement) {
-      // TODO(danrubel): Replace with control flow structures
-      buildVariableDeclarations(variableOrExpression); // variables
+    if (!library.loader.target.enableControlFlowCollections) {
       // TODO(danrubel): Report a more user friendly error message
       // when an experiment is not enabled
       handleRecoverableError(
@@ -2293,9 +2329,35 @@
           forToken,
           forToken);
       push(invalidCollectionElement);
-    } else {
-      // TODO(danrubel): Remove once unified collections enabled by default
+      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);
+    Expression condition;
+    if (forest.isExpressionStatement(conditionStatement)) {
+      condition =
+          forest.getExpressionFromExpressionStatement(conditionStatement);
+    } else {
+      assert(forest.isEmptyStatement(conditionStatement));
+    }
+    if (entry is MapEntry) {
+      push(forest.forMapEntry(variables, condition, updates, entry, forToken));
+    } else {
+      push(forest.forElement(
+          variables, condition, updates, toValue(entry), forToken));
     }
   }
 
@@ -2431,7 +2493,7 @@
         if (entry is MapEntry) {
           // TODO(danrubel): report the error on the colon
           addProblem(fasta.templateExpectedButGot.withArguments(','),
-              entry.value.fileOffset - 1, 1);
+              entry.fileOffset, 1);
         } else {
           // TODO(danrubel): Revise once control flow and spread
           //  collection entries are supported.
@@ -2493,6 +2555,13 @@
     final typeArgCount = typeArguments?.length;
     bool isSet = typeArgCount == 1 ? true : typeArgCount != null ? false : null;
 
+    for (int i = 0; i < setOrMapEntries.length; ++i) {
+      if (setOrMapEntries[i] is! MapEntry &&
+          !isConvertibleToMapEntry(setOrMapEntries[i])) {
+        hasSetEntry = true;
+      }
+    }
+
     // TODO(danrubel): If the type arguments are not known (null) then
     // defer set/map determination until after type resolution as per the
     // unified collection spec: https://github.com/dart-lang/language/pull/200
@@ -2502,7 +2571,15 @@
     if (isSet) {
       buildLiteralSet(typeArguments, constKeyword, leftBrace, setOrMapEntries);
     } else {
-      buildLiteralMap(typeArguments, constKeyword, leftBrace, setOrMapEntries);
+      List<MapEntry> mapEntries = new List<MapEntry>(setOrMapEntries.length);
+      for (int i = 0; i < setOrMapEntries.length; ++i) {
+        if (setOrMapEntries[i] is MapEntry) {
+          mapEntries[i] = setOrMapEntries[i];
+        } else {
+          mapEntries[i] = convertToMapEntry(setOrMapEntries[i], this);
+        }
+      }
+      buildLiteralMap(typeArguments, constKeyword, leftBrace, mapEntries);
     }
   }
 
@@ -2527,7 +2604,7 @@
   }
 
   void buildLiteralMap(List<UnresolvedType<KernelTypeBuilder>> typeArguments,
-      Token constKeyword, Token leftBrace, List<dynamic> setOrMapEntries) {
+      Token constKeyword, Token leftBrace, List<MapEntry> entries) {
     DartType keyType;
     DartType valueType;
     if (typeArguments != null) {
@@ -2548,24 +2625,6 @@
       valueType = implicitTypeArgument;
     }
 
-    List<MapEntry> entries = <MapEntry>[];
-    if (setOrMapEntries != null) {
-      for (var entry in setOrMapEntries) {
-        if (entry is MapEntry) {
-          entries.add(entry);
-        } else if (entry is SpreadElement) {
-          entries.add(new SpreadMapEntry(entry.expression, entry.isNullAware));
-        } else {
-          addProblem(
-            fasta.templateExpectedAfterButGot.withArguments(':'),
-            (entry as Expression).fileOffset,
-            // TODO(danrubel): what is the length of the expression?
-            1,
-          );
-        }
-      }
-    }
-
     Expression node = forest.literalMap(
         constKeyword,
         constKeyword != null || constantContext == ConstantContext.inferred,
@@ -2740,7 +2799,8 @@
     DartType type = buildDartType(pop());
     library.checkBoundsInType(type, typeEnvironment, operator.charOffset);
     Expression expression = popForValue();
-    if (constantContext != ConstantContext.none) {
+    if (!library.loader.target.enableConstantUpdate2018 &&
+        constantContext != ConstantContext.none) {
       push(desugarSyntheticExpression(buildProblem(
           fasta.templateNotConstantExpression.withArguments('As expression'),
           operator.charOffset,
@@ -2764,7 +2824,8 @@
       typePromoter?.handleIsCheck(isExpression, isInverted, operand.variable,
           type, functionNestingLevel);
     }
-    if (constantContext != ConstantContext.none) {
+    if (!library.loader.target.enableConstantUpdate2018 &&
+        constantContext != ConstantContext.none) {
       push(desugarSyntheticExpression(buildProblem(
           fasta.templateNotConstantExpression.withArguments('Is expression'),
           isOperator.charOffset,
@@ -2816,8 +2877,10 @@
   }
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
-      Token varFinalOrConst) {
+  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
+      Token covariantToken, Token varFinalOrConst) {
+    // TODO(danrubel): handle required token
+    reportNonNullableModifierError(requiredToken);
     push((covariantToken != null ? covariantMask : 0) |
         Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme));
   }
@@ -3646,6 +3709,7 @@
         token.next, token.offset, Constness.explicitConst);
   }
 
+  @override
   void beginIfControlFlow(Token ifToken) {
     // TODO(danrubel): consider removing this when control flow support is added
     // if the ifToken is not needed for error reporting
@@ -3653,11 +3717,26 @@
   }
 
   @override
+  void beginThenControlFlow(Token token) {
+    Expression condition = popForValue();
+    enterThenForTypePromotion(condition);
+    push(condition);
+    super.beginThenControlFlow(token);
+  }
+
+  @override
+  void handleElseControlFlow(Token elseToken) {
+    typePromoter?.enterElse();
+  }
+
+  @override
   void endIfControlFlow(Token token) {
     debugEvent("endIfControlFlow");
     var entry = pop();
     var condition = pop(); // parenthesized expression
     Token ifToken = pop();
+    typePromoter?.enterElse();
+    typePromoter?.exitConditional();
     if (!library.loader.target.enableControlFlowCollections) {
       // TODO(danrubel): Report a more user friendly error message
       // when an experiment is not enabled
@@ -3668,10 +3747,18 @@
       push(invalidCollectionElement);
       return;
     }
-    if (entry == invalidCollectionElement) {
+
+    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));
@@ -3687,6 +3774,7 @@
     var thenEntry = pop(); // then entry
     var condition = pop(); // parenthesized expression
     Token ifToken = pop();
+    typePromoter?.exitConditional();
     if (!library.loader.target.enableControlFlowCollections) {
       // TODO(danrubel): Report a more user friendly error message
       // when an experiment is not enabled
@@ -3697,11 +3785,18 @@
       push(invalidCollectionElement);
       return;
     }
-    if (thenEntry == invalidCollectionElement ||
-        elseEntry == invalidCollectionElement) {
+
+    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) {
@@ -3714,7 +3809,16 @@
             new SpreadMapEntry(elseEntry.expression, elseEntry.isNullAware),
             ifToken));
       } else {
-        push(invalidCollectionElement);
+        int offset = elseEntry is Expression
+            ? elseEntry.fileOffset
+            : offsetForToken(ifToken);
+        push(new MapEntry(
+            desugarSyntheticExpression(buildProblem(
+                fasta.templateExpectedAfterButGot.withArguments(':'),
+                offset,
+                1)),
+            new NullLiteral())
+          ..fileOffset = offsetForToken(ifToken));
       }
     } else if (elseEntry is MapEntry) {
       if (thenEntry is SpreadElement) {
@@ -3724,7 +3828,16 @@
             elseEntry,
             ifToken));
       } else {
-        push(invalidCollectionElement);
+        int offset = thenEntry is Expression
+            ? thenEntry.fileOffset
+            : offsetForToken(ifToken);
+        push(new MapEntry(
+            desugarSyntheticExpression(buildProblem(
+                fasta.templateExpectedAfterButGot.withArguments(':'),
+                offset,
+                1)),
+            new NullLiteral())
+          ..fileOffset = offsetForToken(ifToken));
       }
     } else {
       push(forest.ifElement(
@@ -3744,6 +3857,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));
   }
@@ -4036,18 +4161,16 @@
 
   @override
   void endForInControlFlow(Token token) {
-    debugEvent("endForInControlFlow");
-    // TODO(danrubel) implement control flow support
-
+    debugEvent("ForInControlFlow");
     var entry = pop();
-    pop(); // `in` keyword
+    Token inToken = pop();
     Token forToken = pop();
-    pop(NullValue.AwaitToken); // await token
-    popForValue(); // expression
-    pop(); // lvalue
+    Token awaitToken = pop(NullValue.AwaitToken);
+    Expression iterable = popForValue();
+    Object lvalue = pop(); // lvalue
+    exitLocalScope();
 
-    if (entry != invalidCollectionElement) {
-      // TODO(danrubel): Replace this with control flow element
+    if (!library.loader.target.enableControlFlowCollections) {
       // TODO(danrubel): Report a more user friendly error message
       // when an experiment is not enabled
       handleRecoverableError(
@@ -4055,10 +4178,106 @@
           forToken,
           forToken);
       push(invalidCollectionElement);
-    } else {
-      // TODO(danrubel): Remove once unified collections enabled by default
-      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);
+    Statement prologue = buildForInBody(lvalue, variable, forToken, inToken);
+    if (entry is MapEntry) {
+      push(forest.forInMapEntry(
+          variable, iterable, prologue, entry, problem, forToken,
+          isAsync: awaitToken != null));
+    } else {
+      push(forest.forInElement(
+          variable, iterable, prologue, toValue(entry), problem, forToken,
+          isAsync: awaitToken != null));
+    }
+  }
+
+  VariableDeclaration buildForInVariable(Object lvalue) {
+    if (lvalue is VariableDeclaration) return lvalue;
+    return new VariableDeclarationJudgment.forValue(null, functionNestingLevel);
+  }
+
+  Expression checkForInVariable(
+      Object lvalue, VariableDeclaration variable, Token forToken) {
+    if (lvalue is VariableDeclaration) {
+      if (variable.isConst) {
+        return buildProblem(fasta.messageForInLoopWithConstVariable,
+            variable.fileOffset, variable.name.length);
+      }
+    } else if (lvalue is! Generator) {
+      Message message = forest.isVariablesDeclaration(lvalue)
+          ? fasta.messageForInLoopExactlyOneVariable
+          : fasta.messageForInLoopNotAssignable;
+      Token token = forToken.next.next;
+      return buildProblem(
+          message, offsetForToken(token), lengthForToken(token));
+    }
+    return null;
+  }
+
+  Statement buildForInBody(Object lvalue, VariableDeclaration variable,
+      Token forToken, Token inKeyword) {
+    if (lvalue is VariableDeclaration) return null;
+    if (lvalue is Generator) {
+      /// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
+      ///
+      ///     for (lvalue in expression) body
+      ///
+      /// This is normalized to:
+      ///
+      ///     for (final #t in expression) {
+      ///       lvalue = #t;
+      ///       body;
+      ///     }
+      TypePromotionFact fact =
+          typePromoter?.getFactForAccess(variable, functionNestingLevel);
+      TypePromotionScope scope = typePromoter?.currentScope;
+      Expression syntheticAssignment = lvalue.buildAssignment(
+          new VariableGetJudgment(variable, fact, scope)
+            ..fileOffset = inKeyword.offset,
+          voidContext: true);
+      if (syntheticAssignment is shadow.SyntheticExpressionJudgment) {
+        syntheticAssignment = wrapSyntheticExpression(
+            desugarSyntheticExpression(syntheticAssignment),
+            offsetForToken(lvalue.token));
+      }
+      return forest.expressionStatement(syntheticAssignment, null);
+    }
+    Message message = forest.isVariablesDeclaration(lvalue)
+        ? fasta.messageForInLoopExactlyOneVariable
+        : fasta.messageForInLoopNotAssignable;
+    Token token = forToken.next.next;
+    Statement body;
+    if (forest.isVariablesDeclaration(lvalue)) {
+      body = forest.block(
+          null,
+          // New list because the declarations are not a growable list.
+          new List<Statement>.from(
+              forest.variablesDeclarationExtractDeclarations(lvalue)),
+          null);
+    } else {
+      body = forest.expressionStatement(lvalue, null);
+    }
+    return combineStatements(
+        forest.expressionStatement(
+            buildProblem(message, offsetForToken(token), lengthForToken(token)),
+            null),
+        body);
   }
 
   @override
@@ -4079,67 +4298,22 @@
       body = forest.syntheticLabeledStatement(body);
       continueTarget.resolveContinues(forest, body);
     }
-    VariableDeclaration variable;
-    Expression problem;
-    if (lvalue is VariableDeclaration) {
-      variable = lvalue;
-      if (variable.isConst) {
-        problem = buildProblem(fasta.messageForInLoopWithConstVariable,
-            variable.fileOffset, variable.name.length);
-      }
-    } else if (lvalue is Generator) {
-      /// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
-      ///
-      ///     for (lvalue in expression) body
-      ///
-      /// This is normalized to:
-      ///
-      ///     for (final #t in expression) {
-      ///       lvalue = #t;
-      ///       body;
-      ///     }
-      variable =
-          new VariableDeclarationJudgment.forValue(null, functionNestingLevel);
-      TypePromotionFact fact =
-          typePromoter?.getFactForAccess(variable, functionNestingLevel);
-      TypePromotionScope scope = typePromoter?.currentScope;
-      Expression syntheticAssignment = lvalue.buildAssignment(
-          new VariableGetJudgment(variable, fact, scope)
-            ..fileOffset = inKeyword.offset,
-          voidContext: true);
-      if (syntheticAssignment is shadow.SyntheticExpressionJudgment) {
-        syntheticAssignment = wrapSyntheticExpression(
-            desugarSyntheticExpression(syntheticAssignment),
-            offsetForToken(lvalue.token));
-      }
-      body = combineStatements(
-          forest.expressionStatement(syntheticAssignment, null), body);
-    } else {
-      Message message = forest.isVariablesDeclaration(lvalue)
-          ? fasta.messageForInLoopExactlyOneVariable
-          : fasta.messageForInLoopNotAssignable;
-      Token token = forToken.next.next;
-      variable =
-          new VariableDeclarationJudgment.forValue(null, functionNestingLevel);
-      problem =
-          buildProblem(message, offsetForToken(token), lengthForToken(token));
-      if (forest.isVariablesDeclaration(lvalue)) {
-        body = forest.block(
-            null,
-            <Statement>[]
-              ..addAll(forest.variablesDeclarationExtractDeclarations(lvalue))
-              ..add(body),
-            null);
+    VariableDeclaration variable = buildForInVariable(lvalue);
+    Expression problem = checkForInVariable(lvalue, variable, forToken);
+    Statement prologue = buildForInBody(lvalue, variable, forToken, inKeyword);
+    if (prologue != null) {
+      if (prologue is Block) {
+        if (body is Block) {
+          for (Statement statement in body.statements) {
+            prologue.addStatement(statement);
+          }
+        } else {
+          prologue.addStatement(body);
+        }
+        body = prologue;
       } else {
-        body =
-            combineStatements(forest.expressionStatement(lvalue, null), body);
+        body = combineStatements(prologue, body);
       }
-      body = combineStatements(
-          forest.expressionStatement(
-              buildProblem(
-                  message, offsetForToken(token), lengthForToken(token)),
-              null),
-          body);
     }
     Statement result = new ForInStatement(variable, expression, body,
         isAsync: awaitToken != null)
diff --git a/front_end/lib/src/fasta/kernel/collections.dart b/front_end/lib/src/fasta/kernel/collections.dart
index 74f6789..a943ece 100644
--- a/front_end/lib/src/fasta/kernel/collections.dart
+++ b/front_end/lib/src/fasta/kernel/collections.dart
@@ -10,10 +10,12 @@
         DartType,
         Expression,
         MapEntry,
-        setParents,
-        transformList,
+        NullLiteral,
+        Statement,
         TreeNode,
         VariableDeclaration,
+        setParents,
+        transformList,
         visitList;
 
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
@@ -26,12 +28,20 @@
         TreeVisitor,
         Visitor;
 
+import '../messages.dart'
+    show templateExpectedAfterButGot, templateExpectedButGot;
+
 import '../problems.dart' show getFileUri, unsupported;
 
+import '../type_inference/inference_helper.dart' show InferenceHelper;
+
+/// Mixin for spread and control-flow elements.
+///
 /// Spread and control-flow elements are not truly expressions and they cannot
 /// appear in arbitrary expression contexts in the Kernel program.  They can
-/// only appear as elements in list or set literals.
-mixin _FakeExpressionMixin on Expression {
+/// only appear as elements in list or set literals.  They are translated into
+/// a lower-level representation and never serialized to .dill files.
+mixin ControlFlowElement on Expression {
   /// Spread and contol-flow elements are not expressions and do not have a
   /// static type.
   @override
@@ -48,10 +58,16 @@
 }
 
 /// A spread element in a list or set literal.
-class SpreadElement extends Expression with _FakeExpressionMixin {
+class SpreadElement extends Expression with ControlFlowElement {
   Expression expression;
   bool isNullAware;
 
+  /// The type of the elements of the collection that [expression] evaluates to.
+  ///
+  /// It is set during type inference and is used to add appropriate type casts
+  /// during the desugaring.
+  DartType elementType;
+
   SpreadElement(this.expression, this.isNullAware) {
     expression?.parent = this;
   }
@@ -71,7 +87,7 @@
 }
 
 /// An 'if' element in a list or set literal.
-class IfElement extends Expression with _FakeExpressionMixin {
+class IfElement extends Expression with ControlFlowElement {
   Expression condition;
   Expression then;
   Expression otherwise;
@@ -107,7 +123,7 @@
 }
 
 /// A 'for' element in a list or set literal.
-class ForElement extends Expression with _FakeExpressionMixin {
+class ForElement extends Expression with ControlFlowElement {
   final List<VariableDeclaration> variables; // May be empty, but not null.
   Expression condition; // May be null.
   final List<Expression> updates; // May be empty, but not null.
@@ -144,22 +160,30 @@
 }
 
 /// A 'for-in' element in a list or set literal.
-class ForInElement extends Expression with _FakeExpressionMixin {
+class ForInElement extends Expression with ControlFlowElement {
   VariableDeclaration variable; // Has no initializer.
   Expression iterable;
+  Statement prologue; // May be null.
   Expression body;
+  Expression problem; // May be null.
   bool isAsync; // True if this is an 'await for' loop.
 
-  ForInElement(this.variable, this.iterable, this.body, {this.isAsync: false}) {
+  ForInElement(
+      this.variable, this.iterable, this.prologue, this.body, this.problem,
+      {this.isAsync: false}) {
     variable?.parent = this;
     iterable?.parent = this;
+    prologue?.parent = this;
     body?.parent = this;
+    problem?.parent = this;
   }
 
   visitChildren(Visitor<Object> v) {
     variable?.accept(v);
     iterable?.accept(v);
+    prologue?.accept(v);
     body?.accept(v);
+    problem?.accept(v);
   }
 
   transformChildren(Transformer v) {
@@ -171,47 +195,61 @@
       iterable = iterable.accept(v);
       iterable?.parent = this;
     }
+    if (prologue != null) {
+      prologue = prologue.accept(v);
+      prologue?.parent = this;
+    }
     if (body != null) {
       body = body.accept(v);
       body?.parent = this;
     }
+    if (problem != null) {
+      problem = problem.accept(v);
+      problem?.parent = this;
+    }
   }
 }
 
-mixin _FakeMapEntryMixin implements MapEntry {
+mixin ControlFlowMapEntry implements MapEntry {
   @override
-  Expression get key => throw UnsupportedError('SpreadMapEntry.key getter');
+  Expression get key {
+    throw UnsupportedError('ControlFlowMapEntry.key getter');
+  }
 
   @override
   void set key(Expression expr) {
-    throw UnsupportedError('SpreadMapEntry.key setter');
+    throw UnsupportedError('ControlFlowMapEntry.key setter');
   }
 
   @override
-  Expression get value => throw UnsupportedError('SpreadMapEntry.value getter');
+  Expression get value {
+    throw UnsupportedError('ControlFlowMapEntry.value getter');
+  }
 
   @override
   void set value(Expression expr) {
-    throw UnsupportedError('SpreadMapEntry.value setter');
+    throw UnsupportedError('ControlFlowMapEntry.value setter');
   }
 
   @override
-  accept(TreeVisitor<Object> v) {
-    throw UnsupportedError('SpreadMapEntry.accept');
-  }
+  accept(TreeVisitor<Object> v) => v.defaultTreeNode(this);
 }
 
 /// A spread element in a map literal.
-class SpreadMapEntry extends TreeNode with _FakeMapEntryMixin {
+class SpreadMapEntry extends TreeNode with ControlFlowMapEntry {
   Expression expression;
   bool isNullAware;
 
+  /// The type of the map entries of the map that [expression] evaluates to.
+  ///
+  /// It is set during type inference and is used to add appropriate type casts
+  /// during the desugaring.
+  DartType entryType;
+
   SpreadMapEntry(this.expression, this.isNullAware) {
     expression?.parent = this;
   }
 
-  accept(TreeVisitor<Object> v) => v.defaultTreeNode(this);
-
   @override
   visitChildren(Visitor<Object> v) {
     expression?.accept(v);
@@ -227,7 +265,7 @@
 }
 
 /// An 'if' element in a map literal.
-class IfMapEntry extends TreeNode with _FakeMapEntryMixin {
+class IfMapEntry extends TreeNode with ControlFlowMapEntry {
   Expression condition;
   MapEntry then;
   MapEntry otherwise;
@@ -263,7 +301,7 @@
 }
 
 /// A 'for' element in a map literal.
-class ForMapEntry extends TreeNode with _FakeMapEntryMixin {
+class ForMapEntry extends TreeNode with ControlFlowMapEntry {
   final List<VariableDeclaration> variables; // May be empty, but not null.
   Expression condition; // May be null.
   final List<Expression> updates; // May be empty, but not null.
@@ -300,23 +338,30 @@
 }
 
 /// A 'for-in' element in a map literal.
-class ForInMapEntry extends TreeNode with _FakeMapEntryMixin {
+class ForInMapEntry extends TreeNode with ControlFlowMapEntry {
   VariableDeclaration variable; // Has no initializer.
   Expression iterable;
+  Statement prologue; // May be null.
   MapEntry body;
+  Expression problem; // May be null.
   bool isAsync; // True if this is an 'await for' loop.
 
-  ForInMapEntry(this.variable, this.iterable, this.body,
+  ForInMapEntry(
+      this.variable, this.iterable, this.prologue, this.body, this.problem,
       {this.isAsync: false}) {
     variable?.parent = this;
     iterable?.parent = this;
+    prologue?.parent = this;
     body?.parent = this;
+    problem?.parent = this;
   }
 
   visitChildren(Visitor<Object> v) {
     variable?.accept(v);
     iterable?.accept(v);
+    prologue?.accept(v);
     body?.accept(v);
+    problem?.accept(v);
   }
 
   transformChildren(Transformer v) {
@@ -328,9 +373,104 @@
       iterable = iterable.accept(v);
       iterable?.parent = this;
     }
+    if (prologue != null) {
+      prologue = prologue.accept(v);
+      prologue?.parent = this;
+    }
     if (body != null) {
       body = body.accept(v);
       body?.parent = this;
     }
+    if (problem != null) {
+      problem = problem.accept(v);
+      problem?.parent = this;
+    }
   }
 }
+
+Expression convertToElement(MapEntry entry, InferenceHelper helper) {
+  if (entry is SpreadMapEntry) {
+    return new SpreadElement(entry.expression, entry.isNullAware)
+      ..fileOffset = entry.expression.fileOffset;
+  }
+  if (entry is IfMapEntry) {
+    return new IfElement(
+        entry.condition,
+        convertToElement(entry.then, helper),
+        entry.otherwise == null
+            ? null
+            : convertToElement(entry.otherwise, helper))
+      ..fileOffset = entry.fileOffset;
+  }
+  if (entry is ForMapEntry) {
+    return new ForElement(entry.variables, entry.condition, entry.updates,
+        convertToElement(entry.body, helper))
+      ..fileOffset = entry.fileOffset;
+  }
+  if (entry is ForInMapEntry) {
+    return new ForInElement(entry.variable, entry.iterable, entry.prologue,
+        convertToElement(entry.body, helper), entry.problem,
+        isAsync: entry.isAsync)
+      ..fileOffset = entry.fileOffset;
+  }
+  return helper.desugarSyntheticExpression(helper.buildProblem(
+    templateExpectedButGot.withArguments(','),
+    entry.fileOffset,
+    1,
+  ));
+}
+
+bool isConvertibleToMapEntry(Expression element) {
+  if (element is SpreadElement) return true;
+  if (element is IfElement) {
+    return isConvertibleToMapEntry(element.then) &&
+        (element.otherwise == null ||
+            isConvertibleToMapEntry(element.otherwise));
+  }
+  if (element is ForElement) {
+    return isConvertibleToMapEntry(element.body);
+  }
+  if (element is ForInElement) {
+    return isConvertibleToMapEntry(element.body);
+  }
+  return false;
+}
+
+MapEntry convertToMapEntry(Expression element, InferenceHelper helper) {
+  if (element is SpreadElement) {
+    return new SpreadMapEntry(element.expression, element.isNullAware)
+      ..fileOffset = element.expression.fileOffset;
+  }
+  if (element is IfElement) {
+    return new IfMapEntry(
+        element.condition,
+        convertToMapEntry(element.then, helper),
+        element.otherwise == null
+            ? null
+            : convertToMapEntry(element.otherwise, helper))
+      ..fileOffset = element.fileOffset;
+  }
+  if (element is ForElement) {
+    return new ForMapEntry(element.variables, element.condition,
+        element.updates, convertToMapEntry(element.body, helper))
+      ..fileOffset = element.fileOffset;
+  }
+  if (element is ForInElement) {
+    return new ForInMapEntry(
+        element.variable,
+        element.iterable,
+        element.prologue,
+        convertToMapEntry(element.body, helper),
+        element.problem,
+        isAsync: element.isAsync)
+      ..fileOffset = element.fileOffset;
+  }
+  return new MapEntry(
+      helper.desugarSyntheticExpression(helper.buildProblem(
+        templateExpectedAfterButGot.withArguments(':'),
+        element.fileOffset,
+        // TODO(danrubel): what is the length of the expression?
+        1,
+      )),
+      new NullLiteral());
+}
diff --git a/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/front_end/lib/src/fasta/kernel/constant_evaluator.dart
new file mode 100644
index 0000000..510b60b
--- /dev/null
+++ b/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -0,0 +1,2612 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This library implements a kernel2kernel constant evaluation transformation.
+///
+/// Even though it is expected that the frontend does not emit kernel AST which
+/// contains compile-time errors, this transformation still performs some
+/// valiation and throws a [ConstantEvaluationError] if there was a compile-time
+/// errors.
+///
+/// Due to the lack information which is is only available in the front-end,
+/// this validation is incomplete (e.g. whether an integer literal used the
+/// hexadecimal syntax or not).
+///
+/// Furthermore due to the lowering of certain constructs in the front-end
+/// (e.g. '??') we need to support a super-set of the normal constant expression
+/// language.  Issue(http://dartbug.com/31799)
+library fasta.constant_evaluator;
+
+import 'dart:core' hide MapEntry;
+
+import 'dart:io' as io;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart';
+import 'package:kernel/clone.dart';
+import 'package:kernel/core_types.dart';
+import 'package:kernel/kernel.dart';
+import 'package:kernel/type_algebra.dart';
+import 'package:kernel/type_environment.dart';
+
+import 'package:kernel/target/targets.dart';
+
+import '../fasta_codes.dart'
+    show
+        LocatedMessage,
+        Message,
+        messageConstEvalCircularity,
+        messageConstEvalContext,
+        messageConstEvalFailedAssertion,
+        messageConstEvalIterationInConstList,
+        messageConstEvalIterationInConstSet,
+        messageConstEvalIterationInConstMap,
+        messageConstEvalNotListOrSetInSpread,
+        messageConstEvalNotMapInSpread,
+        messageConstEvalNullValue,
+        messageConstEvalUnevaluated,
+        noLength,
+        templateConstEvalDeferredLibrary,
+        templateConstEvalDuplicateElement,
+        templateConstEvalDuplicateKey,
+        templateConstEvalElementImplementsEqual,
+        templateConstEvalFailedAssertionWithMessage,
+        templateConstEvalFreeTypeParameter,
+        templateConstEvalInvalidType,
+        templateConstEvalInvalidBinaryOperandType,
+        templateConstEvalInvalidEqualsOperandType,
+        templateConstEvalInvalidMethodInvocation,
+        templateConstEvalInvalidPropertyGet,
+        templateConstEvalInvalidStaticInvocation,
+        templateConstEvalInvalidStringInterpolationOperand,
+        templateConstEvalInvalidSymbolName,
+        templateConstEvalKeyImplementsEqual,
+        templateConstEvalNegativeShift,
+        templateConstEvalNonConstantLiteral,
+        templateConstEvalNonConstantVariableGet,
+        templateConstEvalZeroDivisor;
+
+import 'collections.dart'
+    show
+        ForElement,
+        ForInElement,
+        IfElement,
+        SpreadElement,
+        ForMapEntry,
+        ForInMapEntry,
+        IfMapEntry,
+        SpreadMapEntry;
+
+Component transformComponent(Component component, ConstantsBackend backend,
+    Map<String, String> environmentDefines, ErrorReporter errorReporter,
+    {bool keepFields: true,
+    bool enableAsserts: false,
+    bool evaluateAnnotations: true,
+    bool desugarSets: false,
+    bool errorOnUnevaluatedConstant: false,
+    CoreTypes coreTypes,
+    ClassHierarchy hierarchy}) {
+  coreTypes ??= new CoreTypes(component);
+  hierarchy ??= new ClassHierarchy(component);
+
+  final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy);
+
+  transformLibraries(component.libraries, backend, environmentDefines,
+      typeEnvironment, errorReporter,
+      keepFields: keepFields,
+      enableAsserts: enableAsserts,
+      desugarSets: desugarSets,
+      errorOnUnevaluatedConstant: errorOnUnevaluatedConstant,
+      evaluateAnnotations: evaluateAnnotations);
+  return component;
+}
+
+void transformLibraries(
+    List<Library> libraries,
+    ConstantsBackend backend,
+    Map<String, String> environmentDefines,
+    TypeEnvironment typeEnvironment,
+    ErrorReporter errorReporter,
+    {bool keepFields: true,
+    bool keepVariables: false,
+    bool evaluateAnnotations: true,
+    bool desugarSets: false,
+    bool errorOnUnevaluatedConstant: false,
+    bool enableAsserts: false}) {
+  final ConstantsTransformer constantsTransformer = new ConstantsTransformer(
+      backend,
+      environmentDefines,
+      keepFields,
+      keepVariables,
+      evaluateAnnotations,
+      desugarSets,
+      errorOnUnevaluatedConstant,
+      typeEnvironment,
+      enableAsserts,
+      errorReporter);
+  for (final Library library in libraries) {
+    constantsTransformer.convertLibrary(library);
+  }
+}
+
+class JavaScriptIntConstant extends DoubleConstant {
+  final BigInt bigIntValue;
+  JavaScriptIntConstant(int value) : this.fromBigInt(BigInt.from(value));
+  JavaScriptIntConstant.fromDouble(double value)
+      : bigIntValue = BigInt.from(value),
+        super(value);
+  JavaScriptIntConstant.fromBigInt(this.bigIntValue)
+      : super(bigIntValue.toDouble());
+  JavaScriptIntConstant.fromUInt64(int value)
+      : this.fromBigInt(BigInt.from(value).toUnsigned(64));
+
+  DartType getType(TypeEnvironment types) => types.intType;
+
+  String toString() => '$bigIntValue';
+}
+
+class ConstantsTransformer extends Transformer {
+  final ConstantEvaluator constantEvaluator;
+  final TypeEnvironment typeEnvironment;
+
+  /// Whether to preserve constant [Field]s.  All use-sites will be rewritten.
+  final bool keepFields;
+  final bool keepVariables;
+  final bool evaluateAnnotations;
+  final bool desugarSets;
+  final bool errorOnUnevaluatedConstant;
+
+  ConstantsTransformer(
+      ConstantsBackend backend,
+      Map<String, String> environmentDefines,
+      this.keepFields,
+      this.keepVariables,
+      this.evaluateAnnotations,
+      this.desugarSets,
+      this.errorOnUnevaluatedConstant,
+      this.typeEnvironment,
+      bool enableAsserts,
+      ErrorReporter errorReporter)
+      : constantEvaluator = new ConstantEvaluator(backend, environmentDefines,
+            typeEnvironment, enableAsserts, errorReporter,
+            desugarSets: desugarSets,
+            errorOnUnevaluatedConstant: errorOnUnevaluatedConstant);
+
+  // Transform the library/class members:
+
+  void convertLibrary(Library library) {
+    transformAnnotations(library.annotations, library);
+
+    transformList(library.dependencies, this, library);
+    transformList(library.parts, this, library);
+    transformList(library.typedefs, this, library);
+    transformList(library.classes, this, library);
+    transformList(library.procedures, this, library);
+    transformList(library.fields, this, library);
+
+    if (!keepFields) {
+      // The transformer API does not iterate over `Library.additionalExports`,
+      // so we manually delete the references to shaken nodes.
+      library.additionalExports.removeWhere((Reference reference) {
+        return reference.node is Field && reference.canonicalName == null;
+      });
+    }
+  }
+
+  visitLibraryPart(LibraryPart node) {
+    constantEvaluator.withNewEnvironment(() {
+      transformAnnotations(node.annotations, node);
+    });
+    return node;
+  }
+
+  visitLibraryDependency(LibraryDependency node) {
+    constantEvaluator.withNewEnvironment(() {
+      transformAnnotations(node.annotations, node);
+    });
+    return node;
+  }
+
+  visitClass(Class node) {
+    constantEvaluator.withNewEnvironment(() {
+      transformAnnotations(node.annotations, node);
+      transformList(node.fields, this, node);
+      transformList(node.typeParameters, this, node);
+      transformList(node.constructors, this, node);
+      transformList(node.procedures, this, node);
+      transformList(node.redirectingFactoryConstructors, this, node);
+    });
+    return node;
+  }
+
+  visitProcedure(Procedure node) {
+    constantEvaluator.withNewEnvironment(() {
+      transformAnnotations(node.annotations, node);
+      node.function = node.function.accept(this)..parent = node;
+    });
+    return node;
+  }
+
+  visitConstructor(Constructor node) {
+    constantEvaluator.withNewEnvironment(() {
+      transformAnnotations(node.annotations, node);
+      transformList(node.initializers, this, node);
+      node.function = node.function.accept(this)..parent = node;
+    });
+    return node;
+  }
+
+  visitTypedef(Typedef node) {
+    constantEvaluator.withNewEnvironment(() {
+      transformAnnotations(node.annotations, node);
+      transformList(node.typeParameters, this, node);
+      transformList(node.typeParametersOfFunctionType, this, node);
+      transformList(node.positionalParameters, this, node);
+      transformList(node.namedParameters, this, node);
+    });
+    return node;
+  }
+
+  visitRedirectingFactoryConstructor(RedirectingFactoryConstructor node) {
+    constantEvaluator.withNewEnvironment(() {
+      transformAnnotations(node.annotations, node);
+      transformList(node.typeParameters, this, node);
+      transformList(node.positionalParameters, this, node);
+      transformList(node.namedParameters, this, node);
+    });
+    return node;
+  }
+
+  visitTypeParameter(TypeParameter node) {
+    transformAnnotations(node.annotations, node);
+    return node;
+  }
+
+  void transformAnnotations(List<Expression> nodes, TreeNode parent) {
+    if (evaluateAnnotations && nodes.length > 0) {
+      transformExpressions(nodes, parent);
+    }
+  }
+
+  void transformExpressions(List<Expression> nodes, TreeNode parent) {
+    constantEvaluator.withNewEnvironment(() {
+      for (int i = 0; i < nodes.length; ++i) {
+        nodes[i] = evaluateAndTransformWithContext(parent, nodes[i])
+          ..parent = parent;
+      }
+    });
+  }
+
+  // Handle definition of constants:
+
+  visitFunctionNode(FunctionNode node) {
+    final positionalParameterCount = node.positionalParameters.length;
+    for (int i = 0; i < positionalParameterCount; ++i) {
+      final VariableDeclaration variable = node.positionalParameters[i];
+      transformAnnotations(variable.annotations, variable);
+      if (variable.initializer != null) {
+        variable.initializer =
+            evaluateAndTransformWithContext(variable, variable.initializer)
+              ..parent = variable;
+      }
+    }
+    for (final VariableDeclaration variable in node.namedParameters) {
+      transformAnnotations(variable.annotations, variable);
+      if (variable.initializer != null) {
+        variable.initializer =
+            evaluateAndTransformWithContext(variable, variable.initializer)
+              ..parent = variable;
+      }
+    }
+    if (node.body != null) {
+      node.body = node.body.accept(this)..parent = node;
+    }
+    return node;
+  }
+
+  visitVariableDeclaration(VariableDeclaration node) {
+    transformAnnotations(node.annotations, node);
+
+    if (node.initializer != null) {
+      if (node.isConst) {
+        final Constant constant = evaluateWithContext(node, node.initializer);
+        constantEvaluator.env.addVariableValue(node, constant);
+
+        if (keepVariables) {
+          // 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, node.initializer)
+            ..parent = node;
+          node.isFinal = true;
+          node.isConst = false;
+        } else {
+          // Since we convert all use-sites of constants, the constant
+          // [VariableDeclaration] is unused and we'll therefore remove it.
+          return null;
+        }
+      } else {
+        node.initializer = node.initializer.accept(this)..parent = node;
+      }
+    }
+    return node;
+  }
+
+  visitField(Field node) {
+    return constantEvaluator.withNewEnvironment(() {
+      if (node.isConst) {
+        // Since we convert all use-sites of constants, the constant [Field]
+        // cannot be referenced anymore.  We therefore get rid of it if
+        // [keepFields] was not specified.
+        if (!keepFields) {
+          return null;
+        }
+
+        // Otherwise we keep the constant [Field] and convert it's initializer.
+        transformAnnotations(node.annotations, node);
+        if (node.initializer != null) {
+          node.initializer =
+              evaluateAndTransformWithContext(node, node.initializer)
+                ..parent = node;
+        }
+      } else {
+        transformAnnotations(node.annotations, node);
+        if (node.initializer != null) {
+          node.initializer = node.initializer.accept(this)..parent = node;
+        }
+      }
+      return node;
+    });
+  }
+
+  // Handle use-sites of constants (and "inline" constant expressions):
+
+  visitSymbolLiteral(SymbolLiteral node) {
+    return makeConstantExpression(constantEvaluator.evaluate(node), node);
+  }
+
+  visitStaticGet(StaticGet node) {
+    final Member target = node.target;
+    if (target is Field && target.isConst) {
+      return evaluateAndTransformWithContext(node, node);
+    } else if (target is Procedure && target.kind == ProcedureKind.Method) {
+      return evaluateAndTransformWithContext(node, node);
+    }
+    return super.visitStaticGet(node);
+  }
+
+  visitSwitchCase(SwitchCase node) {
+    transformExpressions(node.expressions, node);
+    return super.visitSwitchCase(node);
+  }
+
+  visitVariableGet(VariableGet node) {
+    if (node.variable.isConst) {
+      return evaluateAndTransformWithContext(node, node);
+    }
+    return super.visitVariableGet(node);
+  }
+
+  visitListLiteral(ListLiteral node) {
+    if (node.isConst) {
+      return evaluateAndTransformWithContext(node, node);
+    }
+    return super.visitListLiteral(node);
+  }
+
+  visitSetLiteral(SetLiteral node) {
+    if (node.isConst) {
+      return evaluateAndTransformWithContext(node, node);
+    }
+    return super.visitSetLiteral(node);
+  }
+
+  visitMapLiteral(MapLiteral node) {
+    if (node.isConst) {
+      return evaluateAndTransformWithContext(node, node);
+    }
+    return super.visitMapLiteral(node);
+  }
+
+  visitConstructorInvocation(ConstructorInvocation node) {
+    if (node.isConst) {
+      return evaluateAndTransformWithContext(node, node);
+    }
+    return super.visitConstructorInvocation(node);
+  }
+
+  visitStaticInvocation(StaticInvocation node) {
+    if (node.isConst) {
+      return evaluateAndTransformWithContext(node, node);
+    }
+    return super.visitStaticInvocation(node);
+  }
+
+  visitConstantExpression(ConstantExpression node) {
+    Constant constant = node.constant;
+    if (constant is UnevaluatedConstant) {
+      Expression expression = constant.expression;
+      return evaluateAndTransformWithContext(expression, expression);
+    } else {
+      node.constant = constantEvaluator.canonicalize(constant);
+      return node;
+    }
+  }
+
+  evaluateAndTransformWithContext(TreeNode treeContext, Expression node) {
+    return makeConstantExpression(evaluateWithContext(treeContext, node), node);
+  }
+
+  evaluateWithContext(TreeNode treeContext, Expression node) {
+    if (treeContext == node) {
+      return constantEvaluator.evaluate(node);
+    }
+
+    return constantEvaluator.runInsideContext(treeContext, () {
+      return constantEvaluator.evaluate(node);
+    });
+  }
+
+  Expression makeConstantExpression(Constant constant, Expression node) {
+    if (constant is UnevaluatedConstant &&
+        constant.expression is InvalidExpression) {
+      return constant.expression;
+    }
+    return new ConstantExpression(constant, node.getStaticType(typeEnvironment))
+      ..fileOffset = node.fileOffset;
+  }
+}
+
+class ConstantEvaluator extends RecursiveVisitor<Constant> {
+  final ConstantsBackend backend;
+  final NumberSemantics numberSemantics;
+  Map<String, String> environmentDefines;
+  final bool errorOnUnevaluatedConstant;
+  final CoreTypes coreTypes;
+  final TypeEnvironment typeEnvironment;
+  final bool enableAsserts;
+  final ErrorReporter errorReporter;
+
+  final bool desugarSets;
+  final Field unmodifiableSetMap;
+
+  final isInstantiated = new IsInstantiatedVisitor().isInstantiated;
+
+  final Map<Constant, Constant> canonicalizationCache;
+  final Map<Node, Object> nodeCache;
+  final CloneVisitor cloner = new CloneVisitor();
+
+  Map<Class, bool> primitiveEqualCache;
+
+  final NullConstant nullConstant = new NullConstant();
+  final BoolConstant trueConstant = new BoolConstant(true);
+  final BoolConstant falseConstant = new BoolConstant(false);
+
+  final List<TreeNode> contextChain = [];
+
+  InstanceBuilder instanceBuilder;
+  EvaluationEnvironment env;
+  Set<Expression> replacementNodes = new Set<Expression>.identity();
+  Map<Constant, Constant> lowered = new Map<Constant, Constant>.identity();
+
+  bool seenUnevaluatedChild; // Any children that were left unevaluated?
+  int lazyDepth; // Current nesting depth of lazy regions.
+
+  bool get shouldBeUnevaluated => seenUnevaluatedChild || lazyDepth != 0;
+
+  bool get targetingJavaScript => numberSemantics == NumberSemantics.js;
+
+  ConstantEvaluator(this.backend, this.environmentDefines, this.typeEnvironment,
+      this.enableAsserts, this.errorReporter,
+      {this.desugarSets = false, this.errorOnUnevaluatedConstant = false})
+      : numberSemantics = backend.numberSemantics,
+        coreTypes = typeEnvironment.coreTypes,
+        canonicalizationCache = <Constant, Constant>{},
+        nodeCache = <Node, Constant>{},
+        env = new EvaluationEnvironment(),
+        unmodifiableSetMap = desugarSets
+            ? typeEnvironment.coreTypes.index
+                .getMember('dart:collection', '_UnmodifiableSet', '_map')
+            : null {
+    primitiveEqualCache = <Class, bool>{
+      coreTypes.boolClass: true,
+      coreTypes.doubleClass: false,
+      coreTypes.intClass: true,
+      coreTypes.internalSymbolClass: true,
+      coreTypes.listClass: true,
+      coreTypes.mapClass: true,
+      coreTypes.nullClass: true,
+      coreTypes.objectClass: true,
+      coreTypes.setClass: true,
+      coreTypes.stringClass: true,
+      coreTypes.symbolClass: true,
+      coreTypes.typeClass: true,
+    };
+  }
+
+  Uri getFileUri(TreeNode node) {
+    while (node != null && node is! FileUriNode) {
+      node = node.parent;
+    }
+    return (node as FileUriNode)?.fileUri;
+  }
+
+  int getFileOffset(Uri uri, TreeNode node) {
+    if (uri == null) return TreeNode.noOffset;
+    while (node != null && node.fileOffset == TreeNode.noOffset) {
+      node = node.parent;
+    }
+    return node == null ? TreeNode.noOffset : node.fileOffset;
+  }
+
+  /// Evaluate [node] and possibly cache the evaluation result.
+  /// Returns UnevaluatedConstant if the constant could not be evaluated.
+  /// If the expression in the UnevaluatedConstant is an InvalidExpression,
+  /// an error occurred during constant evaluation.
+  Constant evaluate(Expression node) {
+    seenUnevaluatedChild = false;
+    lazyDepth = 0;
+    try {
+      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);
+      final locatedMessage = e.message.withLocation(uri, fileOffset, noLength);
+
+      final contextMessages = <LocatedMessage>[];
+      if (e.context != null) contextMessages.addAll(e.context);
+      for (final TreeNode node in contextChain) {
+        final Uri uri = getFileUri(node);
+        final int fileOffset = getFileOffset(uri, node);
+        contextMessages.add(
+            messageConstEvalContext.withLocation(uri, fileOffset, noLength));
+      }
+      errorReporter.report(locatedMessage, contextMessages);
+      return new UnevaluatedConstant(new InvalidExpression(e.message.message));
+    } on _AbortDueToInvalidExpression catch (e) {
+      // TODO(askesc): Copy position from erroneous node.
+      // Currently not possible, as it might be in a different file.
+      // Can be done if we add an explicit URI to InvalidExpression.
+      InvalidExpression invalid = new InvalidExpression(e.message);
+      if (invalid.fileOffset == TreeNode.noOffset) {
+        invalid.fileOffset = node.fileOffset;
+      }
+      errorReporter.reportInvalidExpression(invalid);
+      return new UnevaluatedConstant(invalid);
+    }
+  }
+
+  /// Report an error that has been detected during constant evaluation.
+  Null report(TreeNode node, Message message, {List<LocatedMessage> context}) {
+    throw new _AbortDueToError(node, message, context: context);
+  }
+
+  /// Report a construct that should not occur inside a potentially constant
+  /// expression. It is assumed that an error has already been reported.
+  Null reportInvalid(TreeNode node, String message) {
+    throw new _AbortDueToInvalidExpression(node, message);
+  }
+
+  /// Produce an unevaluated constant node for an expression.
+  Constant unevaluated(Expression original, Expression replacement) {
+    replacement.fileOffset = original.fileOffset;
+    // TODO(askesc,johnniwinther): Preserve fileUri on [replacement].
+    return new UnevaluatedConstant(replacement);
+  }
+
+  /// Extract an expression from a (possibly unevaluated) constant to become
+  /// part of the expression tree of another unevaluated constant.
+  /// Makes sure a particular expression occurs only once in the tree by
+  /// cloning further instances.
+  Expression extract(Constant constant) {
+    Expression expression = constant.asExpression();
+    if (!replacementNodes.add(expression)) {
+      expression = cloner.clone(expression);
+      replacementNodes.add(expression);
+    }
+    return expression;
+  }
+
+  /// Enter a region of lazy evaluation. All leaf nodes are evaluated normally
+  /// (to ensure inlining of referenced local variables), but composite nodes
+  /// always treat their children as unevaluated, resulting in a partially
+  /// evaluated clone of the original expression tree.
+  /// Lazy evaluation is used for the subtrees of lazy operations with
+  /// unevaluated conditions to ensure no errors are reported for problems
+  /// in the subtree as long as the subtree is potentially constant.
+  void enterLazy() => lazyDepth++;
+
+  /// Leave a (possibly nested) region of lazy evaluation.
+  void leaveLazy() => lazyDepth--;
+
+  Constant lower(Constant original, Constant replacement) {
+    if (!identical(original, replacement)) {
+      original = canonicalize(original);
+      replacement = canonicalize(replacement);
+      lowered[replacement] = original;
+      return replacement;
+    }
+    return canonicalize(replacement);
+  }
+
+  Constant unlower(Constant constant) {
+    return lowered[constant] ?? constant;
+  }
+
+  Constant lowerListConstant(ListConstant constant) {
+    if (shouldBeUnevaluated) return constant;
+    return lower(constant, backend.lowerListConstant(constant));
+  }
+
+  Constant lowerSetConstant(SetConstant constant) {
+    if (shouldBeUnevaluated) return constant;
+    return lower(constant, backend.lowerSetConstant(constant));
+  }
+
+  Constant lowerMapConstant(MapConstant constant) {
+    if (shouldBeUnevaluated) return constant;
+    return lower(constant, backend.lowerMapConstant(constant));
+  }
+
+  /// Evaluate [node] and possibly cache the evaluation result.
+  /// @throws _AbortDueToError or _AbortDueToInvalidExpression if expression
+  /// can't be evaluated.
+  Constant _evaluateSubexpression(Expression node) {
+    if (node == null) return nullConstant;
+    bool wasUnevaluated = seenUnevaluatedChild;
+    seenUnevaluatedChild = false;
+    Constant result;
+    if (env.isEmpty) {
+      // We only try to evaluate the same [node] *once* within an empty
+      // environment.
+      if (nodeCache.containsKey(node)) {
+        result = nodeCache[node] ?? report(node, messageConstEvalCircularity);
+      } else {
+        nodeCache[node] = null;
+        try {
+          result = nodeCache[node] = node.accept(this);
+        } catch (e) {
+          nodeCache.remove(node);
+          rethrow;
+        }
+      }
+    } else {
+      result = node.accept(this);
+    }
+    seenUnevaluatedChild = wasUnevaluated || result is UnevaluatedConstant;
+    return result;
+  }
+
+  Constant runInsideContext(TreeNode node, Constant fun()) {
+    try {
+      pushContext(node);
+      return fun();
+    } finally {
+      popContext(node);
+    }
+  }
+
+  Constant runInsideContextIfNoContext(TreeNode node, Constant fun()) {
+    if (contextChain.isEmpty) {
+      return runInsideContext(node, fun);
+    } else {
+      return fun();
+    }
+  }
+
+  pushContext(TreeNode contextNode) {
+    contextChain.add(contextNode);
+  }
+
+  popContext(TreeNode contextNode) {
+    assert(contextChain.last == contextNode);
+    contextChain.length = contextChain.length - 1;
+  }
+
+  defaultTreeNode(Node node) {
+    // Only a subset of the expression language is valid for constant
+    // evaluation.
+    return reportInvalid(
+        node, 'Constant evaluation has no support for ${node.runtimeType}!');
+  }
+
+  visitNullLiteral(NullLiteral node) => nullConstant;
+
+  visitBoolLiteral(BoolLiteral node) {
+    return makeBoolConstant(node.value);
+  }
+
+  visitIntLiteral(IntLiteral node) {
+    // The frontend ensures that integer literals are valid according to the
+    // target representation.
+    return targetingJavaScript
+        ? canonicalize(new JavaScriptIntConstant.fromUInt64(node.value))
+        : canonicalize(new IntConstant(node.value));
+  }
+
+  visitDoubleLiteral(DoubleLiteral node) {
+    return canonicalize(makeDoubleConstant(node.value));
+  }
+
+  visitStringLiteral(StringLiteral node) {
+    return canonicalize(new StringConstant(node.value));
+  }
+
+  visitTypeLiteral(TypeLiteral node) {
+    final DartType type = evaluateDartType(node, node.type);
+    return canonicalize(new TypeLiteralConstant(type));
+  }
+
+  visitConstantExpression(ConstantExpression node) {
+    Constant constant = node.constant;
+    Constant result = constant;
+    if (constant is UnevaluatedConstant) {
+      result = runInsideContext(constant.expression, () {
+        return _evaluateSubexpression(constant.expression);
+      });
+    } else if (targetingJavaScript) {
+      if (constant is DoubleConstant) {
+        double value = constant.value;
+        // TODO(askesc, fishythefish): Handle infinite integers.
+        if (value.isFinite && value.truncateToDouble() == value) {
+          result = new JavaScriptIntConstant.fromDouble(value);
+        }
+      }
+    }
+    // If there were already constants in the AST then we make sure we
+    // re-canonicalize them.  After running the transformer we will therefore
+    // have a fully-canonicalized constant DAG with roots coming from the
+    // [ConstantExpression] nodes in the AST.
+    return canonicalize(result);
+  }
+
+  /// Add an element (which is possibly a spread or an if element) to a
+  /// constant list or set represented as a list of (possibly unevaluated)
+  /// lists or sets to be concatenated.
+  /// Each element of [parts] is either a `List<Constant>` (containing fully
+  /// evaluated constants) or a `Constant` (potentially unevaluated).
+  /// Pass an identity set as [seen] for sets and omit it for lists.
+  void addToListOrSetConstant(
+      List<Object> parts, Expression element, DartType elementType,
+      [Set<Constant> seen]) {
+    bool isSet = seen != null;
+    if (element is SpreadElement) {
+      Constant spread = unlower(_evaluateSubexpression(element.expression));
+      if (shouldBeUnevaluated) {
+        // Unevaluated spread
+        if (element.isNullAware) {
+          VariableDeclaration temp =
+              new VariableDeclaration(null, initializer: extract(spread));
+          parts.add(unevaluated(
+              element.expression,
+              new Let(
+                  temp,
+                  new ConditionalExpression(
+                      new MethodInvocation(new VariableGet(temp),
+                          new Name('=='), new Arguments([new NullLiteral()])),
+                      new ListLiteral([], isConst: true),
+                      new VariableGet(temp),
+                      const DynamicType()))));
+        } else {
+          parts.add(spread);
+        }
+      } else if (spread == nullConstant) {
+        // Null spread
+        if (!element.isNullAware) {
+          report(element.expression, messageConstEvalNullValue);
+        }
+      } else {
+        // Fully evaluated spread
+        List<Constant> entries;
+        if (spread is ListConstant) {
+          entries = spread.entries;
+        } else if (spread is SetConstant) {
+          entries = spread.entries;
+        } else {
+          // Not list or set in spread
+          return report(
+              element.expression, messageConstEvalNotListOrSetInSpread);
+        }
+        for (Constant entry in entries) {
+          addToListOrSetConstant(
+              parts, new ConstantExpression(entry), elementType, seen);
+        }
+      }
+    } else if (element is IfElement) {
+      Constant condition = _evaluateSubexpression(element.condition);
+      if (shouldBeUnevaluated) {
+        // Unevaluated if
+        enterLazy();
+        Constant then = _evaluateSubexpression(isSet
+            ? new SetLiteral([cloner.clone(element.then)], isConst: true)
+            : new ListLiteral([cloner.clone(element.then)], isConst: true));
+        Constant otherwise;
+        if (element.otherwise != null) {
+          otherwise = _evaluateSubexpression(isSet
+              ? new SetLiteral([cloner.clone(element.otherwise)], isConst: true)
+              : new ListLiteral([cloner.clone(element.otherwise)],
+                  isConst: true));
+        } else {
+          otherwise = isSet
+              ? new SetConstant(const DynamicType(), [])
+              : new ListConstant(const DynamicType(), []);
+        }
+        leaveLazy();
+        parts.add(unevaluated(
+            element.condition,
+            new ConditionalExpression(extract(condition), extract(then),
+                extract(otherwise), const DynamicType())));
+      } else {
+        // Fully evaluated if
+        if (condition == trueConstant) {
+          addToListOrSetConstant(parts, element.then, elementType, seen);
+        } else if (condition == falseConstant) {
+          if (element.otherwise != null) {
+            addToListOrSetConstant(parts, element.otherwise, elementType, seen);
+          }
+        } else if (condition == nullConstant) {
+          report(element.condition, messageConstEvalNullValue);
+        } else {
+          report(
+              element.condition,
+              templateConstEvalInvalidType.withArguments(
+                  condition,
+                  typeEnvironment.boolType,
+                  condition.getType(typeEnvironment)));
+        }
+      }
+    } else if (element is ForElement || element is ForInElement) {
+      // For or for-in
+      report(
+          element,
+          isSet
+              ? messageConstEvalIterationInConstSet
+              : messageConstEvalIterationInConstList);
+    } else {
+      // Ordinary expresion element
+      Constant constant = _evaluateSubexpression(element);
+      if (shouldBeUnevaluated) {
+        parts.add(unevaluated(
+            element,
+            isSet
+                ? new SetLiteral([extract(constant)],
+                    typeArgument: elementType, isConst: true)
+                : new ListLiteral([extract(constant)],
+                    typeArgument: elementType, isConst: true)));
+      } else {
+        List<Constant> listOrSet;
+        if (parts.last is List<Constant>) {
+          listOrSet = parts.last;
+        } else {
+          parts.add(listOrSet = <Constant>[]);
+        }
+        if (isSet) {
+          if (!hasPrimitiveEqual(constant)) {
+            report(
+                element,
+                templateConstEvalElementImplementsEqual
+                    .withArguments(constant));
+          }
+          if (!seen.add(constant)) {
+            report(element,
+                templateConstEvalDuplicateElement.withArguments(constant));
+          }
+        }
+        listOrSet.add(ensureIsSubtype(constant, elementType, element));
+      }
+    }
+  }
+
+  Constant makeListConstantFromParts(
+      List<Object> parts, Expression node, DartType elementType) {
+    if (parts.length == 1) {
+      // Fully evaluated
+      return lowerListConstant(new ListConstant(elementType, parts.single));
+    }
+    List<Expression> lists = <Expression>[];
+    for (Object part in parts) {
+      if (part is List<Constant>) {
+        lists.add(new ConstantExpression(new ListConstant(elementType, part)));
+      } else if (part is Constant) {
+        lists.add(extract(part));
+      } else {
+        throw 'Non-constant in constant list';
+      }
+    }
+    return unevaluated(
+        node, new ListConcatenation(lists, typeArgument: elementType));
+  }
+
+  visitListLiteral(ListLiteral node) {
+    if (!node.isConst) {
+      return report(
+          node, templateConstEvalNonConstantLiteral.withArguments('List'));
+    }
+    final List<Object> parts = <Object>[<Constant>[]];
+    for (Expression element in node.expressions) {
+      addToListOrSetConstant(parts, element, node.typeArgument);
+    }
+    return makeListConstantFromParts(parts, node, node.typeArgument);
+  }
+
+  visitListConcatenation(ListConcatenation node) {
+    final List<Object> parts = <Object>[<Constant>[]];
+    for (Expression list in node.lists) {
+      addToListOrSetConstant(parts,
+          new SpreadElement(cloner.clone(list), false), node.typeArgument);
+    }
+    return makeListConstantFromParts(parts, node, node.typeArgument);
+  }
+
+  Constant makeSetConstantFromParts(
+      List<Object> parts, Expression node, DartType elementType) {
+    if (parts.length == 1) {
+      // Fully evaluated
+      List<Constant> entries = parts.single;
+      SetConstant result = new SetConstant(elementType, entries);
+      if (desugarSets) {
+        final List<ConstantMapEntry> mapEntries =
+            new List<ConstantMapEntry>(entries.length);
+        for (int i = 0; i < entries.length; ++i) {
+          mapEntries[i] = new ConstantMapEntry(entries[i], nullConstant);
+        }
+        Constant map = lowerMapConstant(
+            new MapConstant(elementType, typeEnvironment.nullType, mapEntries));
+        return lower(
+            result,
+            new InstanceConstant(
+                unmodifiableSetMap.enclosingClass.reference,
+                [elementType],
+                <Reference, Constant>{unmodifiableSetMap.reference: map}));
+      } else {
+        return lowerSetConstant(result);
+      }
+    }
+    List<Expression> sets = <Expression>[];
+    for (Object part in parts) {
+      if (part is List<Constant>) {
+        sets.add(new ConstantExpression(new SetConstant(elementType, part)));
+      } else if (part is Constant) {
+        sets.add(extract(part));
+      } else {
+        throw 'Non-constant in constant set';
+      }
+    }
+    return unevaluated(
+        node, new SetConcatenation(sets, typeArgument: elementType));
+  }
+
+  visitSetLiteral(SetLiteral node) {
+    if (!node.isConst) {
+      return report(
+          node, templateConstEvalNonConstantLiteral.withArguments('Set'));
+    }
+    final Set<Constant> seen = new Set<Constant>.identity();
+    final List<Object> parts = <Object>[<Constant>[]];
+    for (Expression element in node.expressions) {
+      addToListOrSetConstant(parts, element, node.typeArgument, seen);
+    }
+    return makeSetConstantFromParts(parts, node, node.typeArgument);
+  }
+
+  visitSetConcatenation(SetConcatenation node) {
+    final Set<Constant> seen = new Set<Constant>.identity();
+    final List<Object> parts = <Object>[<Constant>[]];
+    for (Expression set_ in node.sets) {
+      addToListOrSetConstant(
+          parts,
+          new SpreadElement(cloner.clone(set_), false),
+          node.typeArgument,
+          seen);
+    }
+    return makeSetConstantFromParts(parts, node, node.typeArgument);
+  }
+
+  /// Add a map entry (which is possibly a spread or an if map entry) to a
+  /// constant map represented as a list of (possibly unevaluated)
+  /// maps to be concatenated.
+  /// Each element of [parts] is either a `List<ConstantMapEntry>` (containing
+  /// fully evaluated map entries) or a `Constant` (potentially unevaluated).
+  void addToMapConstant(List<Object> parts, MapEntry element, DartType keyType,
+      DartType valueType, Set<Constant> seenKeys) {
+    if (element is SpreadMapEntry) {
+      Constant spread = unlower(_evaluateSubexpression(element.expression));
+      if (shouldBeUnevaluated) {
+        // Unevaluated spread
+        if (element.isNullAware) {
+          VariableDeclaration temp =
+              new VariableDeclaration(null, initializer: extract(spread));
+          parts.add(unevaluated(
+              element.expression,
+              new Let(
+                  temp,
+                  new ConditionalExpression(
+                      new MethodInvocation(new VariableGet(temp),
+                          new Name('=='), new Arguments([new NullLiteral()])),
+                      new MapLiteral([], isConst: true),
+                      new VariableGet(temp),
+                      const DynamicType()))));
+        } else {
+          parts.add(spread);
+        }
+      } else if (spread == nullConstant) {
+        // Null spread
+        if (!element.isNullAware) {
+          report(element.expression, messageConstEvalNullValue);
+        }
+      } else {
+        // Fully evaluated spread
+        if (spread is MapConstant) {
+          for (ConstantMapEntry entry in spread.entries) {
+            addToMapConstant(
+                parts,
+                new MapEntry(new ConstantExpression(entry.key),
+                    new ConstantExpression(entry.value)),
+                keyType,
+                valueType,
+                seenKeys);
+          }
+        } else {
+          // Not map in spread
+          return report(element.expression, messageConstEvalNotMapInSpread);
+        }
+      }
+    } else if (element is IfMapEntry) {
+      Constant condition = _evaluateSubexpression(element.condition);
+      if (shouldBeUnevaluated) {
+        // Unevaluated if
+        enterLazy();
+        Constant then = _evaluateSubexpression(
+            new MapLiteral([cloner.clone(element.then)], isConst: true));
+        Constant otherwise;
+        if (element.otherwise != null) {
+          otherwise = _evaluateSubexpression(
+              new MapLiteral([cloner.clone(element.otherwise)], isConst: true));
+        } else {
+          otherwise =
+              new MapConstant(const DynamicType(), const DynamicType(), []);
+        }
+        leaveLazy();
+        parts.add(unevaluated(
+            element.condition,
+            new ConditionalExpression(extract(condition), extract(then),
+                extract(otherwise), const DynamicType())));
+      } else {
+        // Fully evaluated if
+        if (condition == trueConstant) {
+          addToMapConstant(parts, element.then, keyType, valueType, seenKeys);
+        } else if (condition == falseConstant) {
+          if (element.otherwise != null) {
+            addToMapConstant(
+                parts, element.otherwise, keyType, valueType, seenKeys);
+          }
+        } else if (condition == nullConstant) {
+          report(element.condition, messageConstEvalNullValue);
+        } else {
+          report(
+              element.condition,
+              templateConstEvalInvalidType.withArguments(
+                  condition,
+                  typeEnvironment.boolType,
+                  condition.getType(typeEnvironment)));
+        }
+      }
+    } else if (element is ForMapEntry || element is ForInMapEntry) {
+      // For or for-in
+      report(element, messageConstEvalIterationInConstMap);
+    } else {
+      // Ordinary map entry
+      Constant key = _evaluateSubexpression(element.key);
+      Constant value = _evaluateSubexpression(element.value);
+      if (shouldBeUnevaluated) {
+        parts.add(unevaluated(
+            element.key,
+            new MapLiteral([new MapEntry(extract(key), extract(value))],
+                isConst: true)));
+      } else {
+        List<ConstantMapEntry> entries;
+        if (parts.last is List<ConstantMapEntry>) {
+          entries = parts.last;
+        } else {
+          parts.add(entries = <ConstantMapEntry>[]);
+        }
+        if (!hasPrimitiveEqual(key)) {
+          report(
+              element, templateConstEvalKeyImplementsEqual.withArguments(key));
+        }
+        if (!seenKeys.add(key)) {
+          report(element.key, templateConstEvalDuplicateKey.withArguments(key));
+        }
+        entries.add(new ConstantMapEntry(
+            ensureIsSubtype(key, keyType, element.key),
+            ensureIsSubtype(value, valueType, element.value)));
+      }
+    }
+  }
+
+  Constant makeMapConstantFromParts(List<Object> parts, Expression node,
+      DartType keyType, DartType valueType) {
+    if (parts.length == 1) {
+      // Fully evaluated
+      return lowerMapConstant(
+          new MapConstant(keyType, valueType, parts.single));
+    }
+    List<Expression> maps = <Expression>[];
+    for (Object part in parts) {
+      if (part is List<ConstantMapEntry>) {
+        maps.add(
+            new ConstantExpression(new MapConstant(keyType, valueType, part)));
+      } else if (part is Constant) {
+        maps.add(extract(part));
+      } else {
+        throw 'Non-constant in constant map';
+      }
+    }
+    return unevaluated(node,
+        new MapConcatenation(maps, keyType: keyType, valueType: valueType));
+  }
+
+  visitMapLiteral(MapLiteral node) {
+    if (!node.isConst) {
+      return report(
+          node, templateConstEvalNonConstantLiteral.withArguments('Map'));
+    }
+    final Set<Constant> seen = new Set<Constant>.identity();
+    final List<Object> parts = <Object>[<ConstantMapEntry>[]];
+    for (MapEntry element in node.entries) {
+      addToMapConstant(parts, element, node.keyType, node.valueType, seen);
+    }
+    return makeMapConstantFromParts(parts, node, node.keyType, node.valueType);
+  }
+
+  visitMapConcatenation(MapConcatenation node) {
+    final Set<Constant> seen = new Set<Constant>.identity();
+    final List<Object> parts = <Object>[<ConstantMapEntry>[]];
+    for (Expression map in node.maps) {
+      addToMapConstant(parts, new SpreadMapEntry(cloner.clone(map), false),
+          node.keyType, node.valueType, seen);
+    }
+    return makeMapConstantFromParts(parts, node, node.keyType, node.valueType);
+  }
+
+  visitFunctionExpression(FunctionExpression node) {
+    return report(
+        node, templateConstEvalNonConstantLiteral.withArguments('Function'));
+  }
+
+  visitConstructorInvocation(ConstructorInvocation node) {
+    final Constructor constructor = node.target;
+    final Class klass = constructor.enclosingClass;
+    bool isSymbol = klass == coreTypes.internalSymbolClass;
+    if (!constructor.isConst) {
+      return reportInvalid(node, 'Non-const constructor invocation.');
+    }
+    if (constructor.function.body != null &&
+        constructor.function.body is! EmptyStatement) {
+      return reportInvalid(
+          node,
+          'Constructor "$node" has non-trivial body '
+          '"${constructor.function.body.runtimeType}".');
+    }
+    if (klass.isAbstract) {
+      return reportInvalid(
+          node, 'Constructor "$node" belongs to abstract class "${klass}".');
+    }
+
+    final positionals = evaluatePositionalArguments(node.arguments);
+    final named = evaluateNamedArguments(node.arguments);
+
+    // Is the constructor unavailable due to separate compilation?
+    bool isUnavailable = constructor.isInExternalLibrary &&
+        constructor.initializers.isEmpty &&
+        constructor.enclosingClass.supertype != null;
+
+    if (isUnavailable || (isSymbol && shouldBeUnevaluated)) {
+      return unevaluated(
+          node,
+          new ConstructorInvocation(constructor,
+              unevaluatedArguments(positionals, named, node.arguments.types),
+              isConst: true));
+    }
+
+    // Special case the dart:core's Symbol class here and convert it to a
+    // [SymbolConstant].  For invalid values we report a compile-time error.
+    if (isSymbol) {
+      final Constant nameValue = positionals.single;
+
+      if (nameValue is StringConstant && isValidSymbolName(nameValue.value)) {
+        return canonicalize(new SymbolConstant(nameValue.value, null));
+      }
+      return report(node.arguments.positional.first,
+          templateConstEvalInvalidSymbolName.withArguments(nameValue));
+    }
+
+    final typeArguments = evaluateTypeArguments(node, node.arguments);
+
+    // Fill in any missing type arguments with "dynamic".
+    for (int i = typeArguments.length; i < klass.typeParameters.length; i++) {
+      typeArguments.add(const DynamicType());
+    }
+
+    // Start building a new instance.
+    return withNewInstanceBuilder(klass, typeArguments, () {
+      return runInsideContextIfNoContext(node, () {
+        // "Run" the constructor (and any super constructor calls), which will
+        // initialize the fields of the new instance.
+        if (shouldBeUnevaluated) {
+          enterLazy();
+          handleConstructorInvocation(
+              constructor, typeArguments, positionals, named);
+          leaveLazy();
+          return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
+        }
+        handleConstructorInvocation(
+            constructor, typeArguments, positionals, named);
+        if (shouldBeUnevaluated) {
+          return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
+        }
+        return canonicalize(instanceBuilder.buildInstance());
+      });
+    });
+  }
+
+  visitInstanceCreation(InstanceCreation node) {
+    return withNewInstanceBuilder(node.classNode, node.typeArguments, () {
+      for (AssertStatement statement in node.asserts) {
+        checkAssert(statement);
+      }
+      node.fieldValues.forEach((Reference fieldRef, Expression value) {
+        instanceBuilder.setFieldValue(
+            fieldRef.asField, _evaluateSubexpression(value));
+      });
+      if (shouldBeUnevaluated) {
+        return unevaluated(node, instanceBuilder.buildUnevaluatedInstance());
+      }
+      return canonicalize(instanceBuilder.buildInstance());
+    });
+  }
+
+  bool isValidSymbolName(String name) {
+    // See https://api.dartlang.org/stable/2.0.0/dart-core/Symbol/Symbol.html:
+    //
+    //  A qualified name is a valid name preceded by a public identifier name and
+    //  a '.', e.g., foo.bar.baz= is a qualified version of baz=.
+    //
+    //  That means that the content of the name String must be either
+    //     - a valid public Dart identifier (that is, an identifier not
+    //       starting with "_"),
+    //     - such an identifier followed by "=" (a setter name),
+    //     - the name of a declarable operator,
+    //     - any of the above preceded by any number of qualifiers, where a
+    //       qualifier is a non-private identifier followed by '.',
+    //     - or the empty string (the default name of a library with no library
+    //       name declaration).
+
+    const operatorNames = const <String>[
+      '+',
+      '-',
+      '*',
+      '/',
+      '%',
+      '~/',
+      '&',
+      '|',
+      '^',
+      '~',
+      '<<',
+      '>>',
+      '<',
+      '<=',
+      '>',
+      '>=',
+      '==',
+      '[]',
+      '[]=',
+      'unary-'
+    ];
+
+    if (name == null) return false;
+    if (name == '') return true;
+
+    final parts = name.split('.');
+
+    // Each qualifier must be a public identifier.
+    for (int i = 0; i < parts.length - 1; ++i) {
+      if (!isValidPublicIdentifier(parts[i])) return false;
+    }
+
+    String last = parts.last;
+    if (operatorNames.contains(last)) {
+      return true;
+    }
+    if (last.endsWith('=')) {
+      last = last.substring(0, last.length - 1);
+    }
+    if (!isValidPublicIdentifier(last)) return false;
+
+    return true;
+  }
+
+  /// From the Dart Language specification:
+  ///
+  ///   IDENTIFIER:
+  ///     IDENTIFIER_START IDENTIFIER_PART*
+  ///
+  ///   IDENTIFIER_START:
+  ///       IDENTIFIER_START_NO_DOLLAR | ‘$’
+  ///
+  ///   IDENTIFIER_PART:
+  ///       IDENTIFIER_START | DIGIT
+  ///
+  ///   IDENTIFIER_NO_DOLLAR:
+  ///     IDENTIFIER_START_NO_DOLLAR IDENTIFIER_PART_NO_DOLLAR*
+  ///
+  ///   IDENTIFIER_START_NO_DOLLAR:
+  ///       LETTER | '_'
+  ///
+  ///   IDENTIFIER_PART_NO_DOLLAR:
+  ///       IDENTIFIER_START_NO_DOLLAR | DIGIT
+  ///
+  static final publicIdentifierRegExp =
+      new RegExp(r'^[a-zA-Z$][a-zA-Z0-9_$]*$');
+
+  static const nonUsableKeywords = const <String>[
+    'assert',
+    'break',
+    'case',
+    'catch',
+    'class',
+    'const',
+    'continue',
+    'default',
+    'do',
+    'else',
+    'enum',
+    'extends',
+    'false',
+    'final',
+    'finally',
+    'for',
+    'if',
+    'in',
+    'is',
+    'new',
+    'null',
+    'rethrow',
+    'return',
+    'super',
+    'switch',
+    'this',
+    'throw',
+    'true',
+    'try',
+    'var',
+    'while',
+    'with',
+  ];
+
+  bool isValidPublicIdentifier(String name) {
+    return publicIdentifierRegExp.hasMatch(name) &&
+        !nonUsableKeywords.contains(name);
+  }
+
+  handleConstructorInvocation(
+      Constructor constructor,
+      List<DartType> typeArguments,
+      List<Constant> positionalArguments,
+      Map<String, Constant> namedArguments) {
+    return runInsideContext(constructor, () {
+      return withNewEnvironment(() {
+        final Class klass = constructor.enclosingClass;
+        final FunctionNode function = constructor.function;
+
+        // We simulate now the constructor invocation.
+
+        // Step 1) Map type arguments and normal arguments from caller to callee.
+        for (int i = 0; i < klass.typeParameters.length; i++) {
+          env.addTypeParameterValue(klass.typeParameters[i], typeArguments[i]);
+        }
+        for (int i = 0; i < function.positionalParameters.length; i++) {
+          final VariableDeclaration parameter =
+              function.positionalParameters[i];
+          final Constant value = (i < positionalArguments.length)
+              ? positionalArguments[i]
+              : _evaluateSubexpression(parameter.initializer);
+          env.addVariableValue(parameter, value);
+        }
+        for (final VariableDeclaration parameter in function.namedParameters) {
+          final Constant value = namedArguments[parameter.name] ??
+              _evaluateSubexpression(parameter.initializer);
+          env.addVariableValue(parameter, value);
+        }
+
+        // Step 2) Run all initializers (including super calls) with environment setup.
+        for (final Field field in klass.fields) {
+          if (!field.isStatic) {
+            instanceBuilder.setFieldValue(
+                field, _evaluateSubexpression(field.initializer));
+          }
+        }
+        for (final Initializer init in constructor.initializers) {
+          if (init is FieldInitializer) {
+            instanceBuilder.setFieldValue(
+                init.field, _evaluateSubexpression(init.value));
+          } else if (init is LocalInitializer) {
+            final VariableDeclaration variable = init.variable;
+            env.addVariableValue(
+                variable, _evaluateSubexpression(variable.initializer));
+          } else if (init is SuperInitializer) {
+            handleConstructorInvocation(
+                init.target,
+                evaluateSuperTypeArguments(
+                    init, constructor.enclosingClass.supertype),
+                evaluatePositionalArguments(init.arguments),
+                evaluateNamedArguments(init.arguments));
+          } else if (init is RedirectingInitializer) {
+            // Since a redirecting constructor targets a constructor of the same
+            // class, we pass the same [typeArguments].
+            handleConstructorInvocation(
+                init.target,
+                typeArguments,
+                evaluatePositionalArguments(init.arguments),
+                evaluateNamedArguments(init.arguments));
+          } else if (init is AssertInitializer) {
+            checkAssert(init.statement);
+          } else {
+            return reportInvalid(
+                constructor,
+                'No support for handling initializer of type '
+                '"${init.runtimeType}".');
+          }
+        }
+      });
+    });
+  }
+
+  void checkAssert(AssertStatement statement) {
+    if (enableAsserts) {
+      final Constant condition = _evaluateSubexpression(statement.condition);
+
+      if (shouldBeUnevaluated) {
+        Expression message = null;
+        if (statement.message != null) {
+          enterLazy();
+          message = extract(_evaluateSubexpression(statement.message));
+          leaveLazy();
+        }
+        instanceBuilder.asserts.add(new AssertStatement(extract(condition),
+            message: message,
+            conditionStartOffset: statement.conditionStartOffset,
+            conditionEndOffset: statement.conditionEndOffset));
+      } else if (condition is BoolConstant) {
+        if (!condition.value) {
+          if (statement.message == null) {
+            report(statement.condition, messageConstEvalFailedAssertion);
+          }
+          final Constant message = _evaluateSubexpression(statement.message);
+          if (shouldBeUnevaluated) {
+            instanceBuilder.asserts.add(new AssertStatement(extract(condition),
+                message: extract(message),
+                conditionStartOffset: statement.conditionStartOffset,
+                conditionEndOffset: statement.conditionEndOffset));
+          } else if (message is StringConstant) {
+            report(
+                statement.condition,
+                templateConstEvalFailedAssertionWithMessage
+                    .withArguments(message.value));
+          } else {
+            report(
+                statement.message,
+                templateConstEvalInvalidType.withArguments(
+                    message,
+                    typeEnvironment.stringType,
+                    message.getType(typeEnvironment)));
+          }
+        }
+      } else {
+        report(
+            statement.condition,
+            templateConstEvalInvalidType.withArguments(condition,
+                typeEnvironment.boolType, condition.getType(typeEnvironment)));
+      }
+    }
+  }
+
+  visitInvalidExpression(InvalidExpression node) {
+    return reportInvalid(node, node.message);
+  }
+
+  visitMethodInvocation(MethodInvocation node) {
+    // We have no support for generic method invocation atm.
+    assert(node.arguments.named.isEmpty);
+
+    final Constant receiver = _evaluateSubexpression(node.receiver);
+    final List<Constant> arguments =
+        evaluatePositionalArguments(node.arguments);
+
+    if (shouldBeUnevaluated) {
+      return unevaluated(
+          node,
+          new MethodInvocation(extract(receiver), node.name,
+              unevaluatedArguments(arguments, {}, node.arguments.types)));
+    }
+
+    // Handle == and != first (it's common between all types). Since `a != b` is
+    // parsed as `!(a == b)` it is handled implicitly through ==.
+    if (arguments.length == 1 && node.name.name == '==') {
+      final right = arguments[0];
+
+      // [DoubleConstant] uses [identical] to determine equality, so we need two
+      // special cases:
+      // Two NaNs are always unequal even if [identical] returns `true`.
+      if (isNaN(receiver) || isNaN(right)) {
+        return falseConstant;
+      }
+
+      // Two zero values are always equal regardless of sign.
+      if (isZero(receiver)) {
+        return makeBoolConstant(isZero(right));
+      }
+
+      if (receiver is NullConstant ||
+          receiver is BoolConstant ||
+          receiver is IntConstant ||
+          receiver is DoubleConstant ||
+          receiver is StringConstant ||
+          right is NullConstant) {
+        return makeBoolConstant(receiver == right);
+      } else {
+        return report(
+            node,
+            templateConstEvalInvalidEqualsOperandType.withArguments(
+                receiver, receiver.getType(typeEnvironment)));
+      }
+    }
+
+    // This is a white-listed set of methods we need to support on constants.
+    if (receiver is StringConstant) {
+      if (arguments.length == 1) {
+        switch (node.name.name) {
+          case '+':
+            final Constant other = arguments[0];
+            if (other is StringConstant) {
+              return canonicalize(
+                  new StringConstant(receiver.value + other.value));
+            }
+            return report(
+                node,
+                templateConstEvalInvalidBinaryOperandType.withArguments(
+                    '+',
+                    receiver,
+                    typeEnvironment.stringType,
+                    other.getType(typeEnvironment)));
+        }
+      }
+    } else if (receiver is IntConstant || receiver is JavaScriptIntConstant) {
+      if (arguments.length == 0) {
+        switch (node.name.name) {
+          case 'unary-':
+            if (targetingJavaScript) {
+              BigInt value = (receiver as JavaScriptIntConstant).bigIntValue;
+              if (value == BigInt.zero) {
+                return canonicalize(new DoubleConstant(-0.0));
+              }
+              return canonicalize(new JavaScriptIntConstant.fromBigInt(-value));
+            }
+            int value = (receiver as IntConstant).value;
+            return canonicalize(new IntConstant(-value));
+          case '~':
+            if (targetingJavaScript) {
+              BigInt value = (receiver as JavaScriptIntConstant).bigIntValue;
+              return canonicalize(new JavaScriptIntConstant.fromBigInt(
+                  (~value).toUnsigned(32)));
+            }
+            int value = (receiver as IntConstant).value;
+            return canonicalize(new IntConstant(~value));
+        }
+      } else if (arguments.length == 1) {
+        final Constant other = arguments[0];
+        final op = node.name.name;
+        if (other is IntConstant || other is JavaScriptIntConstant) {
+          if ((op == '<<' || op == '>>' || op == '>>>')) {
+            var receiverValue = receiver is IntConstant
+                ? receiver.value
+                : (receiver as JavaScriptIntConstant).bigIntValue;
+            int otherValue = other is IntConstant
+                ? other.value
+                : (other as JavaScriptIntConstant).bigIntValue.toInt();
+            if (otherValue < 0) {
+              return report(
+                  node.arguments.positional.first,
+                  // TODO(askesc): Change argument types in template to constants.
+                  templateConstEvalNegativeShift.withArguments(
+                      op, '${receiverValue}', '${otherValue}'));
+            }
+          }
+
+          if ((op == '%' || op == '~/')) {
+            var receiverValue = receiver is IntConstant
+                ? receiver.value
+                : (receiver as JavaScriptIntConstant).bigIntValue;
+            int otherValue = other is IntConstant
+                ? other.value
+                : (other as JavaScriptIntConstant).bigIntValue.toInt();
+            if (otherValue == 0) {
+              return report(
+                  node.arguments.positional.first,
+                  // TODO(askesc): Change argument type in template to constant.
+                  templateConstEvalZeroDivisor.withArguments(
+                      op, '${receiverValue}'));
+            }
+          }
+
+          switch (op) {
+            case '|':
+            case '&':
+            case '^':
+              int receiverValue = receiver is IntConstant
+                  ? receiver.value
+                  : (receiver as JavaScriptIntConstant)
+                      .bigIntValue
+                      .toUnsigned(32)
+                      .toInt();
+              int otherValue = other is IntConstant
+                  ? other.value
+                  : (other as JavaScriptIntConstant)
+                      .bigIntValue
+                      .toUnsigned(32)
+                      .toInt();
+              return evaluateBinaryBitOperation(
+                  node.name.name, receiverValue, otherValue, node);
+            case '<<':
+            case '>>':
+            case '>>>':
+              bool negative = false;
+              int receiverValue;
+              if (receiver is IntConstant) {
+                receiverValue = receiver.value;
+              } else {
+                BigInt bigIntValue =
+                    (receiver as JavaScriptIntConstant).bigIntValue;
+                receiverValue = bigIntValue.toUnsigned(32).toInt();
+                negative = bigIntValue.isNegative;
+              }
+              int otherValue = other is IntConstant
+                  ? other.value
+                  : (other as JavaScriptIntConstant).bigIntValue.toInt();
+
+              return evaluateBinaryShiftOperation(
+                  node.name.name, receiverValue, otherValue, node,
+                  negativeReceiver: negative);
+            default:
+              num receiverValue = receiver is IntConstant
+                  ? receiver.value
+                  : (receiver as DoubleConstant).value;
+              num otherValue = other is IntConstant
+                  ? other.value
+                  : (other as DoubleConstant).value;
+              return evaluateBinaryNumericOperation(
+                  node.name.name, receiverValue, otherValue, node);
+          }
+        } else if (other is DoubleConstant) {
+          num receiverValue = receiver is IntConstant
+              ? receiver.value
+              : (receiver as DoubleConstant).value;
+          return evaluateBinaryNumericOperation(
+              node.name.name, receiverValue, other.value, node);
+        }
+        return report(
+            node,
+            templateConstEvalInvalidBinaryOperandType.withArguments(
+                node.name.name,
+                receiver,
+                typeEnvironment.numType,
+                other.getType(typeEnvironment)));
+      }
+    } else if (receiver is DoubleConstant) {
+      if (arguments.length == 0) {
+        switch (node.name.name) {
+          case 'unary-':
+            return canonicalize(makeDoubleConstant(-receiver.value));
+        }
+      } else if (arguments.length == 1) {
+        final Constant other = arguments[0];
+
+        if (other is IntConstant || other is DoubleConstant) {
+          final num value = (other is IntConstant)
+              ? other.value
+              : (other as DoubleConstant).value;
+          return evaluateBinaryNumericOperation(
+              node.name.name, receiver.value, value, node);
+        }
+        return report(
+            node,
+            templateConstEvalInvalidBinaryOperandType.withArguments(
+                node.name.name,
+                receiver,
+                typeEnvironment.numType,
+                other.getType(typeEnvironment)));
+      }
+    } else if (receiver is BoolConstant) {
+      if (arguments.length == 1) {
+        final Constant other = arguments[0];
+        if (other is BoolConstant) {
+          switch (node.name.name) {
+            case '|':
+              return canonicalize(
+                  new BoolConstant(receiver.value || other.value));
+            case '&':
+              return canonicalize(
+                  new BoolConstant(receiver.value && other.value));
+            case '^':
+              return canonicalize(
+                  new BoolConstant(receiver.value != other.value));
+          }
+        }
+      }
+    } else if (receiver is NullConstant) {
+      return report(node, messageConstEvalNullValue);
+    }
+
+    return report(
+        node,
+        templateConstEvalInvalidMethodInvocation.withArguments(
+            node.name.name, receiver));
+  }
+
+  visitLogicalExpression(LogicalExpression node) {
+    final Constant left = _evaluateSubexpression(node.left);
+    if (shouldBeUnevaluated) {
+      enterLazy();
+      Constant right = _evaluateSubexpression(node.right);
+      leaveLazy();
+      return unevaluated(node,
+          new LogicalExpression(extract(left), node.operator, extract(right)));
+    }
+    switch (node.operator) {
+      case '||':
+        if (left is BoolConstant) {
+          if (left.value) return trueConstant;
+
+          final Constant right = _evaluateSubexpression(node.right);
+          if (right is BoolConstant || right is UnevaluatedConstant) {
+            return right;
+          }
+
+          return report(
+              node,
+              templateConstEvalInvalidBinaryOperandType.withArguments(
+                  node.operator,
+                  left,
+                  typeEnvironment.boolType,
+                  right.getType(typeEnvironment)));
+        }
+        return report(
+            node,
+            templateConstEvalInvalidMethodInvocation.withArguments(
+                node.operator, left));
+      case '&&':
+        if (left is BoolConstant) {
+          if (!left.value) return falseConstant;
+
+          final Constant right = _evaluateSubexpression(node.right);
+          if (right is BoolConstant || right is UnevaluatedConstant) {
+            return right;
+          }
+
+          return report(
+              node,
+              templateConstEvalInvalidBinaryOperandType.withArguments(
+                  node.operator,
+                  left,
+                  typeEnvironment.boolType,
+                  right.getType(typeEnvironment)));
+        }
+        return report(
+            node,
+            templateConstEvalInvalidMethodInvocation.withArguments(
+                node.operator, left));
+      case '??':
+        return (left is! NullConstant)
+            ? left
+            : _evaluateSubexpression(node.right);
+      default:
+        return report(
+            node,
+            templateConstEvalInvalidMethodInvocation.withArguments(
+                node.operator, left));
+    }
+  }
+
+  visitConditionalExpression(ConditionalExpression node) {
+    final Constant condition = _evaluateSubexpression(node.condition);
+    if (condition == trueConstant) {
+      return _evaluateSubexpression(node.then);
+    } else if (condition == falseConstant) {
+      return _evaluateSubexpression(node.otherwise);
+    } else if (shouldBeUnevaluated) {
+      enterLazy();
+      Constant then = _evaluateSubexpression(node.then);
+      Constant otherwise = _evaluateSubexpression(node.otherwise);
+      leaveLazy();
+      return unevaluated(
+          node,
+          new ConditionalExpression(extract(condition), extract(then),
+              extract(otherwise), node.staticType));
+    } else {
+      return report(
+          node,
+          templateConstEvalInvalidType.withArguments(condition,
+              typeEnvironment.boolType, condition.getType(typeEnvironment)));
+    }
+  }
+
+  visitPropertyGet(PropertyGet node) {
+    if (node.receiver is ThisExpression) {
+      // Access "this" during instance creation.
+      if (instanceBuilder == null) {
+        return reportInvalid(node, 'Instance field access outside constructor');
+      }
+      for (final Field field in instanceBuilder.fields.keys) {
+        if (field.name == node.name) {
+          return instanceBuilder.fields[field];
+        }
+      }
+      return reportInvalid(node,
+          'Could not evaluate field get ${node.name} on incomplete instance');
+    }
+
+    final Constant receiver = _evaluateSubexpression(node.receiver);
+    if (receiver is StringConstant && node.name.name == 'length') {
+      if (targetingJavaScript) {
+        return canonicalize(new JavaScriptIntConstant(receiver.value.length));
+      }
+      return canonicalize(new IntConstant(receiver.value.length));
+    } else if (shouldBeUnevaluated) {
+      return unevaluated(node,
+          new PropertyGet(extract(receiver), node.name, node.interfaceTarget));
+    } else if (receiver is NullConstant) {
+      return report(node, messageConstEvalNullValue);
+    }
+    return report(
+        node,
+        templateConstEvalInvalidPropertyGet.withArguments(
+            node.name.name, receiver));
+  }
+
+  visitLet(Let node) {
+    env.addVariableValue(
+        node.variable, _evaluateSubexpression(node.variable.initializer));
+    return _evaluateSubexpression(node.body);
+  }
+
+  visitVariableGet(VariableGet node) {
+    // Not every variable which a [VariableGet] refers to must be marked as
+    // constant.  For example function parameters as well as constructs
+    // desugared to [Let] expressions are ok.
+    //
+    // TODO(kustermann): The heuristic of allowing all [VariableGet]s on [Let]
+    // variables might allow more than it should.
+    final VariableDeclaration variable = node.variable;
+    if (variable.parent is Let || _isFormalParameter(variable)) {
+      return env.lookupVariable(node.variable) ??
+          report(
+              node,
+              templateConstEvalNonConstantVariableGet
+                  .withArguments(variable.name));
+    }
+    if (variable.isConst) {
+      return _evaluateSubexpression(variable.initializer);
+    }
+    return reportInvalid(node, 'Variable get of a non-const variable.');
+  }
+
+  visitStaticGet(StaticGet node) {
+    return withNewEnvironment(() {
+      final Member target = node.target;
+      if (target is Field) {
+        if (target.isConst) {
+          if (target.isInExternalLibrary && target.initializer == null) {
+            // The variable is unavailable due to separate compilation.
+            return unevaluated(node, new StaticGet(target));
+          }
+          return runInsideContext(target, () {
+            return _evaluateSubexpression(target.initializer);
+          });
+        }
+        return report(
+            node,
+            templateConstEvalInvalidStaticInvocation
+                .withArguments(target.name.name));
+      } else if (target is Procedure) {
+        if (target.kind == ProcedureKind.Method) {
+          return canonicalize(new TearOffConstant(target));
+        }
+        return report(
+            node,
+            templateConstEvalInvalidStaticInvocation
+                .withArguments(target.name.name));
+      } else {
+        reportInvalid(
+            node, 'No support for ${target.runtimeType} in a static-get.');
+      }
+    });
+  }
+
+  visitStringConcatenation(StringConcatenation node) {
+    final List<Object> concatenated = <Object>[new StringBuffer()];
+    for (int i = 0; i < node.expressions.length; i++) {
+      Constant constant = _evaluateSubexpression(node.expressions[i]);
+      if (constant is PrimitiveConstant<Object>) {
+        String value = constant.toString();
+        Object last = concatenated.last;
+        if (last is StringBuffer) {
+          last.write(value);
+        } else {
+          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(
+            node,
+            templateConstEvalInvalidStringInterpolationOperand
+                .withArguments(constant));
+      }
+    }
+    if (concatenated.length > 1) {
+      final expressions = new List<Expression>(concatenated.length);
+      for (int i = 0; i < concatenated.length; i++) {
+        Object value = concatenated[i];
+        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));
+    }
+    return canonicalize(new StringConstant(concatenated.single.toString()));
+  }
+
+  visitStaticInvocation(StaticInvocation node) {
+    final Procedure target = node.target;
+    final Arguments arguments = node.arguments;
+    final positionals = evaluatePositionalArguments(arguments);
+    final named = evaluateNamedArguments(arguments);
+    if (shouldBeUnevaluated) {
+      return unevaluated(
+          node,
+          new StaticInvocation(
+              target, unevaluatedArguments(positionals, named, arguments.types),
+              isConst: true));
+    }
+    if (target.kind == ProcedureKind.Factory) {
+      if (target.isConst &&
+          target.name.name == "fromEnvironment" &&
+          target.enclosingLibrary == coreTypes.coreLibrary &&
+          positionals.length == 1) {
+        if (environmentDefines != null) {
+          // Evaluate environment constant.
+          Constant name = positionals.single;
+          if (name is StringConstant) {
+            String value = environmentDefines[name.value];
+            Constant defaultValue = named["defaultValue"];
+
+            if (target.enclosingClass == coreTypes.boolClass) {
+              Constant boolConstant = value == "true"
+                  ? trueConstant
+                  : value == "false"
+                      ? falseConstant
+                      : defaultValue is BoolConstant
+                          ? makeBoolConstant(defaultValue.value)
+                          : defaultValue is NullConstant
+                              ? nullConstant
+                              : falseConstant;
+              return boolConstant;
+            } else if (target.enclosingClass == coreTypes.intClass) {
+              int intValue = value != null ? int.tryParse(value) : null;
+              intValue ??= defaultValue is IntConstant
+                  ? defaultValue.value
+                  : defaultValue is JavaScriptIntConstant
+                      ? defaultValue.bigIntValue.toInt()
+                      : null;
+              if (intValue == null) return nullConstant;
+              if (targetingJavaScript) {
+                return canonicalize(new JavaScriptIntConstant(intValue));
+              }
+              return canonicalize(new IntConstant(intValue));
+            } else if (target.enclosingClass == coreTypes.stringClass) {
+              value ??=
+                  defaultValue is StringConstant ? defaultValue.value : null;
+              if (value == null) return nullConstant;
+              return canonicalize(new StringConstant(value));
+            }
+          } else if (name is NullConstant) {
+            return report(node, messageConstEvalNullValue);
+          }
+        } else {
+          // Leave environment constant unevaluated.
+          return unevaluated(
+              node,
+              new StaticInvocation(target,
+                  unevaluatedArguments(positionals, named, arguments.types),
+                  isConst: true));
+        }
+      }
+    } else if (target.name.name == 'identical') {
+      // Ensure the "identical()" function comes from dart:core.
+      final parent = target.parent;
+      if (parent is Library && parent == coreTypes.coreLibrary) {
+        final Constant left = positionals[0];
+        final Constant right = positionals[1];
+
+        if (targetingJavaScript) {
+          // In JavaScript, we lower [identical] to `===`, so any comparison
+          // against NaN yields `false`.
+          if (isNaN(left) || isNaN(right)) {
+            return falseConstant;
+          }
+
+          // In JavaScript, `-0.0 === 0.0`.
+          if (isZero(left)) {
+            return makeBoolConstant(isZero(right));
+          }
+        }
+
+        // Since we canonicalize constants during the evaluation, we can use
+        // identical here.
+        return makeBoolConstant(identical(left, right));
+      }
+    }
+
+    // TODO(kmillikin) For an invalid factory invocation we should adopt a
+    // better message.  This will show something like:
+    //
+    // "The invocation of 'List' is not allowed within a const context."
+    //
+    // Which is not quite right when the code was "new List()".
+    String name = target.name.name;
+    if (target is Procedure && target.isFactory) {
+      if (name.isEmpty) {
+        name = target.enclosingClass.name;
+      } else {
+        name = '${target.enclosingClass.name}.${name}';
+      }
+    }
+    return report(
+        node, templateConstEvalInvalidStaticInvocation.withArguments(name));
+  }
+
+  visitAsExpression(AsExpression node) {
+    final Constant constant = _evaluateSubexpression(node.operand);
+    if (shouldBeUnevaluated) {
+      return unevaluated(node,
+          new AsExpression(extract(constant), env.subsituteType(node.type)));
+    }
+    return ensureIsSubtype(constant, evaluateDartType(node, node.type), node);
+  }
+
+  visitIsExpression(IsExpression node) {
+    final Constant constant = node.operand.accept(this);
+    if (shouldBeUnevaluated) {
+      return unevaluated(node, new IsExpression(extract(constant), node.type));
+    }
+    if (constant is NullConstant) {
+      return makeBoolConstant(node.type == typeEnvironment.nullType ||
+          node.type == typeEnvironment.objectType ||
+          node.type is DynamicType);
+    }
+    return makeBoolConstant(
+        isSubtype(constant, evaluateDartType(node, node.type)));
+  }
+
+  visitNot(Not node) {
+    final Constant constant = _evaluateSubexpression(node.operand);
+    if (constant is BoolConstant) {
+      return makeBoolConstant(constant != trueConstant);
+    }
+    if (shouldBeUnevaluated) {
+      return unevaluated(node, new Not(extract(constant)));
+    }
+    return report(
+        node,
+        templateConstEvalInvalidType.withArguments(constant,
+            typeEnvironment.boolType, constant.getType(typeEnvironment)));
+  }
+
+  visitSymbolLiteral(SymbolLiteral node) {
+    final libraryReference =
+        node.value.startsWith('_') ? libraryOf(node).reference : null;
+    return canonicalize(new SymbolConstant(node.value, libraryReference));
+  }
+
+  visitInstantiation(Instantiation node) {
+    final Constant constant = _evaluateSubexpression(node.expression);
+    if (shouldBeUnevaluated) {
+      return unevaluated(
+          node,
+          new Instantiation(extract(constant),
+              node.typeArguments.map((t) => env.subsituteType(t)).toList()));
+    }
+    if (constant is TearOffConstant) {
+      if (node.typeArguments.length ==
+          constant.procedure.function.typeParameters.length) {
+        final typeArguments = evaluateDartTypes(node, node.typeArguments);
+        return canonicalize(
+            new PartialInstantiationConstant(constant, typeArguments));
+      }
+      return reportInvalid(
+          node,
+          'The number of type arguments supplied in the partial instantiation '
+          'does not match the number of type arguments of the $constant.');
+    }
+    // The inner expression in an instantiation can never be null, since
+    // instantiations are only inferred on direct references to declarations.
+    return reportInvalid(
+        node, 'Only tear-off constants can be partially instantiated.');
+  }
+
+  @override
+  visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
+    return report(
+        node, templateConstEvalDeferredLibrary.withArguments(node.import.name));
+  }
+
+  // Helper methods:
+
+  bool isZero(Constant value) =>
+      (value is IntConstant && value.value == 0) ||
+      (value is JavaScriptIntConstant && value.bigIntValue == BigInt.zero) ||
+      (value is DoubleConstant && value.value == 0);
+
+  bool isNaN(Constant value) => value is DoubleConstant && value.value.isNaN;
+
+  bool hasPrimitiveEqual(Constant constant) {
+    // TODO(askesc, fishythefish): Make sure the correct class is inferred
+    // when we clean up JavaScript int constant handling.
+    DartType type = constant.getType(typeEnvironment);
+    return !(type is InterfaceType && !classHasPrimitiveEqual(type.classNode));
+  }
+
+  bool classHasPrimitiveEqual(Class klass) {
+    bool cached = primitiveEqualCache[klass];
+    if (cached != null) return cached;
+    for (Procedure procedure in klass.procedures) {
+      if (procedure.kind == ProcedureKind.Operator &&
+          procedure.name.name == '==' &&
+          !procedure.isAbstract &&
+          !procedure.isForwardingStub) {
+        return primitiveEqualCache[klass] = false;
+      }
+    }
+    if (klass.supertype == null) return true; // To be on the safe side
+    return primitiveEqualCache[klass] =
+        classHasPrimitiveEqual(klass.supertype.classNode);
+  }
+
+  BoolConstant makeBoolConstant(bool value) =>
+      value ? trueConstant : falseConstant;
+
+  DoubleConstant makeDoubleConstant(double value) {
+    if (targetingJavaScript) {
+      // Convert to an integer when possible (matching the runtime behavior
+      // of `is int`).
+      if (value.isFinite && !identical(value, -0.0)) {
+        var i = value.toInt();
+        if (value == i.toDouble()) return new JavaScriptIntConstant(i);
+      }
+    }
+    return new DoubleConstant(value);
+  }
+
+  bool isSubtype(Constant constant, DartType type) {
+    DartType constantType = constant.getType(typeEnvironment);
+    if (targetingJavaScript) {
+      if (constantType == typeEnvironment.intType &&
+          type == typeEnvironment.doubleType) {
+        // With JS semantics, an integer is also a double.
+        return true;
+      }
+
+      if (constantType == typeEnvironment.doubleType &&
+          type == typeEnvironment.intType) {
+        double value = (constant as DoubleConstant).value;
+        if (value.isFinite && value == value.truncateToDouble()) {
+          return true;
+        }
+      }
+    }
+    return typeEnvironment.isSubtypeOf(constantType, type);
+  }
+
+  Constant ensureIsSubtype(Constant constant, DartType type, TreeNode node) {
+    if (!isSubtype(constant, type)) {
+      return report(
+          node,
+          templateConstEvalInvalidType.withArguments(
+              constant, type, constant.getType(typeEnvironment)));
+    }
+    return constant;
+  }
+
+  List<DartType> evaluateTypeArguments(TreeNode node, Arguments arguments) {
+    return evaluateDartTypes(node, arguments.types);
+  }
+
+  List<DartType> evaluateSuperTypeArguments(TreeNode node, Supertype type) {
+    return evaluateDartTypes(node, type.typeArguments);
+  }
+
+  List<DartType> evaluateDartTypes(TreeNode node, List<DartType> types) {
+    // TODO: Once the frontend gurantees that there are no free type variables
+    // left over after stubstitution, we can enable this shortcut again:
+    // if (env.isEmpty) return types;
+    return types.map((t) => evaluateDartType(node, t)).toList();
+  }
+
+  DartType evaluateDartType(TreeNode node, DartType type) {
+    final result = env.subsituteType(type);
+
+    if (!isInstantiated(result)) {
+      return report(
+          node, templateConstEvalFreeTypeParameter.withArguments(type));
+    }
+
+    return result;
+  }
+
+  List<Constant> evaluatePositionalArguments(Arguments arguments) {
+    return arguments.positional.map((Expression node) {
+      return _evaluateSubexpression(node);
+    }).toList();
+  }
+
+  Map<String, Constant> evaluateNamedArguments(Arguments arguments) {
+    if (arguments.named.isEmpty) return const <String, Constant>{};
+
+    final Map<String, Constant> named = {};
+    arguments.named.forEach((NamedExpression pair) {
+      named[pair.name] = _evaluateSubexpression(pair.value);
+    });
+    return named;
+  }
+
+  Arguments unevaluatedArguments(List<Constant> positionalArgs,
+      Map<String, Constant> namedArgs, List<DartType> types) {
+    final positional = new List<Expression>(positionalArgs.length);
+    final named = new List<NamedExpression>(namedArgs.length);
+    for (int i = 0; i < positionalArgs.length; ++i) {
+      positional[i] = extract(positionalArgs[i]);
+    }
+    int i = 0;
+    namedArgs.forEach((String name, Constant value) {
+      named[i++] = new NamedExpression(name, extract(value));
+    });
+    return new Arguments(positional, named: named, types: types);
+  }
+
+  Constant canonicalize(Constant constant) {
+    return canonicalizationCache.putIfAbsent(constant, () => constant);
+  }
+
+  withNewInstanceBuilder(Class klass, List<DartType> typeArguments, fn()) {
+    InstanceBuilder old = instanceBuilder;
+    try {
+      instanceBuilder = new InstanceBuilder(this, klass, typeArguments);
+      return fn();
+    } finally {
+      instanceBuilder = old;
+    }
+  }
+
+  withNewEnvironment(fn()) {
+    final EvaluationEnvironment oldEnv = env;
+    try {
+      env = new EvaluationEnvironment();
+      return fn();
+    } finally {
+      env = oldEnv;
+    }
+  }
+
+  Constant evaluateBinaryBitOperation(String op, int a, int b, TreeNode node) {
+    int result;
+    switch (op) {
+      case '|':
+        result = a | b;
+        break;
+      case '&':
+        result = a & b;
+        break;
+      case '^':
+        result = a ^ b;
+        break;
+    }
+
+    if (targetingJavaScript) {
+      return canonicalize(new JavaScriptIntConstant(result));
+    }
+    return canonicalize(new IntConstant(result));
+  }
+
+  Constant evaluateBinaryShiftOperation(String op, int a, int b, TreeNode node,
+      {negativeReceiver: false}) {
+    int result;
+    switch (op) {
+      case '<<':
+        result = a << b;
+        break;
+      case '>>':
+        if (targetingJavaScript) {
+          if (negativeReceiver) {
+            const signBit = 0x80000000;
+            a -= (a & signBit) << 1;
+          }
+          result = a >> b;
+        } else {
+          result = a >> b;
+        }
+        break;
+      case '>>>':
+        // TODO(fishythefish): Implement JS semantics for `>>>`.
+        result = b >= 64 ? 0 : (a >> b) & ((1 << (64 - b)) - 1);
+        break;
+    }
+
+    if (targetingJavaScript) {
+      return canonicalize(new JavaScriptIntConstant(result.toUnsigned(32)));
+    }
+    return canonicalize(new IntConstant(result));
+  }
+
+  Constant evaluateBinaryNumericOperation(
+      String op, num a, num b, TreeNode node) {
+    num result;
+    switch (op) {
+      case '+':
+        result = a + b;
+        break;
+      case '-':
+        result = a - b;
+        break;
+      case '*':
+        result = a * b;
+        break;
+      case '/':
+        result = a / b;
+        break;
+      case '~/':
+        result = a ~/ b;
+        break;
+      case '%':
+        result = a % b;
+        break;
+    }
+
+    if (result is int) {
+      if (targetingJavaScript) {
+        return canonicalize(new JavaScriptIntConstant(result));
+      }
+      return canonicalize(new IntConstant(result.toSigned(64)));
+    }
+    if (result is double) {
+      return canonicalize(makeDoubleConstant(result));
+    }
+
+    switch (op) {
+      case '<':
+        return makeBoolConstant(a < b);
+      case '<=':
+        return makeBoolConstant(a <= b);
+      case '>=':
+        return makeBoolConstant(a >= b);
+      case '>':
+        return makeBoolConstant(a > b);
+    }
+
+    return reportInvalid(node, "Unexpected binary numeric operation '$op'.");
+  }
+
+  Library libraryOf(TreeNode node) {
+    // The tree structure of the kernel AST ensures we always have an enclosing
+    // library.
+    while (true) {
+      if (node is Library) return node;
+      node = node.parent;
+    }
+  }
+}
+
+/// Holds the necessary information for a constant object, namely
+///   * the [klass] being instantiated
+///   * the [typeArguments] used for the instantiation
+///   * the [fields] the instance will obtain (all fields from the
+///     instantiated [klass] up to the [Object] klass).
+class InstanceBuilder {
+  ConstantEvaluator evaluator;
+
+  /// The class of the new instance.
+  final Class klass;
+
+  /// The values of the type parameters of the new instance.
+  final List<DartType> typeArguments;
+
+  /// The field values of the new instance.
+  final Map<Field, Constant> fields = <Field, Constant>{};
+
+  final List<AssertStatement> asserts = <AssertStatement>[];
+
+  InstanceBuilder(this.evaluator, this.klass, this.typeArguments);
+
+  void setFieldValue(Field field, Constant constant) {
+    fields[field] = constant;
+  }
+
+  InstanceConstant buildInstance() {
+    assert(asserts.isEmpty);
+    final Map<Reference, Constant> fieldValues = <Reference, Constant>{};
+    fields.forEach((Field field, Constant value) {
+      assert(value is! UnevaluatedConstant);
+      fieldValues[field.reference] = value;
+    });
+    return new InstanceConstant(klass.reference, typeArguments, fieldValues);
+  }
+
+  InstanceCreation buildUnevaluatedInstance() {
+    final Map<Reference, Expression> fieldValues = <Reference, Expression>{};
+    fields.forEach((Field field, Constant value) {
+      fieldValues[field.reference] = evaluator.extract(value);
+    });
+    return new InstanceCreation(
+        klass.reference, typeArguments, fieldValues, asserts);
+  }
+}
+
+/// Holds an environment of type parameters, parameters and variables.
+class EvaluationEnvironment {
+  /// The values of the type parameters in scope.
+  final Map<TypeParameter, DartType> _typeVariables =
+      <TypeParameter, DartType>{};
+
+  /// The values of the parameters/variables in scope.
+  final Map<VariableDeclaration, Constant> _variables =
+      <VariableDeclaration, Constant>{};
+
+  /// Whether the current environment is empty.
+  bool get isEmpty => _typeVariables.isEmpty && _variables.isEmpty;
+
+  void addTypeParameterValue(TypeParameter parameter, DartType value) {
+    assert(!_typeVariables.containsKey(parameter));
+    _typeVariables[parameter] = value;
+  }
+
+  void addVariableValue(VariableDeclaration variable, Constant value) {
+    _variables[variable] = value;
+  }
+
+  DartType lookupParameterValue(TypeParameter parameter) {
+    final DartType value = _typeVariables[parameter];
+    assert(value != null);
+    return value;
+  }
+
+  Constant lookupVariable(VariableDeclaration variable) {
+    return _variables[variable];
+  }
+
+  DartType subsituteType(DartType type) {
+    if (_typeVariables.isEmpty) return type;
+    return substitute(type, _typeVariables);
+  }
+}
+
+// Used as control-flow to abort the current evaluation.
+class _AbortDueToError {
+  final TreeNode node;
+  final Message message;
+  final List<LocatedMessage> context;
+
+  _AbortDueToError(this.node, this.message, {this.context});
+}
+
+class _AbortDueToInvalidExpression {
+  final TreeNode node;
+  final String message;
+
+  _AbortDueToInvalidExpression(this.node, this.message);
+}
+
+abstract class ErrorReporter {
+  const ErrorReporter();
+
+  void report(LocatedMessage message, List<LocatedMessage> context);
+
+  void reportInvalidExpression(InvalidExpression node);
+}
+
+class SimpleErrorReporter implements ErrorReporter {
+  const SimpleErrorReporter();
+
+  @override
+  void report(LocatedMessage message, List<LocatedMessage> context) {
+    _report(message);
+    for (LocatedMessage contextMessage in context) {
+      _report(contextMessage);
+    }
+  }
+
+  @override
+  void reportInvalidExpression(InvalidExpression node) {
+    // Ignored
+  }
+
+  void _report(LocatedMessage message) {
+    reportMessage(message.uri, message.charOffset, message.message);
+  }
+
+  void reportMessage(Uri uri, int offset, String message) {
+    io.exitCode = 42;
+    io.stderr.writeln('$uri:$offset Constant evaluation error: $message');
+  }
+}
+
+class IsInstantiatedVisitor extends DartTypeVisitor<bool> {
+  final _availableVariables = new Set<TypeParameter>();
+
+  bool isInstantiated(DartType type) {
+    return type.accept(this);
+  }
+
+  bool defaultDartType(DartType node) {
+    throw 'A visitor method seems to be unimplemented!';
+  }
+
+  bool visitInvalidType(InvalidType node) => true;
+  bool visitDynamicType(DynamicType node) => true;
+  bool visitVoidType(VoidType node) => true;
+  bool visitBottomType(BottomType node) => true;
+
+  bool visitTypeParameterType(TypeParameterType node) {
+    return _availableVariables.contains(node.parameter);
+  }
+
+  bool visitInterfaceType(InterfaceType node) {
+    return node.typeArguments
+        .every((DartType typeArgument) => typeArgument.accept(this));
+  }
+
+  bool visitFunctionType(FunctionType node) {
+    final parameters = node.typeParameters;
+    _availableVariables.addAll(parameters);
+    final bool result = node.returnType.accept(this) &&
+        node.positionalParameters.every((p) => p.accept(this)) &&
+        node.namedParameters.every((p) => p.type.accept(this));
+    _availableVariables.removeAll(parameters);
+    return result;
+  }
+
+  bool visitTypedefType(TypedefType node) {
+    return node.unalias.accept(this);
+  }
+}
+
+bool _isFormalParameter(VariableDeclaration variable) {
+  final parent = variable.parent;
+  if (parent is FunctionNode) {
+    return parent.positionalParameters.contains(variable) ||
+        parent.namedParameters.contains(variable);
+  }
+  return false;
+}
diff --git a/front_end/lib/src/fasta/kernel/expression_generator.dart b/front_end/lib/src/fasta/kernel/expression_generator.dart
index 1434f9f..db33cf1 100644
--- a/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -40,7 +40,8 @@
         mustacheName,
         percentName,
         plusName,
-        rightShiftName;
+        rightShiftName,
+        tripleShiftName;
 
 import '../parser.dart' show lengthForToken, lengthOfSpan, offsetForToken;
 
@@ -956,6 +957,9 @@
     } else if (identical(">>=", assignmentOperator)) {
       return generator.buildCompoundAssignment(rightShiftName, value,
           offset: offsetForToken(token), voidContext: voidContext);
+    } else if (identical(">>>=", assignmentOperator)) {
+      return generator.buildCompoundAssignment(tripleShiftName, value,
+          offset: offsetForToken(token), voidContext: voidContext);
     } else if (identical("??=", assignmentOperator)) {
       return generator.buildNullAwareAssignment(
           value, const DynamicType(), offsetForToken(token),
diff --git a/front_end/lib/src/fasta/kernel/fangorn.dart b/front_end/lib/src/fasta/kernel/fangorn.dart
index 005376d..1616ce7 100644
--- a/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -53,7 +53,15 @@
 
 import 'body_builder.dart' show LabelTarget;
 
-import 'collections.dart' show IfElement, IfMapEntry, SpreadElement;
+import 'collections.dart'
+    show
+        ForElement,
+        ForInElement,
+        ForInMapEntry,
+        ForMapEntry,
+        IfElement,
+        IfMapEntry,
+        SpreadElement;
 
 import 'kernel_expression_generator.dart'
     show
@@ -297,6 +305,46 @@
   }
 
   @override
+  Expression forElement(
+      List<VariableDeclaration> variables,
+      Expression condition,
+      List<Expression> updates,
+      Expression body,
+      Token token) {
+    return new ForElement(variables, condition, updates, body)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  MapEntry forMapEntry(
+      List<VariableDeclaration> variables,
+      Expression condition,
+      List<Expression> updates,
+      MapEntry body,
+      Token token) {
+    return new ForMapEntry(variables, condition, updates, body)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  Expression forInElement(VariableDeclaration variable, Expression iterable,
+      Statement prologue, Expression body, Expression problem, Token token,
+      {bool isAsync: false}) {
+    return new ForInElement(variable, iterable, prologue, body, problem,
+        isAsync: isAsync)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  MapEntry forInMapEntry(VariableDeclaration variable, Expression iterable,
+      Statement prologue, MapEntry body, Expression problem, Token token,
+      {bool isAsync: false}) {
+    return new ForInMapEntry(variable, iterable, prologue, body, problem,
+        isAsync: isAsync)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
   AssertInitializer assertInitializer(
       Token assertKeyword,
       Token leftParenthesis,
diff --git a/front_end/lib/src/fasta/kernel/forest.dart b/front_end/lib/src/fasta/kernel/forest.dart
index 8cf916f..818a3b1 100644
--- a/front_end/lib/src/fasta/kernel/forest.dart
+++ b/front_end/lib/src/fasta/kernel/forest.dart
@@ -196,6 +196,28 @@
   MapEntry ifMapEntry(
       Expression condition, MapEntry then, MapEntry otherwise, Token token);
 
+  Expression forElement(
+      List<VariableDeclaration> variables,
+      Expression condition,
+      List<Expression> updates,
+      Expression body,
+      Token token);
+
+  MapEntry forMapEntry(
+      List<VariableDeclaration> variables,
+      Expression condition,
+      List<Expression> updates,
+      MapEntry body,
+      Token token);
+
+  Expression forInElement(VariableDeclaration variable, Expression iterable,
+      Statement prologue, Expression body, Expression problem, Token token,
+      {bool isAsync: false});
+
+  MapEntry forInMapEntry(VariableDeclaration variable, Expression iterable,
+      Statement prologue, MapEntry body, Expression problem, Token token,
+      {bool isAsync: false});
+
   /// Return a representation of an assert that appears in a constructor's
   /// initializer list.
   Object assertInitializer(Token assertKeyword, Token leftParenthesis,
diff --git a/front_end/lib/src/fasta/kernel/inference_visitor.dart b/front_end/lib/src/fasta/kernel/inference_visitor.dart
index a678e10..830e13a 100644
--- a/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -7,14 +7,24 @@
 class InferenceVisitor extends BodyVisitor1<void, DartType> {
   final ShadowTypeInferrer inferrer;
 
+  Class mapEntryClass;
+
+  // Stores the offset of the map entry found by inferMapEntry.
+  int mapEntryOffset = null;
+
+  // Stores the offset of the map spread found by inferMapEntry.
+  int mapSpreadOffset = null;
+
+  // Stores the offset of the iterable spread found by inferMapEntry.
+  int iterableSpreadOffset = null;
+
+  // Stores the type of the iterable spread found by inferMapEntry.
+  DartType iterableSpreadType = null;
+
   InferenceVisitor(this.inferrer);
 
   @override
   void defaultExpression(Expression node, DartType typeContext) {
-    if (node is IfElement) {
-      visitIfElement(node, typeContext);
-      return;
-    }
     unhandled("${node.runtimeType}", "InferenceVisitor", node.fileOffset,
         inferrer.helper.uri);
   }
@@ -25,11 +35,6 @@
         inferrer.helper.uri);
   }
 
-  visitIfElement(IfElement node, DartType typeContext) {
-    node.parent.replaceChild(node,
-        new InvalidExpression('unhandled if element in collection literal'));
-  }
-
   @override
   void visitInvalidExpression(InvalidExpression node, DartType typeContext) {}
 
@@ -148,10 +153,10 @@
           name.length,
           node.target.fileUri);
       for (var declaration in node.target.function.positionalParameters) {
-        declaration.type ??= const DynamicType();
+        declaration.type ??= const InvalidType();
       }
       for (var declaration in node.target.function.namedParameters) {
-        declaration.type ??= const DynamicType();
+        declaration.type ??= const InvalidType();
       }
     } else if ((library = inferrer.engine.toBeInferred[node.target]) != null) {
       inferrer.engine.toBeInferred.remove(node.target);
@@ -253,11 +258,12 @@
         node.field.type, initializerType, node.value, node.fileOffset);
   }
 
-  void handleForInStatementDeclaringVariable(ForInStatement node) {
+  void handleForInDeclaringVariable(
+      VariableDeclaration variable, Expression iterable, Statement body,
+      {bool isAsync: false}) {
     DartType elementType;
     bool typeNeeded = false;
     bool typeChecksNeeded = !inferrer.isTopLevel;
-    final VariableDeclaration variable = node.variable;
     if (VariableDeclarationJudgment.isImplicitlyTyped(variable)) {
       typeNeeded = true;
       elementType = const UnknownType();
@@ -265,45 +271,58 @@
       elementType = variable.type;
     }
 
-    DartType inferredType =
-        inferForInIterable(node, elementType, typeNeeded || typeChecksNeeded);
+    DartType inferredType = inferForInIterable(
+        iterable, elementType, typeNeeded || typeChecksNeeded,
+        isAsync: isAsync);
     if (typeNeeded) {
       inferrer.instrumentation?.record(inferrer.uri, variable.fileOffset,
           'type', new InstrumentationValueForType(inferredType));
       variable.type = inferredType;
     }
 
-    inferrer.inferStatement(node.body);
+    if (body != null) inferrer.inferStatement(body);
 
     VariableDeclaration tempVar =
         new VariableDeclaration(null, type: inferredType, isFinal: true);
     VariableGet variableGet = new VariableGet(tempVar)
       ..fileOffset = variable.fileOffset;
+    TreeNode parent = variable.parent;
     Expression implicitDowncast = inferrer.ensureAssignable(
-        variable.type, inferredType, variableGet, node.fileOffset,
+        variable.type, inferredType, variableGet, parent.fileOffset,
         template: templateForInLoopElementTypeNotAssignable);
     if (implicitDowncast != null) {
-      node.variable = tempVar..parent = node;
+      parent.replaceChild(variable, tempVar);
       variable.initializer = implicitDowncast..parent = variable;
-      node.body = combineStatements(variable, node.body)..parent = node;
+      if (body == null) {
+        if (parent is ForInElement) {
+          parent.prologue = variable;
+        } else if (parent is ForInMapEntry) {
+          parent.prologue = variable;
+        } else {
+          unhandled("${parent.runtimeType}", "handleForInDeclaringVariable",
+              variable.fileOffset, variable.location.file);
+        }
+      } else {
+        parent.replaceChild(body, combineStatements(variable, body));
+      }
     }
   }
 
   DartType inferForInIterable(
-      ForInStatement node, DartType elementType, bool typeNeeded) {
-    Class iterableClass = node.isAsync
+      Expression iterable, DartType elementType, bool typeNeeded,
+      {bool isAsync: false}) {
+    Class iterableClass = isAsync
         ? inferrer.coreTypes.streamClass
         : inferrer.coreTypes.iterableClass;
     DartType context = inferrer.wrapType(elementType, iterableClass);
-    Expression iterable = node.iterable;
     inferrer.inferExpression(iterable, context, typeNeeded);
     DartType inferredExpressionType =
         inferrer.resolveTypeParameter(getInferredType(iterable, inferrer));
     inferrer.ensureAssignable(
         inferrer.wrapType(const DynamicType(), iterableClass),
         inferredExpressionType,
-        node.iterable,
-        node.iterable.fileOffset,
+        iterable,
+        iterable.fileOffset,
         template: templateForInLoopTypeNotIterable);
     DartType inferredType;
     if (typeNeeded) {
@@ -319,15 +338,17 @@
     return inferredType;
   }
 
-  void handleForInStatementWithoutVariable(ForInStatement node) {
+  void handleForInWithoutVariable(
+      VariableDeclaration variable, Expression iterable, Statement body,
+      {bool isAsync: false}) {
     DartType elementType;
     bool typeChecksNeeded = !inferrer.isTopLevel;
     DartType syntheticWriteType;
     Expression syntheticAssignment;
-    Block block = node.body;
-    ExpressionStatement statement = block.statements[0];
-    SyntheticExpressionJudgment judgment = statement.expression;
     Expression rhs;
+    ExpressionStatement statement =
+        body is Block ? body.statements.first : body;
+    SyntheticExpressionJudgment judgment = statement.expression;
     syntheticAssignment = judgment.desugared;
     if (syntheticAssignment is VariableSet) {
       syntheticWriteType = elementType = syntheticAssignment.variable.type;
@@ -357,18 +378,19 @@
           inferrer.helper.uri);
     }
 
-    DartType inferredType =
-        inferForInIterable(node, elementType, typeChecksNeeded);
+    DartType inferredType = inferForInIterable(
+        iterable, elementType, typeChecksNeeded,
+        isAsync: isAsync);
     if (typeChecksNeeded) {
-      node.variable.type = inferredType;
+      variable.type = inferredType;
     }
 
-    inferrer.inferStatement(node.body);
+    inferrer.inferStatement(body);
 
     if (syntheticWriteType != null) {
       inferrer.ensureAssignable(
           greatestClosure(inferrer.coreTypes, syntheticWriteType),
-          node.variable.type,
+          variable.type,
           rhs,
           rhs.fileOffset,
           template: templateForInLoopElementTypeNotAssignable,
@@ -379,9 +401,11 @@
   @override
   void visitForInStatement(ForInStatement node, _) {
     if (node.variable.name == null) {
-      handleForInStatementWithoutVariable(node);
+      handleForInWithoutVariable(node.variable, node.iterable, node.body,
+          isAsync: node.isAsync);
     } else {
-      handleForInStatementDeclaringVariable(node);
+      handleForInDeclaringVariable(node.variable, node.iterable, node.body,
+          isAsync: node.isAsync);
     }
   }
 
@@ -665,6 +689,170 @@
     return null;
   }
 
+  DartType inferElement(
+      Expression element,
+      TreeNode parent,
+      DartType inferredTypeArgument,
+      Map<TreeNode, DartType> inferredSpreadTypes,
+      bool inferenceNeeded,
+      bool typeChecksNeeded) {
+    if (element is SpreadElement) {
+      DartType spreadType = inferrer.inferExpression(
+          element.expression,
+          new InterfaceType(inferrer.coreTypes.iterableClass,
+              <DartType>[inferredTypeArgument]),
+          inferenceNeeded || typeChecksNeeded,
+          isVoidAllowed: true);
+      inferredSpreadTypes[element.expression] = spreadType;
+      if (typeChecksNeeded) {
+        DartType spreadElementType =
+            getSpreadElementType(spreadType, element.isNullAware);
+        if (spreadElementType == null) {
+          if (spreadType is InterfaceType &&
+              spreadType.classNode == inferrer.coreTypes.nullClass &&
+              !element.isNullAware) {
+            parent.replaceChild(
+                element,
+                inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                    .buildProblem(messageNonNullAwareSpreadIsNull,
+                        element.expression.fileOffset, 1)));
+          } else {
+            parent.replaceChild(
+                element,
+                inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                    .buildProblem(
+                        templateSpreadTypeMismatch.withArguments(spreadType),
+                        element.expression.fileOffset,
+                        1)));
+          }
+        } else if (spreadType is InterfaceType) {
+          if (!inferrer.isAssignable(inferredTypeArgument, spreadElementType)) {
+            parent.replaceChild(
+                element,
+                inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                    .buildProblem(
+                        templateSpreadElementTypeMismatch.withArguments(
+                            spreadElementType, inferredTypeArgument),
+                        element.expression.fileOffset,
+                        1)));
+          }
+        }
+      }
+      // Use 'dynamic' for error recovery.
+      return element.elementType =
+          getSpreadElementType(spreadType, element.isNullAware) ??
+              const DynamicType();
+    } else if (element is IfElement) {
+      DartType boolType = inferrer.coreTypes.boolClass.rawType;
+      DartType conditionType = inferrer.inferExpression(
+          element.condition, boolType, typeChecksNeeded,
+          isVoidAllowed: false);
+      inferrer.ensureAssignable(boolType, conditionType, element.condition,
+          element.condition.fileOffset);
+      DartType thenType = inferElement(
+          element.then,
+          element,
+          inferredTypeArgument,
+          inferredSpreadTypes,
+          inferenceNeeded,
+          typeChecksNeeded);
+      DartType otherwiseType;
+      if (element.otherwise != null) {
+        otherwiseType = inferElement(
+            element.otherwise,
+            element,
+            inferredTypeArgument,
+            inferredSpreadTypes,
+            inferenceNeeded,
+            typeChecksNeeded);
+      }
+      return otherwiseType == null
+          ? thenType
+          : inferrer.typeSchemaEnvironment
+              .getStandardUpperBound(thenType, otherwiseType);
+    } else if (element is ForElement) {
+      for (VariableDeclaration declaration in element.variables) {
+        if (declaration.name == null) {
+          if (declaration.initializer != null) {
+            declaration.type = inferrer.inferExpression(declaration.initializer,
+                declaration.type, inferenceNeeded || typeChecksNeeded,
+                isVoidAllowed: true);
+          }
+        } else {
+          inferrer.inferStatement(declaration);
+        }
+      }
+      if (element.condition != null) {
+        inferrer.inferExpression(
+            element.condition,
+            inferrer.coreTypes.boolClass.rawType,
+            inferenceNeeded || typeChecksNeeded,
+            isVoidAllowed: false);
+      }
+      for (Expression expression in element.updates) {
+        inferrer.inferExpression(expression, const UnknownType(),
+            inferenceNeeded || typeChecksNeeded,
+            isVoidAllowed: true);
+      }
+      return inferElement(element.body, element, inferredTypeArgument,
+          inferredSpreadTypes, inferenceNeeded, typeChecksNeeded);
+    } else if (element is ForInElement) {
+      if (element.variable.name == null) {
+        handleForInWithoutVariable(
+            element.variable, element.iterable, element.prologue,
+            isAsync: element.isAsync);
+      } else {
+        handleForInDeclaringVariable(
+            element.variable, element.iterable, element.prologue,
+            isAsync: element.isAsync);
+      }
+      if (element.problem != null) {
+        inferrer.inferExpression(element.problem, const UnknownType(),
+            inferenceNeeded || typeChecksNeeded,
+            isVoidAllowed: true);
+      }
+      return inferElement(element.body, element, inferredTypeArgument,
+          inferredSpreadTypes, inferenceNeeded, typeChecksNeeded);
+    } else {
+      DartType inferredType = inferrer.inferExpression(
+          element, inferredTypeArgument, inferenceNeeded || typeChecksNeeded,
+          isVoidAllowed: true);
+      if (inferredTypeArgument is! UnknownType) {
+        inferrer.ensureAssignable(
+            inferredTypeArgument, inferredType, element, element.fileOffset,
+            isVoidAllowed: inferredTypeArgument is VoidType);
+      }
+      return inferredType;
+    }
+  }
+
+  void checkElement(Expression item, Expression parent, DartType typeArgument,
+      Map<TreeNode, DartType> inferredSpreadTypes) {
+    if (item is SpreadElement) {
+      DartType spreadType = inferredSpreadTypes[item.expression];
+      if (spreadType is DynamicType) {
+        inferrer.ensureAssignable(inferrer.coreTypes.iterableClass.rawType,
+            spreadType, item.expression, item.expression.fileOffset);
+      }
+    } else if (item is IfElement) {
+      checkElement(item.then, item, typeArgument, inferredSpreadTypes);
+      if (item.otherwise != null) {
+        checkElement(item.otherwise, item, typeArgument, inferredSpreadTypes);
+      }
+    } else if (item is ForElement) {
+      if (item.condition != null) {
+        DartType conditionType = getInferredType(item.condition, inferrer);
+        inferrer.ensureAssignable(inferrer.coreTypes.boolClass.rawType,
+            conditionType, item.condition, item.condition.fileOffset);
+      }
+      checkElement(item.body, item, typeArgument, inferredSpreadTypes);
+    } else if (item is ForInElement) {
+      checkElement(item.body, item, typeArgument, inferredSpreadTypes);
+    } else {
+      // Do nothing.  Assignability checks are done during type inference.
+    }
+  }
+
   void visitListLiteralJudgment(
       ListLiteralJudgment node, DartType typeContext) {
     var listClass = inferrer.coreTypes.listClass;
@@ -675,9 +863,11 @@
     List<DartType> actualTypes;
     bool inferenceNeeded = node.typeArgument is ImplicitTypeArgument;
     bool typeChecksNeeded = !inferrer.isTopLevel;
+    Map<TreeNode, DartType> inferredSpreadTypes;
     if (inferenceNeeded || typeChecksNeeded) {
       formalTypes = [];
       actualTypes = [];
+      inferredSpreadTypes = new Map<TreeNode, DartType>.identity();
     }
     if (inferenceNeeded) {
       inferredTypes = [const UnknownType()];
@@ -688,36 +878,18 @@
     } else {
       inferredTypeArgument = node.typeArgument;
     }
-    List<DartType> spreadTypes =
-        typeChecksNeeded ? new List<DartType>(node.expressions.length) : null;
     if (inferenceNeeded || typeChecksNeeded) {
       for (int i = 0; i < node.expressions.length; ++i) {
-        Expression judgment = node.expressions[i];
-        if (judgment is SpreadElement) {
-          DartType spreadType = inferrer.inferExpression(
-              judgment.expression,
-              new InterfaceType(inferrer.coreTypes.iterableClass,
-                  <DartType>[inferredTypeArgument]),
-              inferenceNeeded || typeChecksNeeded,
-              isVoidAllowed: true);
-          if (inferenceNeeded) {
-            formalTypes.add(listType.typeArguments[0]);
-          }
-          if (typeChecksNeeded) {
-            spreadTypes[i] = spreadType;
-          }
-          // Use 'dynamic' for error recovery.
-          actualTypes.add(
-              getSpreadElementType(spreadType, judgment.isNullAware) ??
-                  const DynamicType());
-        } else {
-          inferrer.inferExpression(judgment, inferredTypeArgument,
-              inferenceNeeded || typeChecksNeeded,
-              isVoidAllowed: true);
-          if (inferenceNeeded) {
-            formalTypes.add(listType.typeArguments[0]);
-          }
-          actualTypes.add(getInferredType(judgment, inferrer));
+        DartType type = inferElement(
+            node.expressions[i],
+            node,
+            inferredTypeArgument,
+            inferredSpreadTypes,
+            inferenceNeeded,
+            typeChecksNeeded);
+        actualTypes.add(type);
+        if (inferenceNeeded) {
+          formalTypes.add(listType.typeArguments[0]);
         }
       }
     }
@@ -739,49 +911,8 @@
     }
     if (typeChecksNeeded) {
       for (int i = 0; i < node.expressions.length; i++) {
-        Expression item = node.expressions[i];
-        if (item is SpreadElement) {
-          DartType spreadType = spreadTypes[i];
-          DartType spreadElementType =
-              getSpreadElementType(spreadType, item.isNullAware);
-          if (spreadElementType == null) {
-            if (spreadType is InterfaceType &&
-                spreadType.classNode == inferrer.coreTypes.nullClass &&
-                !item.isNullAware) {
-              node.replaceChild(
-                  node.expressions[i],
-                  inferrer.helper.desugarSyntheticExpression(inferrer.helper
-                      .buildProblem(messageNonNullAwareSpreadIsNull,
-                          item.expression.fileOffset, 1)));
-            } else {
-              node.replaceChild(
-                  node.expressions[i],
-                  inferrer.helper.desugarSyntheticExpression(inferrer.helper
-                      .buildProblem(
-                          templateSpreadTypeMismatch.withArguments(spreadType),
-                          item.expression.fileOffset,
-                          1)));
-            }
-          } else if (spreadType is DynamicType) {
-            inferrer.ensureAssignable(inferrer.coreTypes.iterableClass.rawType,
-                spreadType, item.expression, item.expression.fileOffset);
-          } else if (spreadType is InterfaceType) {
-            if (!inferrer.isAssignable(node.typeArgument, spreadElementType)) {
-              node.replaceChild(
-                  node.expressions[i],
-                  inferrer.helper.desugarSyntheticExpression(inferrer.helper
-                      .buildProblem(
-                          templateSpreadElementTypeMismatch.withArguments(
-                              spreadElementType, node.typeArgument),
-                          item.expression.fileOffset,
-                          1)));
-            }
-          }
-        } else {
-          inferrer.ensureAssignable(
-              node.typeArgument, actualTypes[i], item, item.fileOffset,
-              isVoidAllowed: node.typeArgument is VoidType);
-        }
+        checkElement(
+            node.expressions[i], node, node.typeArgument, inferredSpreadTypes);
       }
     }
     node.inferredType = new InterfaceType(listClass, [inferredTypeArgument]);
@@ -832,6 +963,308 @@
     }
   }
 
+  // Note that inferMapEntry adds exactly two elements to actualTypes -- the
+  // actual types of the key and the value.  The same technique is used for
+  // actualTypesForSet, only inferMapEntry adds exactly one element to that
+  // list: the actual type of the iterable spread elements in case the map
+  // literal will be disambiguated as a set literal later.
+  void inferMapEntry(
+      MapEntry entry,
+      TreeNode parent,
+      DartType inferredKeyType,
+      DartType inferredValueType,
+      DartType spreadContext,
+      List<DartType> actualTypes,
+      List<DartType> actualTypesForSet,
+      Map<TreeNode, DartType> inferredSpreadTypes,
+      bool inferenceNeeded,
+      bool typeChecksNeeded) {
+    if (entry is SpreadMapEntry) {
+      DartType spreadType = inferrer.inferExpression(
+          entry.expression, spreadContext, inferenceNeeded || typeChecksNeeded,
+          isVoidAllowed: true);
+      inferredSpreadTypes[entry.expression] = spreadType;
+      int length = actualTypes.length;
+      actualTypes.add(null);
+      actualTypes.add(null);
+      storeSpreadMapEntryElementTypes(
+          spreadType, entry.isNullAware, actualTypes, length);
+      DartType actualKeyType = actualTypes[length];
+      DartType actualValueType = actualTypes[length + 1];
+      DartType actualElementType =
+          getSpreadElementType(spreadType, entry.isNullAware);
+
+      if (typeChecksNeeded) {
+        if (actualKeyType == null) {
+          if (spreadType is InterfaceType &&
+              spreadType.classNode == inferrer.coreTypes.nullClass &&
+              !entry.isNullAware) {
+            parent.replaceChild(
+                entry,
+                new MapEntry(
+                    inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                        .buildProblem(messageNonNullAwareSpreadIsNull,
+                            entry.expression.fileOffset, 1)),
+                    new NullLiteral())
+                  ..fileOffset = entry.fileOffset);
+          } else if (actualElementType != null) {
+            // Don't report the error here, it might be an ambiguous Set.  The
+            // error is reported in checkMapEntry if it's disambiguated as map.
+            iterableSpreadType = spreadType;
+          } else {
+            parent.replaceChild(
+                entry,
+                new MapEntry(
+                    inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                        .buildProblem(
+                            templateSpreadMapEntryTypeMismatch
+                                .withArguments(spreadType),
+                            entry.expression.fileOffset,
+                            1)),
+                    new NullLiteral())
+                  ..fileOffset = entry.fileOffset);
+          }
+        } else if (spreadType is InterfaceType) {
+          Expression keyError;
+          Expression valueError;
+          if (!inferrer.isAssignable(inferredKeyType, actualKeyType)) {
+            keyError = inferrer.helper.desugarSyntheticExpression(
+                inferrer.helper.buildProblem(
+                    templateSpreadMapEntryElementKeyTypeMismatch.withArguments(
+                        actualKeyType, inferredKeyType),
+                    entry.expression.fileOffset,
+                    1));
+          }
+          if (!inferrer.isAssignable(inferredValueType, actualValueType)) {
+            valueError = inferrer.helper.desugarSyntheticExpression(
+                inferrer.helper.buildProblem(
+                    templateSpreadMapEntryElementValueTypeMismatch
+                        .withArguments(actualValueType, inferredValueType),
+                    entry.expression.fileOffset,
+                    1));
+          }
+          if (keyError != null || valueError != null) {
+            keyError ??= new NullLiteral();
+            valueError ??= new NullLiteral();
+            parent.replaceChild(
+                entry,
+                new MapEntry(keyError, valueError)
+                  ..fileOffset = entry.fileOffset);
+          }
+        }
+      }
+
+      // Use 'dynamic' for error recovery.
+      if (actualKeyType == null) {
+        actualKeyType = actualTypes[length] = const DynamicType();
+        actualValueType = actualTypes[length + 1] = const DynamicType();
+      }
+      // Store the type in case of an ambiguous Set.  Use 'dynamic' for error
+      // recovery.
+      actualTypesForSet.add(actualElementType ?? const DynamicType());
+
+      mapEntryClass ??=
+          inferrer.coreTypes.index.getClass('dart:core', 'MapEntry');
+      // TODO(dmitryas):  Handle the case of an ambiguous Set.
+      entry.entryType = new InterfaceType(
+          mapEntryClass, <DartType>[actualKeyType, actualValueType]);
+
+      bool isMap = inferrer.typeSchemaEnvironment
+          .isSubtypeOf(spreadType, inferrer.coreTypes.mapClass.rawType);
+      bool isIterable = inferrer.typeSchemaEnvironment
+          .isSubtypeOf(spreadType, inferrer.coreTypes.iterableClass.rawType);
+      if (isMap && !isIterable) {
+        mapSpreadOffset = entry.fileOffset;
+      }
+      if (!isMap && isIterable) {
+        iterableSpreadOffset = entry.expression.fileOffset;
+      }
+
+      return;
+    } else if (entry is IfMapEntry) {
+      DartType boolType = inferrer.coreTypes.boolClass.rawType;
+      DartType conditionType = inferrer.inferExpression(
+          entry.condition, boolType, typeChecksNeeded,
+          isVoidAllowed: false);
+      inferrer.ensureAssignable(
+          boolType, conditionType, entry.condition, entry.condition.fileOffset);
+      // Note that this recursive invocation of inferMapEntry will add two types
+      // to actualTypes; they are the actual types of the current invocation if
+      // the 'else' branch is empty.
+      inferMapEntry(
+          entry.then,
+          entry,
+          inferredKeyType,
+          inferredValueType,
+          spreadContext,
+          actualTypes,
+          actualTypesForSet,
+          inferredSpreadTypes,
+          inferenceNeeded,
+          typeChecksNeeded);
+      if (entry.otherwise != null) {
+        // We need to modify the actual types added in the recursive call to
+        // inferMapEntry.
+        DartType actualValueType = actualTypes.removeLast();
+        DartType actualKeyType = actualTypes.removeLast();
+        DartType actualTypeForSet = actualTypesForSet.removeLast();
+        inferMapEntry(
+            entry.otherwise,
+            entry,
+            inferredKeyType,
+            inferredValueType,
+            spreadContext,
+            actualTypes,
+            actualTypesForSet,
+            inferredSpreadTypes,
+            inferenceNeeded,
+            typeChecksNeeded);
+        int length = actualTypes.length;
+        actualTypes[length - 2] = inferrer.typeSchemaEnvironment
+            .getStandardUpperBound(actualKeyType, actualTypes[length - 2]);
+        actualTypes[length - 1] = inferrer.typeSchemaEnvironment
+            .getStandardUpperBound(actualValueType, actualTypes[length - 1]);
+        int lengthForSet = actualTypesForSet.length;
+        actualTypesForSet[lengthForSet - 1] = inferrer.typeSchemaEnvironment
+            .getStandardUpperBound(
+                actualTypeForSet, actualTypesForSet[lengthForSet - 1]);
+      }
+      return;
+    } else if (entry is ForMapEntry) {
+      for (VariableDeclaration declaration in entry.variables) {
+        if (declaration.name == null) {
+          if (declaration.initializer != null) {
+            declaration.type = inferrer.inferExpression(declaration.initializer,
+                declaration.type, inferenceNeeded || typeChecksNeeded,
+                isVoidAllowed: true);
+          }
+        } else {
+          inferrer.inferStatement(declaration);
+        }
+      }
+      if (entry.condition != null) {
+        inferrer.inferExpression(
+            entry.condition,
+            inferrer.coreTypes.boolClass.rawType,
+            inferenceNeeded || typeChecksNeeded,
+            isVoidAllowed: false);
+      }
+      for (Expression expression in entry.updates) {
+        inferrer.inferExpression(expression, const UnknownType(),
+            inferenceNeeded || typeChecksNeeded,
+            isVoidAllowed: true);
+      }
+      // Actual types are added by the recursive call.
+      return inferMapEntry(
+          entry.body,
+          entry,
+          inferredKeyType,
+          inferredValueType,
+          spreadContext,
+          actualTypes,
+          actualTypesForSet,
+          inferredSpreadTypes,
+          inferenceNeeded,
+          typeChecksNeeded);
+    } else if (entry is ForInMapEntry) {
+      if (entry.variable.name == null) {
+        handleForInWithoutVariable(
+            entry.variable, entry.iterable, entry.prologue,
+            isAsync: entry.isAsync);
+      } else {
+        handleForInDeclaringVariable(
+            entry.variable, entry.iterable, entry.prologue,
+            isAsync: entry.isAsync);
+      }
+      if (entry.problem != null) {
+        inferrer.inferExpression(entry.problem, const UnknownType(),
+            inferenceNeeded || typeChecksNeeded,
+            isVoidAllowed: true);
+      }
+      // Actual types are added by the recursive call.
+      inferMapEntry(
+          entry.body,
+          entry,
+          inferredKeyType,
+          inferredValueType,
+          spreadContext,
+          actualTypes,
+          actualTypesForSet,
+          inferredSpreadTypes,
+          inferenceNeeded,
+          typeChecksNeeded);
+    } else {
+      DartType keyType = inferrer.inferExpression(
+          entry.key, inferredKeyType, true,
+          isVoidAllowed: true);
+      DartType valueType = inferrer.inferExpression(
+          entry.value, inferredValueType, true,
+          isVoidAllowed: true);
+      inferrer.ensureAssignable(
+          inferredKeyType, keyType, entry.key, entry.key.fileOffset,
+          isVoidAllowed: inferredKeyType is VoidType);
+      inferrer.ensureAssignable(
+          inferredValueType, valueType, entry.value, entry.value.fileOffset,
+          isVoidAllowed: inferredValueType is VoidType);
+      actualTypes.add(keyType);
+      actualTypes.add(valueType);
+      // Use 'dynamic' for error recovery.
+      actualTypesForSet.add(const DynamicType());
+      mapEntryOffset = entry.fileOffset;
+      return;
+    }
+  }
+
+  void checkMapEntry(
+      MapEntry entry,
+      TreeNode parent,
+      Expression cachedKey,
+      Expression cachedValue,
+      DartType keyType,
+      DartType valueType,
+      Map<TreeNode, DartType> inferredSpreadTypes) {
+    // It's disambiguated as a map literal.
+    if (iterableSpreadOffset != null) {
+      parent.replaceChild(
+          entry,
+          new MapEntry(
+              inferrer.helper.desugarSyntheticExpression(inferrer.helper
+                  .buildProblem(
+                      templateSpreadMapEntryTypeMismatch
+                          .withArguments(iterableSpreadType),
+                      iterableSpreadOffset,
+                      1)),
+              new NullLiteral()));
+    }
+    if (entry is SpreadMapEntry) {
+      DartType spreadType = inferredSpreadTypes[entry.expression];
+      if (spreadType is DynamicType) {
+        inferrer.ensureAssignable(inferrer.coreTypes.mapClass.rawType,
+            spreadType, entry.expression, entry.expression.fileOffset);
+      }
+    } else if (entry is IfMapEntry) {
+      checkMapEntry(entry.then, entry, cachedKey, cachedValue, keyType,
+          valueType, inferredSpreadTypes);
+      if (entry.otherwise != null) {
+        checkMapEntry(entry.otherwise, entry, cachedKey, cachedValue, keyType,
+            valueType, inferredSpreadTypes);
+      }
+    } else if (entry is ForMapEntry) {
+      if (entry.condition != null) {
+        DartType conditionType = getInferredType(entry.condition, inferrer);
+        inferrer.ensureAssignable(inferrer.coreTypes.boolClass.rawType,
+            conditionType, entry.condition, entry.condition.fileOffset);
+      }
+      checkMapEntry(entry.body, entry, cachedKey, cachedValue, keyType,
+          valueType, inferredSpreadTypes);
+    } else if (entry is ForInMapEntry) {
+      checkMapEntry(entry.body, entry, cachedKey, cachedValue, keyType,
+          valueType, inferredSpreadTypes);
+    } else {
+      // Do nothing.  Assignability checks are done during type inference.
+    }
+  }
+
   void visitMapLiteralJudgment(MapLiteralJudgment node, DartType typeContext) {
     var mapClass = inferrer.coreTypes.mapClass;
     var mapType = mapClass.thisType;
@@ -840,11 +1273,12 @@
     DartType inferredValueType;
     List<DartType> formalTypes;
     List<DartType> actualTypes;
+    List<DartType> actualTypesForSet;
     assert((node.keyType is ImplicitTypeArgument) ==
         (node.valueType is ImplicitTypeArgument));
     bool inferenceNeeded = node.keyType is ImplicitTypeArgument;
     KernelLibraryBuilder library = inferrer.library;
-    bool typeContextIsMap = false;
+    bool typeContextIsMap = node.keyType is! ImplicitTypeArgument;
     bool typeContextIsIterable = false;
     if (!inferrer.isTopLevel) {
       if (library.loader.target.enableSetLiterals && inferenceNeeded) {
@@ -852,10 +1286,12 @@
         DartType context =
             inferrer.typeSchemaEnvironment.unfutureType(typeContext);
         if (context is InterfaceType) {
-          typeContextIsMap = inferrer.classHierarchy
-              .isSubtypeOf(context.classNode, inferrer.coreTypes.mapClass);
-          typeContextIsIterable = inferrer.classHierarchy
-              .isSubtypeOf(context.classNode, inferrer.coreTypes.iterableClass);
+          typeContextIsMap = typeContextIsMap ||
+              inferrer.classHierarchy
+                  .isSubtypeOf(context.classNode, inferrer.coreTypes.mapClass);
+          typeContextIsIterable = typeContextIsIterable ||
+              inferrer.classHierarchy.isSubtypeOf(
+                  context.classNode, inferrer.coreTypes.iterableClass);
           if (node.entries.isEmpty &&
               typeContextIsIterable &&
               !typeContextIsMap) {
@@ -873,9 +1309,12 @@
       }
     }
     bool typeChecksNeeded = !inferrer.isTopLevel;
+    Map<TreeNode, DartType> inferredSpreadTypes;
     if (inferenceNeeded || typeChecksNeeded) {
       formalTypes = [];
       actualTypes = [];
+      actualTypesForSet = [];
+      inferredSpreadTypes = new Map<TreeNode, DartType>.identity();
     }
     if (inferenceNeeded) {
       inferredTypes = [const UnknownType(), const UnknownType()];
@@ -890,102 +1329,99 @@
     }
     List<Expression> cachedKeys = new List(node.entries.length);
     List<Expression> cachedValues = new List(node.entries.length);
-    List<DartType> spreadMapEntryTypes =
-        typeChecksNeeded ? new List<DartType>(node.entries.length) : null;
     for (int i = 0; i < node.entries.length; i++) {
       MapEntry entry = node.entries[i];
-      if (entry is! SpreadMapEntry && entry is! IfMapEntry) {
+      if (entry is! ControlFlowMapEntry) {
         cachedKeys[i] = node.entries[i].key;
         cachedValues[i] = node.entries[i].value;
       }
     }
-    int iterableSpreadOffset = -1;
-    int mapSpreadOffset = -1;
-    int mapEntryOffset = -1;
+    bool hasMapEntry = false;
+    bool hasMapSpread = false;
+    bool hasIterableSpread = false;
     if (inferenceNeeded || typeChecksNeeded) {
+      mapEntryOffset = null;
+      mapSpreadOffset = null;
+      iterableSpreadOffset = null;
+      iterableSpreadType = null;
       DartType spreadTypeContext = const UnknownType();
       if (typeContextIsIterable && !typeContextIsMap) {
         spreadTypeContext = inferrer.typeSchemaEnvironment
             .getTypeAsInstanceOf(typeContext, inferrer.coreTypes.iterableClass);
       } else if (!typeContextIsIterable && typeContextIsMap) {
-        spreadTypeContext =
-            new InterfaceType(inferrer.coreTypes.mapClass, inferredTypes);
+        spreadTypeContext = new InterfaceType(inferrer.coreTypes.mapClass,
+            <DartType>[inferredKeyType, inferredValueType]);
       }
       for (int i = 0; i < node.entries.length; ++i) {
         MapEntry entry = node.entries[i];
-        if (entry is SpreadMapEntry) {
-          DartType spreadMapEntryType = inferrer.inferExpression(
-              entry.expression,
-              spreadTypeContext,
-              inferenceNeeded || typeChecksNeeded,
-              isVoidAllowed: true);
-          if (inferenceNeeded) {
-            formalTypes.add(mapType.typeArguments[0]);
-            formalTypes.add(mapType.typeArguments[1]);
-          }
-          if (typeChecksNeeded) {
-            spreadMapEntryTypes[i] = spreadMapEntryType;
-          }
-
-          bool isMap = inferrer.typeSchemaEnvironment.isSubtypeOf(
-              spreadMapEntryType, inferrer.coreTypes.mapClass.rawType);
-          bool isSet = inferrer.typeSchemaEnvironment.isSubtypeOf(
-              spreadMapEntryType, inferrer.coreTypes.iterableClass.rawType);
-
-          if (isMap && !isSet) {
-            mapSpreadOffset = entry.expression.fileOffset;
-          }
-          if (!isMap && isSet) {
-            iterableSpreadOffset = entry.expression.fileOffset;
-          }
-
-          // Use 'dynamic' for error recovery.
-          int length = actualTypes.length;
-          actualTypes.add(const DynamicType());
-          actualTypes.add(const DynamicType());
-          storeSpreadMapEntryElementTypes(
-              spreadMapEntryType, entry.isNullAware, actualTypes, length);
-        } else if (entry is IfMapEntry) {
-          node.entries[i] = new MapEntry(
-              new InvalidExpression('unimplemented spread entry')
-                ..fileOffset = node.fileOffset,
-              new NullLiteral());
-          actualTypes.add(const DynamicType());
-          actualTypes.add(const DynamicType());
-        } else {
-          Expression key = entry.key;
-          inferrer.inferExpression(key, inferredKeyType, true,
-              isVoidAllowed: true);
-          actualTypes.add(getInferredType(key, inferrer));
-          Expression value = entry.value;
-          inferrer.inferExpression(value, inferredValueType, true,
-              isVoidAllowed: true);
-          actualTypes.add(getInferredType(value, inferrer));
-          if (inferenceNeeded) {
-            formalTypes.addAll(mapType.typeArguments);
-          }
-
-          mapEntryOffset = entry.fileOffset;
+        inferMapEntry(
+            entry,
+            node,
+            inferredKeyType,
+            inferredValueType,
+            spreadTypeContext,
+            actualTypes,
+            actualTypesForSet,
+            inferredSpreadTypes,
+            inferenceNeeded,
+            typeChecksNeeded);
+        if (inferenceNeeded) {
+          formalTypes.add(mapType.typeArguments[0]);
+          formalTypes.add(mapType.typeArguments[1]);
         }
       }
+      hasMapEntry = mapEntryOffset != null;
+      hasMapSpread = mapSpreadOffset != null;
+      hasIterableSpread = iterableSpreadOffset != null;
     }
     if (inferenceNeeded) {
-      bool canBeSet =
-          mapSpreadOffset == -1 && mapEntryOffset == -1 && !typeContextIsMap;
-      bool canBeMap = iterableSpreadOffset == -1 && !typeContextIsIterable;
+      bool canBeSet = !hasMapSpread && !hasMapEntry && !typeContextIsMap;
+      bool canBeMap = !hasIterableSpread && !typeContextIsIterable;
       if (canBeSet && !canBeMap) {
         List<Expression> setElements = <Expression>[];
+        List<DartType> formalTypesForSet = <DartType>[];
+        InterfaceType setType = inferrer.coreTypes.setClass.thisType;
         for (int i = 0; i < node.entries.length; ++i) {
-          SpreadMapEntry entry = node.entries[i];
-          setElements
-              .add(new SpreadElement(entry.expression, entry.isNullAware));
+          setElements.add(convertToElement(node.entries[i], inferrer.helper));
+          formalTypesForSet.add(setType.typeArguments[0]);
         }
+
+        List<DartType> inferredTypesForSet = <DartType>[const UnknownType()];
+        inferrer.typeSchemaEnvironment.inferGenericFunctionOrType(
+            setType,
+            inferrer.coreTypes.setClass.typeParameters,
+            null,
+            null,
+            typeContext,
+            inferredTypesForSet,
+            isConst: node.isConst);
+        inferrer.typeSchemaEnvironment.inferGenericFunctionOrType(
+            inferrer.coreTypes.setClass.thisType,
+            inferrer.coreTypes.setClass.typeParameters,
+            formalTypesForSet,
+            actualTypesForSet,
+            typeContext,
+            inferredTypesForSet);
+        DartType inferredTypeArgument = inferredTypesForSet[0];
+        inferrer.instrumentation?.record(
+            inferrer.uri,
+            node.fileOffset,
+            'typeArgs',
+            new InstrumentationValueForTypeArgs([inferredTypeArgument]));
+
         SetLiteralJudgment setLiteral = new SetLiteralJudgment(setElements,
-            typeArgument: const ImplicitTypeArgument(), isConst: node.isConst)
+            typeArgument: inferredTypeArgument, isConst: node.isConst)
           ..fileOffset = node.fileOffset;
         node.parent.replaceChild(node, setLiteral);
-        visitSetLiteralJudgment(setLiteral, typeContext);
-        node.inferredType = setLiteral.inferredType;
+        if (typeChecksNeeded) {
+          for (int i = 0; i < setLiteral.expressions.length; i++) {
+            checkElement(setLiteral.expressions[i], setLiteral,
+                setLiteral.typeArgument, inferredSpreadTypes);
+          }
+        }
+
+        node.inferredType = setLiteral.inferredType =
+            new InterfaceType(inferrer.coreTypes.setClass, inferredTypesForSet);
         return;
       }
       if (canBeSet && canBeMap && node.entries.isNotEmpty) {
@@ -999,24 +1435,11 @@
       }
       if (!canBeSet && !canBeMap) {
         if (!inferrer.isTopLevel) {
-          LocatedMessage iterableContextMessage = messageSpreadElement
-              .withLocation(library.uri, iterableSpreadOffset, 1);
-          LocatedMessage mapContextMessage = messageSpreadMapElement
-              .withLocation(library.uri, mapSpreadOffset, 1);
-          List<LocatedMessage> context = <LocatedMessage>[];
-          if (iterableSpreadOffset < mapSpreadOffset) {
-            context.add(iterableContextMessage);
-            context.add(mapContextMessage);
-          } else {
-            context.add(mapContextMessage);
-            context.add(iterableContextMessage);
-          }
           node.parent.replaceChild(
               node,
               inferrer.helper.desugarSyntheticExpression(inferrer.helper
                   .buildProblem(messageCantDisambiguateAmbiguousInformation,
-                      node.fileOffset, 1,
-                      context: context)));
+                      node.fileOffset, 1)));
         }
         node.inferredType = const BottomType();
         return;
@@ -1041,85 +1464,8 @@
     }
     if (typeChecksNeeded) {
       for (int i = 0; i < node.entries.length; ++i) {
-        MapEntry entry = node.entries[i];
-        List<DartType> spreadMapEntryElementTypes = new List<DartType>(2);
-        if (entry is SpreadMapEntry) {
-          DartType spreadMapEntryType = spreadMapEntryTypes[i];
-          spreadMapEntryElementTypes[0] = spreadMapEntryElementTypes[1] = null;
-          storeSpreadMapEntryElementTypes(spreadMapEntryType, entry.isNullAware,
-              spreadMapEntryElementTypes, 0);
-          if (spreadMapEntryElementTypes[0] == null) {
-            if (spreadMapEntryType is InterfaceType &&
-                spreadMapEntryType.classNode == inferrer.coreTypes.nullClass &&
-                !entry.isNullAware) {
-              node.replaceChild(
-                  node.entries[i],
-                  new MapEntry(
-                      inferrer.helper.desugarSyntheticExpression(inferrer.helper
-                          .buildProblem(messageNonNullAwareSpreadIsNull,
-                              entry.expression.fileOffset, 1)),
-                      new NullLiteral()));
-            } else {
-              node.replaceChild(
-                  node.entries[i],
-                  new MapEntry(
-                      inferrer.helper.desugarSyntheticExpression(inferrer.helper
-                          .buildProblem(
-                              templateSpreadMapEntryTypeMismatch
-                                  .withArguments(spreadMapEntryType),
-                              entry.expression.fileOffset,
-                              1)),
-                      new NullLiteral()));
-            }
-          } else if (spreadMapEntryType is DynamicType) {
-            inferrer.ensureAssignable(
-                inferrer.coreTypes.mapClass.rawType,
-                spreadMapEntryType,
-                entry.expression,
-                entry.expression.fileOffset);
-          } else if (spreadMapEntryType is InterfaceType) {
-            Expression keyError;
-            Expression valueError;
-            if (!inferrer.isAssignable(
-                node.keyType, spreadMapEntryElementTypes[0])) {
-              keyError = inferrer.helper.desugarSyntheticExpression(
-                  inferrer.helper.buildProblem(
-                      templateSpreadMapEntryElementKeyTypeMismatch
-                          .withArguments(
-                              spreadMapEntryElementTypes[0], node.keyType),
-                      entry.expression.fileOffset,
-                      1));
-            }
-            if (!inferrer.isAssignable(
-                node.valueType, spreadMapEntryElementTypes[1])) {
-              valueError = inferrer.helper.desugarSyntheticExpression(
-                  inferrer.helper.buildProblem(
-                      templateSpreadMapEntryElementValueTypeMismatch
-                          .withArguments(
-                              spreadMapEntryElementTypes[1], node.valueType),
-                      entry.expression.fileOffset,
-                      1));
-            }
-            if (keyError != null || valueError != null) {
-              keyError ??= new NullLiteral();
-              valueError ??= new NullLiteral();
-              node.replaceChild(
-                  node.entries[i], new MapEntry(keyError, valueError));
-            }
-          }
-        } else {
-          Expression keyJudgment = cachedKeys[i];
-          if (keyJudgment != null) {
-            inferrer.ensureAssignable(node.keyType, actualTypes[2 * i],
-                keyJudgment, keyJudgment.fileOffset,
-                isVoidAllowed: node.keyType is VoidType);
-
-            Expression valueJudgment = cachedValues[i];
-            inferrer.ensureAssignable(node.valueType, actualTypes[2 * i + 1],
-                valueJudgment, valueJudgment.fileOffset,
-                isVoidAllowed: node.valueType is VoidType);
-          }
-        }
+        checkMapEntry(node.entries[i], node, cachedKeys[i], cachedValues[i],
+            node.keyType, node.valueType, inferredSpreadTypes);
       }
     }
     node.inferredType =
@@ -1358,9 +1704,11 @@
     List<DartType> actualTypes;
     bool inferenceNeeded = node.typeArgument is ImplicitTypeArgument;
     bool typeChecksNeeded = !inferrer.isTopLevel;
+    Map<TreeNode, DartType> inferredSpreadTypes;
     if (inferenceNeeded || typeChecksNeeded) {
       formalTypes = [];
       actualTypes = [];
+      inferredSpreadTypes = new Map<TreeNode, DartType>.identity();
     }
     if (inferenceNeeded) {
       inferredTypes = [const UnknownType()];
@@ -1371,36 +1719,18 @@
     } else {
       inferredTypeArgument = node.typeArgument;
     }
-    List<DartType> spreadTypes =
-        typeChecksNeeded ? new List<DartType>(node.expressions.length) : null;
     if (inferenceNeeded || typeChecksNeeded) {
       for (int i = 0; i < node.expressions.length; ++i) {
-        Expression judgment = node.expressions[i];
-        if (judgment is SpreadElement) {
-          DartType spreadType = inferrer.inferExpression(
-              judgment.expression,
-              new InterfaceType(inferrer.coreTypes.iterableClass,
-                  <DartType>[inferredTypeArgument]),
-              inferenceNeeded || typeChecksNeeded,
-              isVoidAllowed: true);
-          if (inferenceNeeded) {
-            formalTypes.add(setType.typeArguments[0]);
-          }
-          if (typeChecksNeeded) {
-            spreadTypes[i] = spreadType;
-          }
-          // Use 'dynamic' for error recovery.
-          actualTypes.add(
-              getSpreadElementType(spreadType, judgment.isNullAware) ??
-                  const DynamicType());
-        } else {
-          inferrer.inferExpression(judgment, inferredTypeArgument,
-              inferenceNeeded || typeChecksNeeded,
-              isVoidAllowed: true);
-          if (inferenceNeeded) {
-            formalTypes.add(setType.typeArguments[0]);
-          }
-          actualTypes.add(getInferredType(judgment, inferrer));
+        DartType type = inferElement(
+            node.expressions[i],
+            node,
+            inferredTypeArgument,
+            inferredSpreadTypes,
+            inferenceNeeded,
+            typeChecksNeeded);
+        actualTypes.add(type);
+        if (inferenceNeeded) {
+          formalTypes.add(setType.typeArguments[0]);
         }
       }
     }
@@ -1422,49 +1752,8 @@
     }
     if (typeChecksNeeded) {
       for (int i = 0; i < node.expressions.length; i++) {
-        Expression item = node.expressions[i];
-        if (item is SpreadElement) {
-          DartType spreadType = spreadTypes[i];
-          DartType spreadElementType =
-              getSpreadElementType(spreadType, item.isNullAware);
-          if (spreadElementType == null) {
-            if (spreadType is InterfaceType &&
-                spreadType.classNode == inferrer.coreTypes.nullClass &&
-                !item.isNullAware) {
-              node.replaceChild(
-                  node.expressions[i],
-                  inferrer.helper.desugarSyntheticExpression(inferrer.helper
-                      .buildProblem(messageNonNullAwareSpreadIsNull,
-                          item.expression.fileOffset, 1)));
-            } else {
-              node.replaceChild(
-                  node.expressions[i],
-                  inferrer.helper.desugarSyntheticExpression(inferrer.helper
-                      .buildProblem(
-                          templateSpreadTypeMismatch.withArguments(spreadType),
-                          item.expression.fileOffset,
-                          1)));
-            }
-          } else if (spreadType is DynamicType) {
-            inferrer.ensureAssignable(inferrer.coreTypes.iterableClass.rawType,
-                spreadType, item.expression, item.expression.fileOffset);
-          } else if (spreadType is InterfaceType) {
-            if (!inferrer.isAssignable(node.typeArgument, spreadElementType)) {
-              node.replaceChild(
-                  node.expressions[i],
-                  inferrer.helper.desugarSyntheticExpression(inferrer.helper
-                      .buildProblem(
-                          templateSpreadElementTypeMismatch.withArguments(
-                              spreadElementType, node.typeArgument),
-                          item.expression.fileOffset,
-                          1)));
-            }
-          }
-        } else {
-          inferrer.ensureAssignable(node.typeArgument, actualTypes[i],
-              node.expressions[i], node.expressions[i].fileOffset,
-              isVoidAllowed: node.typeArgument is VoidType);
-        }
+        checkElement(
+            node.expressions[i], node, node.typeArgument, inferredSpreadTypes);
       }
     }
     node.inferredType = new InterfaceType(setClass, [inferredTypeArgument]);
diff --git a/front_end/lib/src/fasta/kernel/inferred_type_visitor.dart b/front_end/lib/src/fasta/kernel/inferred_type_visitor.dart
index 91ae51b..05513ad 100644
--- a/front_end/lib/src/fasta/kernel/inferred_type_visitor.dart
+++ b/front_end/lib/src/fasta/kernel/inferred_type_visitor.dart
@@ -28,18 +28,11 @@
 
   @override
   DartType defaultExpression(Expression node, TypeInferrerImpl inferrer) {
-    if (node is IfElement) {
-      return visitIfElement(node, inferrer);
-    }
     unhandled("${node.runtimeType}", "getInferredType", node.fileOffset,
         inferrer.uri);
     return const InvalidType();
   }
 
-  DartType visitIfElement(IfElement node, TypeInferrerImpl inferrer) {
-    return const BottomType();
-  }
-
   @override
   DartType visitIntLiteral(IntLiteral node, TypeInferrerImpl inferrer) {
     return inferrer.coreTypes.intClass.rawType;
diff --git a/front_end/lib/src/fasta/kernel/kernel_ast_api.dart b/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
index cded049..bca9db5 100644
--- a/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
+++ b/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
@@ -18,6 +18,7 @@
         Catch,
         CheckLibraryIsLoaded,
         Class,
+        Component,
         Constructor,
         ConstructorInvocation,
         ContinueSwitchStatement,
@@ -53,6 +54,7 @@
         NamedExpression,
         NamedType,
         Node,
+        NullLiteral,
         Procedure,
         ProcedureKind,
         PropertyGet,
diff --git a/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index 80b38e4..151c074 100644
--- a/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -6,31 +6,32 @@
 
 import 'package:kernel/ast.dart'
     show
+        Arguments,
+        AsExpression,
         Class,
         Constructor,
-        ThisExpression,
         DartType,
         DynamicType,
         Expression,
         Field,
         FunctionNode,
         InterfaceType,
-        AsExpression,
+        InvalidType,
         ListLiteral,
         Member,
+        MethodInvocation,
         Name,
         Procedure,
+        ProcedureKind,
         RedirectingFactoryConstructor,
         ReturnStatement,
-        VoidType,
-        MethodInvocation,
-        ProcedureKind,
         StaticGet,
         Supertype,
+        ThisExpression,
         TypeParameter,
         TypeParameterType,
-        Arguments,
-        VariableDeclaration;
+        VariableDeclaration,
+        VoidType;
 
 import 'package:kernel/ast.dart' show FunctionType, TypeParameterType;
 
@@ -1021,6 +1022,9 @@
     } else if (isCovariant && typeEnvironment.isSubtypeOf(supertype, subtype)) {
       // No problem--the overriding parameter is marked "covariant" and has
       // a type which is a subtype of the parameter it overrides.
+    } else if (subtype is InvalidType || supertype is InvalidType) {
+      // Don't report a problem as something else is wrong that has already
+      // been reported.
     } else {
       // Report an error.
       String declaredMemberName =
diff --git a/front_end/lib/src/fasta/kernel/kernel_constants.dart b/front_end/lib/src/fasta/kernel/kernel_constants.dart
index 6cb0a71..5f8b4f5 100644
--- a/front_end/lib/src/fasta/kernel/kernel_constants.dart
+++ b/front_end/lib/src/fasta/kernel/kernel_constants.dart
@@ -4,177 +4,28 @@
 
 library fasta.kernel_constants;
 
-import 'package:kernel/ast.dart'
-    show Constant, DartType, IntConstant, Library, Member, Procedure, TreeNode;
+import 'package:kernel/ast.dart' show InvalidExpression, Library;
 
-import 'package:kernel/type_environment.dart' show TypeEnvironment;
-
-import 'package:kernel/transformations/constants.dart' show ErrorReporter;
-
-import '../fasta_codes.dart'
-    show
-        Message,
-        noLength,
-        messageConstEvalCircularity,
-        messageConstEvalFailedAssertion,
-        templateConstEvalDeferredLibrary,
-        templateConstEvalDuplicateKey,
-        templateConstEvalFailedAssertionWithMessage,
-        templateConstEvalFreeTypeParameter,
-        templateConstEvalInvalidBinaryOperandType,
-        templateConstEvalInvalidMethodInvocation,
-        templateConstEvalInvalidStaticInvocation,
-        templateConstEvalInvalidStringInterpolationOperand,
-        templateConstEvalInvalidSymbolName,
-        templateConstEvalInvalidType,
-        templateConstEvalNegativeShift,
-        templateConstEvalNonConstantLiteral,
-        templateConstEvalNonConstantVariableGet,
-        templateConstEvalZeroDivisor;
+import '../fasta_codes.dart' show LocatedMessage;
 
 import '../loader.dart' show Loader;
 
+import 'constant_evaluator.dart' show ErrorReporter;
+
 class KernelConstantErrorReporter extends ErrorReporter {
   final Loader<Library> loader;
-  final TypeEnvironment typeEnvironment;
 
-  KernelConstantErrorReporter(this.loader, this.typeEnvironment);
+  KernelConstantErrorReporter(this.loader);
 
-  String addProblem(TreeNode node, Message message) {
-    int offset = getFileOffset(node);
-    Uri uri = getFileUri(node);
-    loader.addProblem(message, offset, noLength, uri);
-    return loader.target.context.format(
-        message.withLocation(uri, offset, noLength), message.code.severity);
+  @override
+  void report(LocatedMessage message, List<LocatedMessage> context) {
+    loader.addProblem(
+        message.messageObject, message.charOffset, message.length, message.uri,
+        context: context);
   }
 
   @override
-  String freeTypeParameter(
-      List<TreeNode> context, TreeNode node, DartType type) {
-    return addProblem(
-        node, templateConstEvalFreeTypeParameter.withArguments(type));
-  }
-
-  @override
-  String duplicateKey(List<TreeNode> context, TreeNode node, Constant key) {
-    return addProblem(node, templateConstEvalDuplicateKey.withArguments(key));
-  }
-
-  @override
-  String invalidDartType(List<TreeNode> context, TreeNode node,
-      Constant receiver, DartType expectedType) {
-    return addProblem(
-        node,
-        templateConstEvalInvalidType.withArguments(
-            receiver, expectedType, receiver.getType(typeEnvironment)));
-  }
-
-  @override
-  String invalidBinaryOperandType(
-      List<TreeNode> context,
-      TreeNode node,
-      Constant receiver,
-      String op,
-      DartType expectedType,
-      DartType actualType) {
-    return addProblem(
-        node,
-        templateConstEvalInvalidBinaryOperandType.withArguments(
-            op, receiver, expectedType, actualType));
-  }
-
-  @override
-  String invalidMethodInvocation(
-      List<TreeNode> context, TreeNode node, Constant receiver, String op) {
-    return addProblem(node,
-        templateConstEvalInvalidMethodInvocation.withArguments(op, receiver));
-  }
-
-  @override
-  String invalidStaticInvocation(
-      List<TreeNode> context, TreeNode node, Member target) {
-    // TODO(kmillikin) For an invalid factory invocation we should adopt a
-    // better message.  This will show something like:
-    //
-    // "The invocation of 'List' is not allowed within a const context."
-    //
-    // Which is not quite right when the code was "new List()".
-    String name = target.name.toString();
-    if (target is Procedure && target.isFactory) {
-      if (name.isEmpty) {
-        name = target.enclosingClass.name;
-      } else {
-        name = '${target.enclosingClass.name}.${name}';
-      }
-    }
-    return addProblem(
-        node, templateConstEvalInvalidStaticInvocation.withArguments(name));
-  }
-
-  @override
-  String invalidStringInterpolationOperand(
-      List<TreeNode> context, TreeNode node, Constant constant) {
-    return addProblem(
-        node,
-        templateConstEvalInvalidStringInterpolationOperand
-            .withArguments(constant));
-  }
-
-  @override
-  String invalidSymbolName(
-      List<TreeNode> context, TreeNode node, Constant constant) {
-    return addProblem(
-        node, templateConstEvalInvalidSymbolName.withArguments(constant));
-  }
-
-  @override
-  String zeroDivisor(
-      List<TreeNode> context, TreeNode node, IntConstant receiver, String op) {
-    return addProblem(node,
-        templateConstEvalZeroDivisor.withArguments(op, '${receiver.value}'));
-  }
-
-  @override
-  String negativeShift(List<TreeNode> context, TreeNode node,
-      IntConstant receiver, String op, IntConstant argument) {
-    return addProblem(
-        node,
-        templateConstEvalNegativeShift.withArguments(
-            op, '${receiver.value}', '${argument.value}'));
-  }
-
-  @override
-  String nonConstLiteral(List<TreeNode> context, TreeNode node, String klass) {
-    return addProblem(
-        node, templateConstEvalNonConstantLiteral.withArguments(klass));
-  }
-
-  @override
-  String failedAssertion(List<TreeNode> context, TreeNode node, String string) {
-    return addProblem(
-        node,
-        (string == null)
-            ? messageConstEvalFailedAssertion
-            : templateConstEvalFailedAssertionWithMessage
-                .withArguments(string));
-  }
-
-  @override
-  String nonConstantVariableGet(
-      List<TreeNode> context, TreeNode node, String variableName) {
-    return addProblem(node,
-        templateConstEvalNonConstantVariableGet.withArguments(variableName));
-  }
-
-  @override
-  String deferredLibrary(
-      List<TreeNode> context, TreeNode node, String importName) {
-    return addProblem(
-        node, templateConstEvalDeferredLibrary.withArguments(importName));
-  }
-
-  @override
-  String circularity(List<TreeNode> context, TreeNode node) {
-    return addProblem(node, messageConstEvalCircularity);
+  void reportInvalidExpression(InvalidExpression node) {
+    // Assumed to be already reported.
   }
 }
diff --git a/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
index d34ba34..484c95e 100644
--- a/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/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/front_end/lib/src/fasta/kernel/kernel_field_builder.dart b/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
index 38d5e24..904f47d 100644
--- a/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
+++ b/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
@@ -5,22 +5,23 @@
 library fasta.kernel_field_builder;
 
 import 'package:kernel/ast.dart'
-    show DartType, DynamicType, Expression, Field, Name, NullLiteral;
-
-import '../../base/instrumentation.dart'
-    show Instrumentation, InstrumentationValueForType;
+    show Class, DartType, DynamicType, Expression, Field, Name, NullLiteral;
 
 import '../fasta_codes.dart' show messageInternalProblemAlreadyInitialized;
 
 import '../problems.dart' show internalProblem, unsupported;
 
+import '../type_inference/type_inference_engine.dart'
+    show IncludesTypeParametersCovariantly;
+
 import 'kernel_body_builder.dart' show KernelBodyBuilder;
 
 import 'kernel_builder.dart'
     show
+        ClassBuilder,
         Declaration,
-        ImplicitFieldType,
         FieldBuilder,
+        ImplicitFieldType,
         KernelLibraryBuilder,
         KernelTypeBuilder,
         MetadataBuilder;
@@ -58,6 +59,22 @@
     field.name ??= new Name(name, library.target);
     if (type != null) {
       field.type = type.build(library);
+
+      if (!isFinal && !isConst) {
+        IncludesTypeParametersCovariantly needsCheckVisitor;
+        if (parent is ClassBuilder) {
+          Class enclosingClass = parent.target;
+          if (enclosingClass.typeParameters.isNotEmpty) {
+            needsCheckVisitor = new IncludesTypeParametersCovariantly(
+                enclosingClass.typeParameters);
+          }
+        }
+        if (needsCheckVisitor != null) {
+          if (field.type.accept(needsCheckVisitor)) {
+            field.isGenericCovariantImpl = true;
+          }
+        }
+      }
     }
     bool isInstanceMember = !isStatic && !isTopLevel;
     field
@@ -96,13 +113,5 @@
   }
 
   @override
-  void instrumentTopLevelInference(Instrumentation instrumentation) {
-    if (isEligibleForInference) {
-      instrumentation.record(field.fileUri, field.fileOffset, 'topType',
-          new InstrumentationValueForType(field.type));
-    }
-  }
-
-  @override
   DartType get builtType => field.type;
 }
diff --git a/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index a7fbd0a..c1d8ca8 100644
--- a/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/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);
@@ -1367,7 +1382,13 @@
               unserializableExports ??= <String, String>{};
               unserializableExports[name] = member.message.message;
             } else {
-              library.additionalExports.add(member.target.reference);
+              // Eventually (in #buildBuilder) members aren't added to the
+              // library if the have 'next' pointers, so don't add them as
+              // additionalExports either. Add the last one only (the one that
+              // will eventually be added to the library).
+              Declaration memberLast = member;
+              while (memberLast.next != null) memberLast = memberLast.next;
+              library.additionalExports.add(memberLast.target.reference);
             }
         }
       }
diff --git a/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
index 9dec3ab..2434d09 100644
--- a/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -8,6 +8,7 @@
     show
         Arguments,
         AsyncMarker,
+        Class,
         Constructor,
         ConstructorInvocation,
         DartType,
@@ -34,9 +35,6 @@
 
 import 'package:kernel/type_algebra.dart' show containsTypeVariable, substitute;
 
-import '../../base/instrumentation.dart'
-    show Instrumentation, InstrumentationValueForType;
-
 import '../loader.dart' show Loader;
 
 import '../messages.dart'
@@ -56,6 +54,9 @@
 
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 
+import '../type_inference/type_inference_engine.dart'
+    show IncludesTypeParametersCovariantly;
+
 import 'kernel_builder.dart'
     show
         ClassBuilder,
@@ -145,15 +146,34 @@
   FunctionNode buildFunction(LibraryBuilder library) {
     assert(function == null);
     FunctionNode result = new FunctionNode(body, asyncMarker: asyncModifier);
+    IncludesTypeParametersCovariantly needsCheckVisitor;
+    if (!isConstructor && !isFactory && parent is ClassBuilder) {
+      Class enclosingClass = parent.target;
+      if (enclosingClass.typeParameters.isNotEmpty) {
+        needsCheckVisitor = new IncludesTypeParametersCovariantly(
+            enclosingClass.typeParameters);
+      }
+    }
     if (typeVariables != null) {
       for (KernelTypeVariableBuilder t in typeVariables) {
-        result.typeParameters.add(t.parameter);
+        TypeParameter parameter = t.parameter;
+        result.typeParameters.add(parameter);
+        if (needsCheckVisitor != null) {
+          if (parameter.bound.accept(needsCheckVisitor)) {
+            parameter.isGenericCovariantImpl = true;
+          }
+        }
       }
       setParents(result.typeParameters, result);
     }
     if (formals != null) {
       for (KernelFormalParameterBuilder formal in formals) {
         VariableDeclaration parameter = formal.build(library, 0);
+        if (needsCheckVisitor != null) {
+          if (parameter.type.accept(needsCheckVisitor)) {
+            parameter.isGenericCovariantImpl = true;
+          }
+        }
         if (formal.isNamed) {
           result.namedParameters.add(parameter);
         } else {
@@ -344,26 +364,6 @@
   Procedure get target => origin.procedure;
 
   @override
-  void instrumentTopLevelInference(Instrumentation instrumentation) {
-    bool isEligibleForTopLevelInference = this.isEligibleForTopLevelInference;
-    if ((isEligibleForTopLevelInference || isSetter) && returnType == null) {
-      instrumentation.record(procedure.fileUri, procedure.fileOffset, 'topType',
-          new InstrumentationValueForType(procedure.function.returnType));
-    }
-    if (isEligibleForTopLevelInference) {
-      if (formals != null) {
-        for (var formal in formals) {
-          if (formal.type == null) {
-            VariableDeclaration formalTarget = formal.target;
-            instrumentation.record(procedure.fileUri, formalTarget.fileOffset,
-                'topType', new InstrumentationValueForType(formalTarget.type));
-          }
-        }
-      }
-    }
-  }
-
-  @override
   int finishPatch() {
     if (!isPatch) return 0;
 
@@ -566,7 +566,7 @@
 
     origin.constructor.isExternal = constructor.isExternal;
     origin.constructor.function = constructor.function;
-    origin.constructor.function.parent = constructor.function;
+    origin.constructor.function.parent = origin.constructor;
     origin.constructor.initializers = constructor.initializers;
     setParents(origin.constructor.initializers, origin.constructor);
     return 1;
diff --git a/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index 56c6840..e91b0a4 100644
--- a/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -35,12 +35,9 @@
 
 import '../fasta_codes.dart'
     show
-        LocatedMessage,
         messageCantDisambiguateAmbiguousInformation,
         messageCantDisambiguateNotEnoughInformation,
         messageNonNullAwareSpreadIsNull,
-        messageSpreadElement,
-        messageSpreadMapElement,
         messageSwitchExpressionNotAssignableCause,
         messageVoidExpression,
         noLength,
@@ -83,7 +80,17 @@
 import 'body_builder.dart' show combineStatements;
 
 import 'collections.dart'
-    show IfElement, SpreadElement, IfMapEntry, SpreadMapEntry;
+    show
+        ControlFlowMapEntry,
+        ForElement,
+        ForInElement,
+        ForInMapEntry,
+        ForMapEntry,
+        IfElement,
+        IfMapEntry,
+        SpreadElement,
+        SpreadMapEntry,
+        convertToElement;
 
 import 'implicit_type_argument.dart' show ImplicitTypeArgument;
 
@@ -301,7 +308,6 @@
         this, _inferenceInfo.gettersAndMethods, _inferenceInfo.builder.library);
     interfaceResolver.finalizeCovariance(
         this, _inferenceInfo.setters, _inferenceInfo.builder.library);
-    interfaceResolver.recordInstrumentation(this);
   }
 
   /// Creates API members for this class.
diff --git a/front_end/lib/src/fasta/kernel/kernel_target.dart b/front_end/lib/src/fasta/kernel/kernel_target.dart
index a766167..4dd4cca 100644
--- a/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -43,9 +43,6 @@
 
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 
-import 'package:kernel/transformations/constants.dart' as constants
-    show transformLibraries;
-
 import '../../api_prototype/file_system.dart' show FileSystem;
 
 import '../compiler_context.dart' show CompilerContext;
@@ -73,7 +70,7 @@
         templateMissingImplementationCause,
         templateSuperclassHasNoDefaultConstructor;
 
-import '../problems.dart' show unhandled, unimplemented;
+import '../problems.dart' show unhandled;
 
 import '../scope.dart' show AmbiguousBuilder;
 
@@ -85,6 +82,8 @@
 
 import '../uri_translator.dart' show UriTranslator;
 
+import 'constant_evaluator.dart' as constants show transformLibraries;
+
 import 'kernel_builder.dart'
     show
         ClassBuilder,
@@ -137,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>[];
@@ -156,8 +158,9 @@
       new SourceLoader(fileSystem, includeComments, this);
 
   void addSourceInformation(
-      Uri uri, List<int> lineStarts, List<int> sourceCode) {
-    uriToSource[uri] = new Source(lineStarts, sourceCode);
+      Uri importUri, Uri fileUri, List<int> lineStarts, List<int> sourceCode) {
+    uriToSource[fileUri] =
+        new Source(lineStarts, sourceCode, importUri, fileUri);
   }
 
   /// Return list of same size as input with possibly translated uris.
@@ -329,8 +332,10 @@
 
     Map<Uri, Source> uriToSource = new Map<Uri, Source>();
     void copySource(Uri uri, Source source) {
-      uriToSource[uri] =
-          excludeSource ? new Source(source.lineStarts, const <int>[]) : source;
+      uriToSource[uri] = excludeSource
+          ? new Source(source.lineStarts, const <int>[], source.importUri,
+              source.fileUri)
+          : source;
     }
 
     this.uriToSource.forEach(copySource);
@@ -559,6 +564,10 @@
     for (String platformLibrary in const [
       "dart:_internal",
       "dart:async",
+      // TODO(askesc): When all backends support set literals, we no longer
+      // need to index dart:collection, as it is only needed for desugaring of
+      // const sets. We can remove it from this list at that time.
+      "dart:collection",
       "dart:core",
       "dart:mirrors"
     ]) {
@@ -642,10 +651,14 @@
           superTarget ??= defaultSuperConstructor(cls);
           Initializer initializer;
           if (superTarget == null) {
+            int offset = constructor.fileOffset;
+            if (offset == -1 && constructor.isSynthetic) {
+              offset = cls.fileOffset;
+            }
             builder.addProblem(
                 templateSuperclassHasNoDefaultConstructor
                     .withArguments(cls.superclass.name),
-                constructor.fileOffset,
+                offset,
                 noLength);
             initializer = new InvalidInitializer();
           } else {
@@ -709,11 +722,21 @@
         field.initializer = new NullLiteral()..parent = field;
         if (field.isFinal &&
             (cls.constructors.isNotEmpty || cls.isMixinDeclaration)) {
-          builder.library.addProblem(
-              templateFinalFieldNotInitialized.withArguments(field.name.name),
-              field.fileOffset,
-              field.name.name.length,
-              field.fileUri);
+          String uri = '${field.enclosingLibrary.importUri}';
+          String file = field.fileUri.pathSegments.last;
+          if (uri == 'dart:html' ||
+              uri == 'dart:svg' ||
+              uri == 'dart:_native_typed_data' ||
+              uri == 'dart:_interceptors' && file == 'js_string.dart') {
+            // TODO(johnniwinther): Use external getters instead of final
+            // fields. See https://github.com/dart-lang/sdk/issues/33762
+          } else {
+            builder.library.addProblem(
+                templateFinalFieldNotInitialized.withArguments(field.name.name),
+                field.fileOffset,
+                field.name.name.length,
+                field.fileUri);
+          }
         }
       }
     }
@@ -759,8 +782,10 @@
           backendTarget.constantsBackend(loader.coreTypes),
           environmentDefines,
           environment,
-          new KernelConstantErrorReporter(loader, environment),
-          enableAsserts: enableAsserts);
+          new KernelConstantErrorReporter(loader),
+          enableAsserts: enableAsserts,
+          desugarSets: !backendTarget.supportsSetLiterals,
+          errorOnUnevaluatedConstant: errorOnUnevaluatedConstant);
       ticker.logMs("Evaluated constants");
     }
     backendTarget.performModularTransformationsOnLibraries(
@@ -773,10 +798,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/front_end/lib/src/fasta/kernel/transform_collections.dart b/front_end/lib/src/fasta/kernel/transform_collections.dart
index 1afd831..bbc7186 100644
--- a/front_end/lib/src/fasta/kernel/transform_collections.dart
+++ b/front_end/lib/src/fasta/kernel/transform_collections.dart
@@ -9,6 +9,7 @@
 import 'package:kernel/ast.dart'
     show
         Arguments,
+        AsExpression,
         Block,
         BlockExpression,
         Class,
@@ -18,9 +19,9 @@
         ExpressionStatement,
         Field,
         ForInStatement,
+        ForStatement,
         IfStatement,
         InterfaceType,
-        InvalidExpression,
         ListLiteral,
         MapEntry,
         MapLiteral,
@@ -33,15 +34,29 @@
         SetLiteral,
         Statement,
         StaticInvocation,
+        transformList,
         TreeNode,
         VariableDeclaration,
         VariableGet;
 
 import 'package:kernel/core_types.dart' show CoreTypes;
 
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
+
 import 'package:kernel/visitor.dart' show Transformer;
 
-import 'collections.dart' show SpreadElement, SpreadMapEntry;
+import 'collections.dart'
+    show
+        ControlFlowElement,
+        ControlFlowMapEntry,
+        ForElement,
+        ForInElement,
+        ForInMapEntry,
+        ForMapEntry,
+        IfElement,
+        IfMapEntry,
+        SpreadElement,
+        SpreadMapEntry;
 
 import '../source/source_loader.dart' show SourceLoader;
 
@@ -49,6 +64,7 @@
 
 class CollectionTransformer extends Transformer {
   final CoreTypes coreTypes;
+  final TypeEnvironment typeEnvironment;
   final Procedure listAdd;
   final Procedure setFactory;
   final Procedure setAdd;
@@ -67,6 +83,7 @@
 
   CollectionTransformer(SourceLoader loader)
       : coreTypes = loader.coreTypes,
+        typeEnvironment = loader.typeInferenceEngine.typeSchemaEnvironment,
         listAdd = loader.coreTypes.index.getMember('dart:core', 'List', 'add'),
         setFactory = _findSetFactory(loader.coreTypes),
         setAdd = loader.coreTypes.index.getMember('dart:core', 'Set', 'add'),
@@ -84,33 +101,17 @@
 
   TreeNode _translateListOrSet(
       Expression node, DartType elementType, List<Expression> elements,
-      {bool isSet: false, bool isConst: false}) {
-    // Translate elements in place up to the first spread if any.
+      {bool isSet: false}) {
+    // Translate elements in place up to the first non-expression, if any.
     int i = 0;
     for (; i < elements.length; ++i) {
-      if (elements[i] is SpreadElement) break;
+      if (elements[i] is ControlFlowElement) break;
       elements[i] = elements[i].accept(this)..parent = node;
     }
 
-    // If there was no spread, we are done.
+    // If there were only expressions, we are done.
     if (i == elements.length) return node;
 
-    if (isConst) {
-      // We don't desugar const lists here.  Remove spread for now so that they
-      // don't leak out.
-      for (; i < elements.length; ++i) {
-        Expression element = elements[i];
-        if (element is SpreadElement) {
-          elements[i] = InvalidExpression('unimplemented spread element')
-            ..fileOffset = element.fileOffset
-            ..parent = node;
-        } else {
-          elements[i] = element.accept(this)..parent = node;
-        }
-      }
-      return node;
-    }
-
     // Build a block expression and create an empty list or set.
     VariableDeclaration result;
     if (isSet) {
@@ -128,165 +129,354 @@
           isFinal: true);
     }
     List<Statement> body = [result];
-    // Add the elements up to the first spread.
+    // Add the elements up to the first non-expression.
     for (int j = 0; j < i; ++j) {
-      body.add(new ExpressionStatement(new MethodInvocation(
-          new VariableGet(result),
-          new Name('add'),
-          new Arguments([elements[j]]),
-          isSet ? setAdd : listAdd)));
+      _addExpressionElement(elements[j], isSet, result, body);
     }
-    // Translate the elements starting with the first spread.
+    // Translate the elements starting with the first non-expression.
     for (; i < elements.length; ++i) {
-      Expression element = elements[i];
-      if (element is SpreadElement) {
-        Expression value = element.expression.accept(this);
-        // Null-aware spreads require testing the subexpression's value.
-        VariableDeclaration temp;
-        if (element.isNullAware) {
-          temp = new VariableDeclaration.forValue(value,
-              type: const DynamicType(), isFinal: true);
-          body.add(temp);
-          value = new VariableGet(temp);
-        }
-
-        VariableDeclaration elt =
-            new VariableDeclaration(null, type: elementType, isFinal: true);
-        Statement statement = new ForInStatement(
-            elt,
-            value,
-            new ExpressionStatement(new MethodInvocation(
-                new VariableGet(result),
-                new Name('add'),
-                new Arguments([new VariableGet(elt)]),
-                isSet ? setAdd : listAdd)));
-
-        if (element.isNullAware) {
-          statement = new IfStatement(
-              new Not(new MethodInvocation(
-                  new VariableGet(temp),
-                  new Name('=='),
-                  new Arguments([new NullLiteral()]),
-                  objectEquals)),
-              statement,
-              null);
-        }
-        body.add(statement);
-      } else {
-        body.add(new ExpressionStatement(new MethodInvocation(
-            new VariableGet(result),
-            new Name('add'),
-            new Arguments([element.accept(this)]),
-            isSet ? setAdd : listAdd)));
-      }
+      _translateElement(elements[i], elementType, isSet, result, body);
     }
 
     return new BlockExpression(new Block(body), new VariableGet(result));
   }
 
+  void _translateElement(Expression element, DartType elementType, bool isSet,
+      VariableDeclaration result, List<Statement> body) {
+    if (element is SpreadElement) {
+      _translateSpreadElement(element, elementType, isSet, result, body);
+    } else if (element is IfElement) {
+      _translateIfElement(element, elementType, isSet, result, body);
+    } else if (element is ForElement) {
+      _translateForElement(element, elementType, isSet, result, body);
+    } else if (element is ForInElement) {
+      _translateForInElement(element, elementType, isSet, result, body);
+    } else {
+      _addExpressionElement(element.accept(this), isSet, result, body);
+    }
+  }
+
+  void _addExpressionElement(Expression element, bool isSet,
+      VariableDeclaration result, List<Statement> body) {
+    body.add(new ExpressionStatement(new MethodInvocation(
+        new VariableGet(result),
+        new Name('add'),
+        new Arguments([element]),
+        isSet ? setAdd : listAdd)));
+  }
+
+  void _translateIfElement(IfElement element, DartType elementType, bool isSet,
+      VariableDeclaration result, List<Statement> body) {
+    List<Statement> thenStatements = [];
+    _translateElement(element.then, elementType, isSet, result, thenStatements);
+    List<Statement> elseStatements;
+    if (element.otherwise != null) {
+      _translateElement(element.otherwise, elementType, isSet, result,
+          elseStatements = <Statement>[]);
+    }
+    Statement thenBody = thenStatements.length == 1
+        ? thenStatements.first
+        : new Block(thenStatements);
+    Statement elseBody;
+    if (elseStatements != null && elseStatements.isNotEmpty) {
+      elseBody = elseStatements.length == 1
+          ? elseStatements.first
+          : new Block(elseStatements);
+    }
+    body.add(new IfStatement(element.condition.accept(this), thenBody, elseBody)
+      ..fileOffset = element.fileOffset);
+  }
+
+  void _translateForElement(ForElement element, DartType elementType,
+      bool isSet, VariableDeclaration result, List<Statement> body) {
+    List<Statement> statements = <Statement>[];
+    _translateElement(element.body, elementType, isSet, result, statements);
+    Statement loopBody =
+        statements.length == 1 ? statements.first : new Block(statements);
+    ForStatement loop = new ForStatement(element.variables,
+        element.condition?.accept(this), element.updates, loopBody)
+      ..fileOffset = element.fileOffset;
+    transformList(loop.variables, this, loop);
+    transformList(loop.updates, this, loop);
+    body.add(loop);
+  }
+
+  void _translateForInElement(ForInElement element, DartType elementType,
+      bool isSet, VariableDeclaration result, List<Statement> body) {
+    List<Statement> statements;
+    Statement prologue = element.prologue;
+    if (prologue == null) {
+      statements = <Statement>[];
+    } else {
+      prologue = prologue.accept(this);
+      statements =
+          prologue is Block ? prologue.statements : <Statement>[prologue];
+    }
+    _translateElement(element.body, elementType, isSet, result, statements);
+    Statement loopBody =
+        statements.length == 1 ? statements.first : new Block(statements);
+    if (element.problem != null) {
+      body.add(new ExpressionStatement(element.problem.accept(this)));
+    }
+    body.add(new ForInStatement(
+        element.variable, element.iterable.accept(this), loopBody,
+        isAsync: element.isAsync)
+      ..fileOffset = element.fileOffset);
+  }
+
+  void _translateSpreadElement(SpreadElement element, DartType elementType,
+      bool isSet, VariableDeclaration result, List<Statement> body) {
+    Expression value = element.expression.accept(this);
+    // Null-aware spreads require testing the subexpression's value.
+    VariableDeclaration temp;
+    if (element.isNullAware) {
+      temp = new VariableDeclaration.forValue(value,
+          type: const DynamicType(), isFinal: true);
+      body.add(temp);
+      value = new VariableGet(temp);
+    }
+
+    VariableDeclaration elt;
+    Statement loopBody;
+    if (element.elementType == null ||
+        !typeEnvironment.isSubtypeOf(element.elementType, elementType)) {
+      elt = new VariableDeclaration(null,
+          type: const DynamicType(), isFinal: true);
+      VariableDeclaration castedVar = new VariableDeclaration.forValue(
+          new AsExpression(new VariableGet(elt), elementType)
+            ..isTypeError = true
+            ..fileOffset = element.expression.fileOffset,
+          type: elementType);
+      loopBody = new Block(<Statement>[
+        castedVar,
+        new ExpressionStatement(new MethodInvocation(
+            new VariableGet(result),
+            new Name('add'),
+            new Arguments([new VariableGet(castedVar)]),
+            isSet ? setAdd : listAdd))
+      ]);
+    } else {
+      elt = new VariableDeclaration(null, type: elementType, isFinal: true);
+      loopBody = new ExpressionStatement(new MethodInvocation(
+          new VariableGet(result),
+          new Name('add'),
+          new Arguments([new VariableGet(elt)]),
+          isSet ? setAdd : listAdd));
+    }
+    Statement statement = new ForInStatement(elt, value, loopBody);
+
+    if (element.isNullAware) {
+      statement = new IfStatement(
+          new Not(new MethodInvocation(new VariableGet(temp), new Name('=='),
+              new Arguments([new NullLiteral()]), objectEquals)),
+          statement,
+          null);
+    }
+    body.add(statement);
+  }
+
   @override
   TreeNode visitListLiteral(ListLiteral node) {
+    // Const collections are handled by the constant evaluator.
+    if (node.isConst) return node;
+
     return _translateListOrSet(node, node.typeArgument, node.expressions,
-        isConst: node.isConst, isSet: false);
+        isSet: false);
   }
 
   @override
   TreeNode visitSetLiteral(SetLiteral node) {
+    // Const collections are handled by the constant evaluator.
+    if (node.isConst) return node;
+
     return _translateListOrSet(node, node.typeArgument, node.expressions,
-        isConst: node.isConst, isSet: true);
+        isSet: true);
   }
 
   @override
   TreeNode visitMapLiteral(MapLiteral node) {
+    // Const collections are handled by the constant evaluator.
+    if (node.isConst) return node;
+
+    // Translate entries in place up to the first control-flow entry, if any.
     int i = 0;
     for (; i < node.entries.length; ++i) {
-      if (node.entries[i] is SpreadMapEntry) break;
+      if (node.entries[i] is ControlFlowMapEntry) break;
       node.entries[i] = node.entries[i].accept(this)..parent = node;
     }
 
+    // If there were no control-flow entries we are done.
     if (i == node.entries.length) return node;
 
-    if (node.isConst) {
-      // We don't desugar const maps here.  REmove spread for now so that they
-      // don't leak out.
-      for (; i < node.entries.length; ++i) {
-        MapEntry entry = node.entries[i];
-        if (entry is SpreadMapEntry) {
-          entry.parent.replaceChild(
-              entry,
-              new MapEntry(
-                  InvalidExpression('unimplemented spread element')
-                    ..fileOffset = entry.fileOffset,
-                  new NullLiteral()));
-        }
-      }
-    }
-
-    VariableDeclaration map = new VariableDeclaration.forValue(
+    // Build a block expression and create an empty map.
+    VariableDeclaration result = new VariableDeclaration.forValue(
         new MapLiteral([], keyType: node.keyType, valueType: node.valueType),
         type: new InterfaceType(
             coreTypes.mapClass, [node.keyType, node.valueType]),
         isFinal: true);
-    List<Statement> body = [map];
+    List<Statement> body = [result];
+    // Add all the entries up to the first control-flow entry.
     for (int j = 0; j < i; ++j) {
-      body.add(new ExpressionStatement(new MethodInvocation(
-          new VariableGet(map),
-          new Name('[]='),
-          new Arguments([node.entries[j].key, node.entries[j].value]),
-          mapPut)));
+      _addNormalEntry(node.entries[j], result, body);
     }
-    DartType mapEntryType =
-        new InterfaceType(mapEntryClass, [node.keyType, node.valueType]);
     for (; i < node.entries.length; ++i) {
-      MapEntry entry = node.entries[i];
-      if (entry is SpreadMapEntry) {
-        Expression value = entry.expression.accept(this);
-        // Null-aware spreads require testing the subexpression's value.
-        VariableDeclaration temp;
-        if (entry.isNullAware) {
-          temp = new VariableDeclaration.forValue(value,
-              type: coreTypes.mapClass.rawType);
-          body.add(temp);
-          value = new VariableGet(temp);
-        }
-
-        VariableDeclaration elt =
-            new VariableDeclaration(null, type: mapEntryType, isFinal: true);
-        Statement statement = new ForInStatement(
-            elt,
-            new PropertyGet(value, new Name('entries'), mapEntries),
-            new ExpressionStatement(new MethodInvocation(
-                new VariableGet(map),
-                new Name('[]='),
-                new Arguments([
-                  new PropertyGet(
-                      new VariableGet(elt), new Name('key'), mapEntryKey),
-                  new PropertyGet(
-                      new VariableGet(elt), new Name('value'), mapEntryValue)
-                ]),
-                mapPut)));
-
-        if (entry.isNullAware) {
-          statement = new IfStatement(
-              new Not(new MethodInvocation(
-                  new VariableGet(temp),
-                  new Name('=='),
-                  new Arguments([new NullLiteral()]),
-                  objectEquals)),
-              statement,
-              null);
-        }
-        body.add(statement);
-      } else {
-        entry = entry.accept(this);
-        body.add(new ExpressionStatement(new MethodInvocation(
-            new VariableGet(map),
-            new Name('[]='),
-            new Arguments([entry.key, entry.value]),
-            mapPut)));
-      }
+      _translateEntry(
+          node.entries[i], node.keyType, node.valueType, result, body);
     }
 
-    return new BlockExpression(new Block(body), new VariableGet(map));
+    return new BlockExpression(new Block(body), new VariableGet(result));
+  }
+
+  void _translateEntry(MapEntry entry, DartType keyType, DartType valueType,
+      VariableDeclaration result, List<Statement> body) {
+    if (entry is SpreadMapEntry) {
+      _translateSpreadEntry(entry, keyType, valueType, result, body);
+    } else if (entry is IfMapEntry) {
+      _translateIfEntry(entry, keyType, valueType, result, body);
+    } else if (entry is ForMapEntry) {
+      _translateForEntry(entry, keyType, valueType, result, body);
+    } else if (entry is ForInMapEntry) {
+      _translateForInEntry(entry, keyType, valueType, result, body);
+    } else {
+      _addNormalEntry(entry.accept(this), result, body);
+    }
+  }
+
+  void _addNormalEntry(
+      MapEntry entry, VariableDeclaration result, List<Statement> body) {
+    body.add(new ExpressionStatement(new MethodInvocation(
+        new VariableGet(result),
+        new Name('[]='),
+        new Arguments([entry.key, entry.value]),
+        mapPut)));
+  }
+
+  void _translateIfEntry(IfMapEntry entry, DartType keyType, DartType valueType,
+      VariableDeclaration result, List<Statement> body) {
+    List<Statement> thenBody = [];
+    _translateEntry(entry.then, keyType, valueType, result, thenBody);
+    List<Statement> elseBody;
+    if (entry.otherwise != null) {
+      _translateEntry(entry.otherwise, keyType, valueType, result,
+          elseBody = <Statement>[]);
+    }
+    Statement thenStatement =
+        thenBody.length == 1 ? thenBody.first : new Block(thenBody);
+    Statement elseStatement;
+    if (elseBody != null && elseBody.isNotEmpty) {
+      elseStatement =
+          elseBody.length == 1 ? elseBody.first : new Block(elseBody);
+    }
+    body.add(new IfStatement(
+        entry.condition.accept(this), thenStatement, elseStatement));
+  }
+
+  void _translateForEntry(ForMapEntry entry, DartType keyType,
+      DartType valueType, VariableDeclaration result, List<Statement> body) {
+    List<Statement> statements = <Statement>[];
+    _translateEntry(entry.body, keyType, valueType, result, statements);
+    Statement loopBody =
+        statements.length == 1 ? statements.first : new Block(statements);
+    ForStatement loop = new ForStatement(
+        entry.variables, entry.condition?.accept(this), entry.updates, loopBody)
+      ..fileOffset = entry.fileOffset;
+    transformList(loop.variables, this, loop);
+    transformList(loop.updates, this, loop);
+    body.add(loop);
+  }
+
+  void _translateForInEntry(ForInMapEntry entry, DartType keyType,
+      DartType valueType, VariableDeclaration result, List<Statement> body) {
+    List<Statement> statements;
+    Statement prologue = entry.prologue;
+    if (prologue == null) {
+      statements = <Statement>[];
+    } else {
+      prologue = prologue.accept(this);
+      statements =
+          prologue is Block ? prologue.statements : <Statement>[prologue];
+    }
+    _translateEntry(entry.body, keyType, valueType, result, statements);
+    Statement loopBody =
+        statements.length == 1 ? statements.first : new Block(statements);
+    if (entry.problem != null) {
+      body.add(new ExpressionStatement(entry.problem.accept(this)));
+    }
+    body.add(new ForInStatement(
+        entry.variable, entry.iterable.accept(this), loopBody,
+        isAsync: entry.isAsync)
+      ..fileOffset = entry.fileOffset);
+  }
+
+  void _translateSpreadEntry(SpreadMapEntry entry, DartType keyType,
+      DartType valueType, VariableDeclaration result, List<Statement> body) {
+    Expression value = entry.expression.accept(this);
+    // Null-aware spreads require testing the subexpression's value.
+    VariableDeclaration temp;
+    if (entry.isNullAware) {
+      temp = new VariableDeclaration.forValue(value,
+          type: coreTypes.mapClass.rawType);
+      body.add(temp);
+      value = new VariableGet(temp);
+    }
+
+    DartType entryType =
+        new InterfaceType(mapEntryClass, <DartType>[keyType, valueType]);
+    VariableDeclaration elt;
+    Statement loopBody;
+    if (entry.entryType == null ||
+        !typeEnvironment.isSubtypeOf(entry.entryType, entryType)) {
+      elt = new VariableDeclaration(null,
+          type: new InterfaceType(mapEntryClass,
+              <DartType>[const DynamicType(), const DynamicType()]),
+          isFinal: true);
+      VariableDeclaration keyVar = new VariableDeclaration.forValue(
+          new AsExpression(
+              new PropertyGet(
+                  new VariableGet(elt), new Name('key'), mapEntryKey),
+              keyType)
+            ..isTypeError = true
+            ..fileOffset = entry.expression.fileOffset,
+          type: keyType);
+      VariableDeclaration valueVar = new VariableDeclaration.forValue(
+          new AsExpression(
+              new PropertyGet(
+                  new VariableGet(elt), new Name('value'), mapEntryValue),
+              valueType)
+            ..isTypeError = true
+            ..fileOffset = entry.expression.fileOffset,
+          type: valueType);
+      loopBody = new Block(<Statement>[
+        keyVar,
+        valueVar,
+        new ExpressionStatement(new MethodInvocation(
+            new VariableGet(result),
+            new Name('[]='),
+            new Arguments([new VariableGet(keyVar), new VariableGet(valueVar)]),
+            mapPut))
+      ]);
+    } else {
+      elt = new VariableDeclaration(null, type: entryType, isFinal: true);
+      loopBody = new ExpressionStatement(new MethodInvocation(
+          new VariableGet(result),
+          new Name('[]='),
+          new Arguments([
+            new PropertyGet(new VariableGet(elt), new Name('key'), mapEntryKey),
+            new PropertyGet(
+                new VariableGet(elt), new Name('value'), mapEntryValue)
+          ]),
+          mapPut));
+    }
+    Statement statement = new ForInStatement(
+        elt, new PropertyGet(value, new Name('entries'), mapEntries), loopBody);
+
+    if (entry.isNullAware) {
+      statement = new IfStatement(
+          new Not(new MethodInvocation(new VariableGet(temp), new Name('=='),
+              new Arguments([new NullLiteral()]), objectEquals)),
+          statement,
+          null);
+    }
+    body.add(statement);
   }
 }
diff --git a/front_end/lib/src/fasta/kernel/transform_set_literals.dart b/front_end/lib/src/fasta/kernel/transform_set_literals.dart
index abc2f4d..3480b2b 100644
--- a/front_end/lib/src/fasta/kernel/transform_set_literals.dart
+++ b/front_end/lib/src/fasta/kernel/transform_set_literals.dart
@@ -44,6 +44,7 @@
   final Procedure setFactory;
   final Procedure addMethod;
   final Constructor unmodifiableSetConstructor;
+  final bool transformConst;
 
   static Procedure _findSetFactory(CoreTypes coreTypes) {
     Procedure factory = coreTypes.index.getMember('dart:core', 'Set', '');
@@ -76,7 +77,7 @@
     return null;
   }
 
-  SetLiteralTransformer(SourceLoader loader)
+  SetLiteralTransformer(SourceLoader loader, {this.transformConst: true})
       : coreTypes = loader.coreTypes,
         nullType = new InterfaceType(loader.coreTypes.nullClass, []),
         setFactory = _findSetFactory(loader.coreTypes),
@@ -85,6 +86,7 @@
 
   TreeNode visitSetLiteral(SetLiteral node) {
     if (node.isConst) {
+      if (!transformConst) return node;
       List<MapEntry> entries = new List<MapEntry>(node.expressions.length);
       for (int i = 0; i < node.expressions.length; i++) {
         // expression_i: null
diff --git a/front_end/lib/src/fasta/kernel/type_labeler.dart b/front_end/lib/src/fasta/kernel/type_labeler.dart
index 43815bf..7b329bf 100644
--- a/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -20,6 +20,7 @@
         InstanceConstant,
         IntConstant,
         InterfaceType,
+        Library,
         ListConstant,
         MapConstant,
         NullConstant,
@@ -29,6 +30,7 @@
         StringConstant,
         SymbolConstant,
         TearOffConstant,
+        TreeNode,
         TypedefType,
         TypeLiteralConstant,
         TypeParameter,
@@ -50,9 +52,8 @@
 /// distinguish different types with the same name. This is used in diagnostic
 /// messages to indicate the origins of types occurring in the message.
 class TypeLabeler implements DartTypeVisitor<void>, ConstantVisitor<void> {
-  List<LabeledClassName> names = <LabeledClassName>[];
-  Map<String, List<LabeledClassName>> nameMap =
-      <String, List<LabeledClassName>>{};
+  List<LabeledNode> names = <LabeledNode>[];
+  Map<String, List<LabeledNode>> nameMap = <String, List<LabeledNode>>{};
 
   List<Object> result;
 
@@ -84,7 +85,7 @@
   /// types and constants that have been pretty-printed using this labeler.
   String get originMessages {
     StringBuffer messages = new StringBuffer();
-    for (LabeledClassName name in names) {
+    for (LabeledNode name in names) {
       messages.write(name.originMessage);
     }
     return messages.toString();
@@ -99,25 +100,28 @@
     return false;
   }
 
-  LabeledClassName nameForClass(Class classNode) {
-    List<LabeledClassName> classesForName = nameMap[classNode.name];
-    if (classesForName == null) {
-      // First encountered class with this name
-      LabeledClassName name = new LabeledClassName(classNode, this);
+  LabeledNode nameForEntity(
+      TreeNode node, String nodeName, Uri importUri, Uri fileUri) {
+    List<LabeledNode> labelsForName = nameMap[nodeName];
+    if (labelsForName == null) {
+      // First encountered entity with this name
+      LabeledNode name =
+          new LabeledNode(node, nodeName, importUri, fileUri, this);
       names.add(name);
-      nameMap[classNode.name] = [name];
+      nameMap[nodeName] = [name];
       return name;
     } else {
-      for (LabeledClassName classForName in classesForName) {
-        if (classForName.classNode == classNode) {
-          // Previously encountered class
-          return classForName;
+      for (LabeledNode entityForName in labelsForName) {
+        if (entityForName.node == node) {
+          // Previously encountered entity
+          return entityForName;
         }
       }
-      // New class with name that was previously encountered
-      LabeledClassName name = new LabeledClassName(classNode, this);
+      // New entity with name that was previously encountered
+      LabeledNode name =
+          new LabeledNode(node, nodeName, importUri, fileUri, this);
       names.add(name);
-      classesForName.add(name);
+      labelsForName.add(name);
       return name;
     }
   }
@@ -144,7 +148,19 @@
   }
 
   void visitTypeParameterType(TypeParameterType node) {
-    result.add(node.parameter.name);
+    TreeNode parent = node.parameter;
+    while (parent is! Library && parent != null) {
+      parent = parent.parent;
+    }
+    // Note that this can be null if, for instance, the errornious code is not
+    // actually in the tree - then we don't know where it comes from!
+    Library enclosingLibrary = parent;
+
+    result.add(nameForEntity(
+        node.parameter,
+        node.parameter.name,
+        enclosingLibrary == null ? unknownUri : enclosingLibrary.importUri,
+        enclosingLibrary == null ? unknownUri : enclosingLibrary.fileUri));
   }
 
   void visitFunctionType(FunctionType node) {
@@ -201,7 +217,12 @@
   }
 
   void visitInterfaceType(InterfaceType node) {
-    result.add(nameForClass(node.classNode));
+    Class classNode = node.classNode;
+    result.add(nameForEntity(
+        classNode,
+        classNode.name,
+        classNode.enclosingLibrary.importUri,
+        classNode.enclosingLibrary.fileUri));
     if (node.typeArguments.isNotEmpty) {
       result.add("<");
       bool first = true;
@@ -301,7 +322,11 @@
     Procedure procedure = node.procedure;
     Class classNode = procedure.enclosingClass;
     if (classNode != null) {
-      result.add(nameForClass(classNode));
+      result.add(nameForEntity(
+          classNode,
+          classNode.name,
+          classNode.enclosingLibrary.importUri,
+          classNode.enclosingLibrary.fileUri));
       result.add(".");
     }
     result.add(procedure.name.name);
@@ -330,34 +355,44 @@
   }
 }
 
-class LabeledClassName {
-  Class classNode;
-  TypeLabeler typeLabeler;
+final Uri unknownUri = Uri.parse("unknown");
 
-  LabeledClassName(this.classNode, this.typeLabeler);
+class LabeledNode {
+  final TreeNode node;
+  final TypeLabeler typeLabeler;
+  final String name;
+  final Uri importUri;
+  final Uri fileUri;
+
+  LabeledNode(
+      this.node, this.name, this.importUri, this.fileUri, this.typeLabeler);
 
   String toString() {
-    String name = classNode.name;
-    List<LabeledClassName> classesForName = typeLabeler.nameMap[name];
-    if (classesForName.length == 1) {
+    List<LabeledNode> entityForName = typeLabeler.nameMap[name];
+    if (entityForName.length == 1) {
       return name;
     }
-    return "$name/*${classesForName.indexOf(this) + 1}*/";
+    return "$name/*${entityForName.indexOf(this) + 1}*/";
   }
 
   String get originMessage {
-    Uri importUri = classNode.enclosingLibrary.importUri;
     if (importUri.scheme == 'dart' && importUri.path == 'core') {
-      String name = classNode.name;
-      if (blacklistedCoreClasses.contains(name)) {
+      if (node is Class && blacklistedCoreClasses.contains(name)) {
         // Blacklisted core class. Only print if ambiguous.
-        List<LabeledClassName> classesForName = typeLabeler.nameMap[name];
-        if (classesForName.length == 1) {
+        List<LabeledNode> entityForName = typeLabeler.nameMap[name];
+        if (entityForName.length == 1) {
           return "";
         }
       }
     }
-    Uri fileUri = classNode.enclosingLibrary.fileUri;
+    if (importUri == unknownUri || node is! Class) {
+      // We don't know where it comes from and/or it's not a class.
+      // Only print if ambiguous.
+      List<LabeledNode> entityForName = typeLabeler.nameMap[name];
+      if (entityForName.length == 1) {
+        return "";
+      }
+    }
     Message message = (importUri == fileUri || importUri.scheme == 'dart')
         ? templateTypeOrigin.withArguments(toString(), importUri)
         : templateTypeOriginWithFileUri.withArguments(
diff --git a/front_end/lib/src/fasta/kernel/utils.dart b/front_end/lib/src/fasta/kernel/utils.dart
index ac98334..1b96164 100644
--- a/front_end/lib/src/fasta/kernel/utils.dart
+++ b/front_end/lib/src/fasta/kernel/utils.dart
@@ -60,12 +60,12 @@
 
 /// Serialize the libraries in [component] that match [filter].
 List<int> serializeComponent(Component component,
-    {bool filter(Library library), bool excludeUriToSource: false}) {
+    {bool filter(Library library), bool includeSources: true}) {
   ByteSink byteSink = new ByteSink();
-  BinaryPrinter printer = filter == null && !excludeUriToSource
-      ? new BinaryPrinter(byteSink)
+  BinaryPrinter printer = filter == null
+      ? new BinaryPrinter(byteSink, includeSources: includeSources)
       : new LimitedBinaryPrinter(
-          byteSink, filter ?? (_) => true, excludeUriToSource);
+          byteSink, filter ?? (_) => true, !includeSources);
   printer.writeComponentFile(component);
   return byteSink.builder.takeBytes();
 }
diff --git a/front_end/lib/src/fasta/kernel/verifier.dart b/front_end/lib/src/fasta/kernel/verifier.dart
index 67ce675..26d6421 100644
--- a/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/front_end/lib/src/fasta/kernel/verifier.dart
@@ -11,7 +11,6 @@
         Component,
         ExpressionStatement,
         Field,
-        InvalidInitializer,
         Let,
         Library,
         Member,
@@ -175,11 +174,6 @@
   }
 
   @override
-  visitInvalidInitializer(InvalidInitializer node) {
-    problem(node, "Invalid initializer.");
-  }
-
-  @override
   visitUnknownType(UnknownType node) {
     // Note: we can't pass [node] to [problem] because it's not a [TreeNode].
     problem(null, "Unexpected appearance of the unknown type.");
diff --git a/front_end/lib/src/fasta/loader.dart b/front_end/lib/src/fasta/loader.dart
index da5a124..67b5cb2 100644
--- a/front_end/lib/src/fasta/loader.dart
+++ b/front_end/lib/src/fasta/loader.dart
@@ -170,6 +170,10 @@
   void ensureCoreLibrary() {
     if (coreLibrary == null) {
       read(Uri.parse("dart:core"), 0, accessor: first);
+      // TODO(askesc): When all backends support set literals, we no longer
+      // need to index dart:collection, as it is only needed for desugaring of
+      // const sets. We can remove it from this list at that time.
+      read(Uri.parse("dart:collection"), 0, accessor: first);
       assert(coreLibrary != null);
     }
   }
@@ -275,8 +279,6 @@
     target.context.report(
         message.withLocation(fileUri, charOffset, length), severity,
         context: context);
-    recordMessage(severity, message, charOffset, length, fileUri,
-        context: context);
     if (severity == Severity.error) {
       (wasHandled ? handledErrors : unhandledErrors)
           .add(message.withLocation(fileUri, charOffset, length));
@@ -301,10 +303,6 @@
 
   Declaration getNativeAnnotation() => target.getNativeAnnotation(this);
 
-  void recordMessage(Severity severity, Message message, int charOffset,
-      int length, Uri fileUri,
-      {List<LocatedMessage> context}) {}
-
   ClassBuilder<TypeBuilder, Object> computeClassBuilderFromTargetClass(
       covariant Object cls);
 
diff --git a/front_end/lib/src/fasta/names.dart b/front_end/lib/src/fasta/names.dart
index ab5b774..421d4be 100644
--- a/front_end/lib/src/fasta/names.dart
+++ b/front_end/lib/src/fasta/names.dart
@@ -60,6 +60,8 @@
 
 final Name rightShiftName = new Name(">>");
 
+final Name tripleShiftName = new Name(">>>");
+
 final Name tildeName = new Name("~");
 
 final Name unaryMinusName = new Name("unary-");
diff --git a/front_end/lib/src/fasta/operator.dart b/front_end/lib/src/fasta/operator.dart
index dad4440..1617a5a 100644
--- a/front_end/lib/src/fasta/operator.dart
+++ b/front_end/lib/src/fasta/operator.dart
@@ -25,6 +25,7 @@
   modulo,
   multiply,
   rightShift,
+  tripleShift,
   subtract,
   truncatingDivide,
   unaryMinus,
@@ -48,6 +49,7 @@
   if (identical("%", string)) return Operator.modulo;
   if (identical("*", string)) return Operator.multiply;
   if (identical(">>", string)) return Operator.rightShift;
+  if (identical(">>>", string)) return Operator.tripleShift;
   if (identical("-", string)) return Operator.subtract;
   if (identical("~/", string)) return Operator.truncatingDivide;
   if (identical("unary-", string)) return Operator.unaryMinus;
@@ -90,6 +92,8 @@
       return "*";
     case Operator.rightShift:
       return ">>";
+    case Operator.tripleShift:
+      return ">>>";
     case Operator.subtract:
       return "-";
     case Operator.truncatingDivide:
@@ -121,6 +125,7 @@
     case Operator.modulo:
     case Operator.multiply:
     case Operator.rightShift:
+    case Operator.tripleShift:
     case Operator.subtract:
     case Operator.truncatingDivide:
       return 1;
diff --git a/front_end/lib/src/fasta/parser/forwarding_listener.dart b/front_end/lib/src/fasta/parser/forwarding_listener.dart
index 10f0a20..bb60229 100644
--- a/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -172,10 +172,10 @@
   }
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
-      Token varFinalOrConst) {
+  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
+      Token covariantToken, Token varFinalOrConst) {
     listener?.beginFormalParameter(
-        token, kind, covariantToken, varFinalOrConst);
+        token, kind, requiredToken, covariantToken, varFinalOrConst);
   }
 
   @override
@@ -224,6 +224,11 @@
   }
 
   @override
+  void beginThenControlFlow(Token token) {
+    listener?.beginThenControlFlow(token);
+  }
+
+  @override
   void beginIfStatement(Token token) {
     listener?.beginIfStatement(token);
   }
@@ -407,8 +412,9 @@
   }
 
   @override
-  void beginVariablesDeclaration(Token token, Token varFinalOrConst) {
-    listener?.beginVariablesDeclaration(token, varFinalOrConst);
+  void beginVariablesDeclaration(
+      Token token, Token lateToken, Token varFinalOrConst) {
+    listener?.beginVariablesDeclaration(token, lateToken, varFinalOrConst);
   }
 
   @override
@@ -562,10 +568,10 @@
   }
 
   @override
-  void endFields(Token staticToken, Token covariantToken, Token varFinalOrConst,
-      int count, Token beginToken, Token endToken) {
-    listener?.endFields(staticToken, covariantToken, varFinalOrConst, count,
-        beginToken, endToken);
+  void endFields(Token staticToken, Token covariantToken, Token lateToken,
+      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
+    listener?.endFields(staticToken, covariantToken, lateToken, varFinalOrConst,
+        count, beginToken, endToken);
   }
 
   @override
@@ -841,10 +847,16 @@
   }
 
   @override
-  void endTopLevelFields(Token staticToken, Token covariantToken,
-      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
-    listener?.endTopLevelFields(staticToken, covariantToken, varFinalOrConst,
-        count, beginToken, endToken);
+  void endTopLevelFields(
+      Token staticToken,
+      Token covariantToken,
+      Token lateToken,
+      Token varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    listener?.endTopLevelFields(staticToken, covariantToken, lateToken,
+        varFinalOrConst, count, beginToken, endToken);
   }
 
   @override
@@ -1027,6 +1039,11 @@
   }
 
   @override
+  void handleErrorToken(ErrorToken token) {
+    listener?.handleErrorToken(token);
+  }
+
+  @override
   void handleExpressionFunctionBody(Token arrowToken, Token endToken) {
     listener?.handleExpressionFunctionBody(arrowToken, endToken);
   }
@@ -1456,6 +1473,11 @@
   }
 
   @override
+  void reportNonNullableModifierError(Token modifierToken) {
+    listener?.reportNonNullableModifierError(modifierToken);
+  }
+
+  @override
   set suppressParseErrors(bool value) {
     listener?.suppressParseErrors = value;
   }
diff --git a/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index c59f7ea..0dd6638 100644
--- a/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/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/front_end/lib/src/fasta/parser/listener.dart b/front_end/lib/src/fasta/parser/listener.dart
index 5dc7b63..5239ab9 100644
--- a/front_end/lib/src/fasta/parser/listener.dart
+++ b/front_end/lib/src/fasta/parser/listener.dart
@@ -10,6 +10,8 @@
 
 import '../quote.dart' show UnescapeErrorListener;
 
+import '../scanner/error_token.dart' show ErrorToken;
+
 import 'assert.dart' show Assert;
 
 import 'formal_parameter_kind.dart' show FormalParameterKind;
@@ -270,8 +272,8 @@
     logEvent("FactoryMethod");
   }
 
-  void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
-      Token varFinalOrConst) {}
+  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
+      Token covariantToken, Token varFinalOrConst) {}
 
   void endFormalParameter(Token thisKeyword, Token periodAfterThis,
       Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
@@ -296,8 +298,8 @@
   /// - Variable declarations (count times)
   ///
   /// Doesn't have a corresponding begin event, use [beginMember] instead.
-  void endFields(Token staticToken, Token covariantToken, Token varFinalOrConst,
-      int count, Token beginToken, Token endToken) {
+  void endFields(Token staticToken, Token covariantToken, Token lateToken,
+      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
     logEvent("Fields");
   }
 
@@ -899,8 +901,14 @@
   ///   - Field initializer
   /// Doesn't have a corresponding begin event.
   /// Use [beginTopLevelMember] instead.
-  void endTopLevelFields(Token staticToken, Token covariantToken,
-      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
+  void endTopLevelFields(
+      Token staticToken,
+      Token covariantToken,
+      Token lateToken,
+      Token varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
     logEvent("TopLevelFields");
   }
 
@@ -966,6 +974,17 @@
   }
 
   // TODO(danrubel): Remove this once all listeners have been updated
+  // to properly handle nullable types
+  void reportNonNullableModifierError(Token modifierToken) {
+    if (modifierToken != null) {
+      handleRecoverableError(
+          templateExperimentNotEnabled.withArguments('non-nullable'),
+          modifierToken,
+          modifierToken);
+    }
+  }
+
+  // TODO(danrubel): Remove this once all listeners have been updated
   // to properly handle non-null assert expressions
   void reportNonNullAssertExpressionNotEnabled(Token bang) {
     handleRecoverableError(
@@ -1048,7 +1067,8 @@
   /// Handle the start of a variables declaration.  Substructures:
   /// - Metadata
   /// - Type
-  void beginVariablesDeclaration(Token token, Token varFinalOrConst) {}
+  void beginVariablesDeclaration(
+      Token token, Token lateToken, Token varFinalOrConst) {}
 
   void endVariablesDeclaration(int count, Token endToken) {
     logEvent("VariablesDeclaration");
@@ -1113,9 +1133,15 @@
   /// Called before parsing an `if` control flow list, set, or map entry.
   void beginIfControlFlow(Token ifToken) {}
 
+  /// Called before parsing the `then` portion of an `if` control flow list,
+  /// set, or map entry.
+  void beginThenControlFlow(Token token) {}
+
   /// Called before parsing the `else` portion of an `if` control flow list,
   /// set, or map entry.
-  void handleElseControlFlow(Token elseToken) {}
+  void handleElseControlFlow(Token elseToken) {
+    logEvent("ElseControlFlow");
+  }
 
   /// Called after parsing an `if` control flow list, set, or map entry.
   /// Substructures:
@@ -1371,6 +1397,14 @@
   void handleRecoverableError(
       Message message, Token startToken, Token endToken) {}
 
+  /// The parser encountered an [ErrorToken] representing an error
+  /// from the scanner but recovered from it. By default, the error is reported
+  /// by calling [handleRecoverableError] with the message associated
+  /// with the error [token].
+  void handleErrorToken(ErrorToken token) {
+    handleRecoverableError(token.assertionMessage, token, token);
+  }
+
   @override
   void handleUnescapeError(
       Message message, Token location, int stringOffset, int length) {
diff --git a/front_end/lib/src/fasta/parser/literal_entry_info_impl.dart b/front_end/lib/src/fasta/parser/literal_entry_info_impl.dart
index 1ea0bf7..f5e4b8b 100644
--- a/front_end/lib/src/fasta/parser/literal_entry_info_impl.dart
+++ b/front_end/lib/src/fasta/parser/literal_entry_info_impl.dart
@@ -144,7 +144,9 @@
     final ifToken = token.next;
     assert(optional('if', ifToken));
     parser.listener.beginIfControlFlow(ifToken);
-    return parser.ensureParenthesizedCondition(ifToken);
+    Token result = parser.ensureParenthesizedCondition(ifToken);
+    parser.listener.beginThenControlFlow(result);
+    return result;
   }
 
   @override
diff --git a/front_end/lib/src/fasta/parser/modifier_context.dart b/front_end/lib/src/fasta/parser/modifier_context.dart
index 83d9a8d..0c49fb1 100644
--- a/front_end/lib/src/fasta/parser/modifier_context.dart
+++ b/front_end/lib/src/fasta/parser/modifier_context.dart
@@ -2,8 +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 '../../scanner/token.dart' show Token;
+import '../../scanner/token.dart' show Keyword, Token;
 import '../messages.dart' as fasta;
+import 'formal_parameter_kind.dart';
 import 'member_kind.dart' show MemberKind;
 import 'parser.dart' show Parser;
 import 'util.dart' show optional;
@@ -11,17 +12,20 @@
 bool isModifier(Token token) {
   if (!token.isModifier) {
     return false;
-  }
-  if (token.type.isBuiltIn) {
-    // A built-in identifier can only be a modifier as long as it is
-    // followed by another modifier or an identifier. Otherwise, it is the
+  } else if (token.type.isBuiltIn) {
+    // A built-in keyword can only be a modifier as long as it is
+    // followed by another keyword or an identifier. Otherwise, it is the
     // identifier.
     //
     // For example, `external` is a modifier in this declaration:
     //   external Foo foo();
     // but is the identifier in this declaration
     //   external() => true;
-    if (!token.next.type.isKeyword && !token.next.isIdentifier) {
+    // and in
+    //   for (final external in list) { }
+    Token next = token.next;
+    Keyword keyword = next.keyword;
+    if (keyword == null && !next.isIdentifier || keyword == Keyword.IN) {
       return false;
     }
   }
@@ -37,8 +41,9 @@
   Token covariantToken;
   Token externalToken;
   Token finalToken;
+  Token lateToken;
+  Token requiredToken;
   Token staticToken;
-  Token varFinalOrConst;
   Token varToken;
 
   // Set `true` when parsing modifiers after the `factory` token.
@@ -49,31 +54,65 @@
 
   ModifierRecoveryContext(this.parser);
 
-  /// Parse modifiers for class methods and fields.
-  Token parseClassMemberModifiers(Token token,
-      {Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token varFinalOrConst}) {
-    token = parseModifiers(token,
-        externalToken: externalToken,
-        staticToken: staticToken,
-        covariantToken: covariantToken,
-        varFinalOrConst: varFinalOrConst);
+  set staticOrCovariant(Token staticOrCovariant) {
+    if (staticOrCovariant == null) {
+      covariantToken = null;
+      staticToken = null;
+    } else if (optional('covariant', staticOrCovariant)) {
+      covariantToken = staticOrCovariant;
+      staticToken = null;
+    } else if (optional('static', staticOrCovariant)) {
+      covariantToken = null;
+      staticToken = staticOrCovariant;
+    } else {
+      throw "Internal error: "
+          "Unexpected staticOrCovariant '$staticOrCovariant'.";
+    }
+  }
 
+  Token get varFinalOrConst => varToken ?? finalToken ?? constToken;
+
+  set varFinalOrConst(Token varFinalOrConst) {
+    if (varFinalOrConst == null) {
+      varToken = null;
+      finalToken = null;
+      constToken = null;
+    } else if (optional('var', varFinalOrConst)) {
+      varToken = varFinalOrConst;
+      finalToken = null;
+      constToken = null;
+    } else if (optional('final', varFinalOrConst)) {
+      varToken = null;
+      finalToken = varFinalOrConst;
+      constToken = null;
+    } else if (optional('const', varFinalOrConst)) {
+      varToken = null;
+      finalToken = null;
+      constToken = varFinalOrConst;
+    } else {
+      throw "Internal error: Unexpected varFinalOrConst '$varFinalOrConst'.";
+    }
+  }
+
+  /// Parse modifiers for class methods and fields.
+  Token parseClassMemberModifiers(Token token) {
+    token = parseModifiers(token);
     if (abstractToken != null) {
       parser.reportRecoverableError(
           abstractToken, fasta.messageAbstractClassMember);
     }
+    reportExtraneousModifier(requiredToken);
     return token;
   }
 
   /// Parse modifiers for formal parameters.
-  Token parseFormalParameterModifiers(Token token, MemberKind memberKind,
-      {Token covariantToken, Token varFinalOrConst}) {
-    token = parseModifiers(token,
-        covariantToken: covariantToken, varFinalOrConst: varFinalOrConst);
+  Token parseFormalParameterModifiers(
+      Token token, FormalParameterKind parameterKind, MemberKind memberKind) {
+    token = parseModifiers(token);
 
+    if (parameterKind != FormalParameterKind.optionalNamed) {
+      reportExtraneousModifier(requiredToken);
+    }
     if (memberKind == MemberKind.StaticMethod ||
         memberKind == MemberKind.TopLevelMethod) {
       reportExtraneousModifier(this.covariantToken);
@@ -81,58 +120,49 @@
     }
     if (constToken != null) {
       reportExtraneousModifier(constToken);
-      varFinalOrConst = null;
     } else if (memberKind == MemberKind.GeneralizedFunctionType) {
       if (varFinalOrConst != null) {
         parser.reportRecoverableError(
             varFinalOrConst, fasta.messageFunctionTypedParameterVar);
-        varFinalOrConst = null;
-        finalToken = null;
-        varToken = null;
       }
     }
     reportExtraneousModifier(abstractToken);
     reportExtraneousModifier(externalToken);
+    reportExtraneousModifier(lateToken);
     reportExtraneousModifier(staticToken);
     return token;
   }
 
   /// Parse modifiers after the `factory` token.
-  Token parseModifiersAfterFactory(Token token,
-      {Token externalToken, Token staticOrCovariant, Token varFinalOrConst}) {
+  Token parseModifiersAfterFactory(Token token) {
     afterFactory = true;
-    token = parseModifiers(token,
-        externalToken: externalToken,
-        staticOrCovariant: staticOrCovariant,
-        varFinalOrConst: varFinalOrConst);
-
+    token = parseModifiers(token);
     if (abstractToken != null) {
       parser.reportRecoverableError(
           abstractToken, fasta.messageAbstractClassMember);
     }
+    reportExtraneousModifier(lateToken);
+    reportExtraneousModifier(requiredToken);
     return token;
   }
 
   /// Parse modifiers for top level functions and fields.
-  Token parseTopLevelModifiers(Token token,
-      {Token externalToken, Token varFinalOrConst}) {
-    token = parseModifiers(token,
-        externalToken: externalToken, varFinalOrConst: varFinalOrConst);
-
+  Token parseTopLevelModifiers(Token token) {
+    token = parseModifiers(token);
     reportExtraneousModifier(abstractToken);
     reportExtraneousModifier(covariantToken);
+    reportExtraneousModifier(requiredToken);
     reportExtraneousModifier(staticToken);
     return token;
   }
 
   /// Parse modifiers for variable declarations.
-  Token parseVariableDeclarationModifiers(Token token,
-      {Token varFinalOrConst}) {
-    token = parseModifiers(token, varFinalOrConst: varFinalOrConst);
-
+  Token parseVariableDeclarationModifiers(Token token) {
+    token = parseModifiers(token);
     reportExtraneousModifier(abstractToken);
     reportExtraneousModifier(covariantToken);
     reportExtraneousModifier(externalToken);
+    reportExtraneousModifier(requiredToken);
     reportExtraneousModifier(staticToken);
     return token;
   }
@@ -148,42 +178,7 @@
   /// `static` or `covariant`. The first non-null parameter of
   /// [staticOrCovariant], [staticToken], or [covariantToken] will be used,
   /// in that order, and the others ignored.
-  Token parseModifiers(Token token,
-      {Token externalToken,
-      Token staticToken,
-      Token staticOrCovariant,
-      Token covariantToken,
-      Token varFinalOrConst}) {
-    if (externalToken != null) {
-      this.externalToken = externalToken;
-    }
-    if (staticOrCovariant != null) {
-      if (optional('static', staticOrCovariant)) {
-        this.staticToken = staticOrCovariant;
-      } else if (optional('covariant', staticOrCovariant)) {
-        this.covariantToken = staticOrCovariant;
-      } else {
-        throw "Internal error: "
-            "Unexpected staticOrCovariant '$staticOrCovariant'.";
-      }
-    } else if (staticToken != null) {
-      this.staticToken = staticToken;
-    } else if (covariantToken != null) {
-      this.covariantToken = covariantToken;
-    }
-    if (varFinalOrConst != null) {
-      this.varFinalOrConst = varFinalOrConst;
-      if (optional('var', varFinalOrConst)) {
-        varToken = varFinalOrConst;
-      } else if (optional('final', varFinalOrConst)) {
-        finalToken = varFinalOrConst;
-      } else if (optional('const', varFinalOrConst)) {
-        constToken = varFinalOrConst;
-      } else {
-        throw "Internal error: Unexpected varFinalOrConst '$varFinalOrConst'.";
-      }
-    }
-
+  Token parseModifiers(Token token) {
     // Process invalid and out-of-order modifiers
     Token next = token.next;
     while (true) {
@@ -199,6 +194,10 @@
           token = parseExternal(token);
         } else if (identical('final', value)) {
           token = parseFinal(token);
+        } else if (identical('late', value)) {
+          token = parseLate(token);
+        } else if (identical('required', value)) {
+          token = parseRequired(token);
         } else if (identical('static', value)) {
           token = parseStatic(token);
         } else if (identical('var', value)) {
@@ -215,7 +214,6 @@
       }
       next = token.next;
     }
-
     return token;
   }
 
@@ -237,10 +235,12 @@
     Token next = token.next;
     assert(optional('const', next));
     if (varFinalOrConst == null && covariantToken == null) {
-      varFinalOrConst = constToken = next;
+      constToken = next;
 
       if (afterFactory) {
-        parser.reportRecoverableError(next, fasta.messageConstAfterFactory);
+        reportModifierOutOfOrder(next, 'factory');
+      } else if (lateToken != null) {
+        reportConflictingModifiers(next, lateToken);
       }
       return next;
     }
@@ -250,11 +250,11 @@
       parser.reportRecoverableErrorWithToken(
           next, fasta.templateDuplicatedModifier);
     } else if (covariantToken != null) {
-      parser.reportRecoverableError(next, fasta.messageConstAndCovariant);
+      reportConflictingModifiers(next, covariantToken);
     } else if (finalToken != null) {
       parser.reportRecoverableError(next, fasta.messageConstAndFinal);
     } else if (varToken != null) {
-      parser.reportRecoverableError(next, fasta.messageConstAndVar);
+      reportConflictingModifiers(next, varToken);
     } else {
       throw 'Internal Error: Unexpected varFinalOrConst: $varFinalOrConst';
     }
@@ -273,7 +273,9 @@
       if (varToken != null) {
         parser.reportRecoverableError(next, fasta.messageCovariantAfterVar);
       } else if (finalToken != null) {
-        parser.reportRecoverableError(next, fasta.messageCovariantAfterFinal);
+        reportModifierOutOfOrder(next, finalToken.lexeme);
+      } else if (lateToken != null) {
+        reportModifierOutOfOrder(next, lateToken.lexeme);
       }
       return next;
     }
@@ -285,7 +287,7 @@
     } else if (afterFactory) {
       reportExtraneousModifier(next);
     } else if (constToken != null) {
-      parser.reportRecoverableError(next, fasta.messageConstAndCovariant);
+      reportConflictingModifiers(next, constToken);
     } else if (staticToken != null) {
       parser.reportRecoverableError(next, fasta.messageCovariantAndStatic);
     } else {
@@ -306,6 +308,8 @@
         parser.reportRecoverableError(next, fasta.messageExternalAfterConst);
       } else if (staticToken != null) {
         parser.reportRecoverableError(next, fasta.messageExternalAfterStatic);
+      } else if (lateToken != null) {
+        reportModifierOutOfOrder(next, lateToken.lexeme);
       }
       return next;
     }
@@ -320,7 +324,7 @@
     Token next = token.next;
     assert(optional('final', next));
     if (varFinalOrConst == null && !afterFactory) {
-      varFinalOrConst = finalToken = next;
+      finalToken = next;
       return next;
     }
 
@@ -334,12 +338,60 @@
       parser.reportRecoverableError(next, fasta.messageConstAndFinal);
     } else if (varToken != null) {
       parser.reportRecoverableError(next, fasta.messageFinalAndVar);
+    } else if (lateToken != null) {
+      reportModifierOutOfOrder(next, lateToken.lexeme);
     } else {
       throw 'Internal Error: Unexpected varFinalOrConst: $varFinalOrConst';
     }
     return next;
   }
 
+  Token parseLate(Token token) {
+    Token next = token.next;
+    assert(optional('late', next));
+    if (lateToken == null) {
+      lateToken = next;
+
+      if (constToken != null) {
+        reportConflictingModifiers(next, constToken);
+      } else if (varToken != null) {
+        reportConflictingModifiers(next, varToken);
+      } else if (finalToken != null) {
+        reportModifierOutOfOrder(next, finalToken.lexeme);
+      }
+      return next;
+    }
+
+    // Recovery
+    parser.reportRecoverableErrorWithToken(
+        next, fasta.templateDuplicatedModifier);
+    return next;
+  }
+
+  Token parseRequired(Token token) {
+    Token next = token.next;
+    assert(optional('required', next));
+    if (requiredToken == null) {
+      requiredToken = next;
+
+      if (constToken != null) {
+        reportModifierOutOfOrder(requiredToken, constToken.lexeme);
+      } else if (covariantToken != null) {
+        reportModifierOutOfOrder(requiredToken, covariantToken.lexeme);
+      } else if (finalToken != null) {
+        reportModifierOutOfOrder(requiredToken, finalToken.lexeme);
+      } else if (varToken != null) {
+        reportModifierOutOfOrder(requiredToken, varToken.lexeme);
+      }
+      return next;
+    }
+
+    // Recovery
+    parser.reportRecoverableErrorWithToken(
+        next, fasta.templateDuplicatedModifier);
+    return next;
+  }
+
   Token parseStatic(Token token) {
     Token next = token.next;
     assert(optional('static', next));
@@ -352,6 +404,8 @@
         parser.reportRecoverableError(next, fasta.messageStaticAfterFinal);
       } else if (varToken != null) {
         parser.reportRecoverableError(next, fasta.messageStaticAfterVar);
+      } else if (lateToken != null) {
+        reportModifierOutOfOrder(next, lateToken.lexeme);
       }
       return next;
     }
@@ -374,7 +428,11 @@
     Token next = token.next;
     assert(optional('var', next));
     if (varFinalOrConst == null && !afterFactory) {
-      varFinalOrConst = varToken = next;
+      varToken = next;
+
+      if (lateToken != null) {
+        reportConflictingModifiers(next, lateToken);
+      }
       return next;
     }
 
@@ -385,7 +443,7 @@
     } else if (afterFactory) {
       reportExtraneousModifier(next);
     } else if (constToken != null) {
-      parser.reportRecoverableError(next, fasta.messageConstAndVar);
+      reportConflictingModifiers(next, constToken);
     } else if (finalToken != null) {
       parser.reportRecoverableError(next, fasta.messageFinalAndVar);
     } else {
@@ -394,10 +452,24 @@
     return next;
   }
 
-  void reportExtraneousModifier(Token token) {
-    if (token != null) {
+  void reportConflictingModifiers(Token modifier, Token earlierModifier) {
+    parser.reportRecoverableError(
+        modifier,
+        fasta.templateConflictingModifiers
+            .withArguments(modifier.lexeme, earlierModifier.lexeme));
+  }
+
+  void reportExtraneousModifier(Token modifier) {
+    if (modifier != null) {
       parser.reportRecoverableErrorWithToken(
-          token, fasta.templateExtraneousModifier);
+          modifier, fasta.templateExtraneousModifier);
     }
   }
+
+  void reportModifierOutOfOrder(Token modifier, String beforeModifier) {
+    parser.reportRecoverableError(
+        modifier,
+        fasta.templateModifierOutOfOrder
+            .withArguments(modifier.lexeme, beforeModifier));
+  }
 }
diff --git a/front_end/lib/src/fasta/parser/parser.dart b/front_end/lib/src/fasta/parser/parser.dart
index 774daef..51b32e6 100644
--- a/front_end/lib/src/fasta/parser/parser.dart
+++ b/front_end/lib/src/fasta/parser/parser.dart
@@ -18,7 +18,6 @@
         EQUALITY_PRECEDENCE,
         Keyword,
         POSTFIX_PRECEDENCE,
-        PREFIX_PRECEDENCE,
         RELATIONAL_PRECEDENCE,
         SELECTOR_PRECEDENCE,
         SyntheticBeginToken,
@@ -258,11 +257,6 @@
 /// doesn't matter how we got there, only that we've identified that it's
 /// easier if the parser reports as many errors it can, but informs the
 /// listener if the error is recoverable or not.
-///
-/// Currently, the parser is particularly lax when it comes to the order of
-/// modifiers such as `abstract`, `final`, `static`, etc. Historically, dart2js
-/// would handle such errors in later phases. We hope that these cases will go
-/// away as Fasta matures.
 class Parser {
   Listener listener;
 
@@ -469,6 +463,7 @@
     // Skip modifiers to find a top level keyword or identifier
     if (next.isModifier) {
       if (optional('var', next) ||
+          optional('late', next) ||
           ((optional('const', next) || optional('final', next)) &&
               // Ignore `const class` and `final class` so that it is reported
               // below as an invalid modifier on a class.
@@ -1313,42 +1308,60 @@
     final bool inFunctionType =
         memberKind == MemberKind.GeneralizedFunctionType;
 
+    Token requiredToken;
     Token covariantToken;
     Token varFinalOrConst;
     if (isModifier(next)) {
-      if (optional('covariant', next)) {
-        if (memberKind != MemberKind.StaticMethod &&
-            memberKind != MemberKind.TopLevelMethod) {
-          covariantToken = token = next;
+      if (optional('required', next)) {
+        if (parameterKind == FormalParameterKind.optionalNamed) {
+          requiredToken = token = next;
           next = token.next;
         }
       }
 
       if (isModifier(next)) {
-        if (!inFunctionType) {
-          if (optional('var', next)) {
-            varFinalOrConst = token = next;
-            next = token.next;
-          } else if (optional('final', next)) {
-            varFinalOrConst = token = next;
+        if (optional('covariant', next)) {
+          if (memberKind != MemberKind.StaticMethod &&
+              memberKind != MemberKind.TopLevelMethod) {
+            covariantToken = token = next;
             next = token.next;
           }
         }
 
         if (isModifier(next)) {
-          // Recovery
-          ModifierRecoveryContext context = new ModifierRecoveryContext(this);
-          token = context.parseFormalParameterModifiers(token, memberKind,
-              covariantToken: covariantToken, varFinalOrConst: varFinalOrConst);
-          covariantToken = context.covariantToken;
-          varFinalOrConst = context.varFinalOrConst;
-          context = null;
+          if (!inFunctionType) {
+            if (optional('var', next)) {
+              varFinalOrConst = token = next;
+              next = token.next;
+            } else if (optional('final', next)) {
+              varFinalOrConst = token = next;
+              next = token.next;
+            }
+          }
+
+          if (isModifier(next)) {
+            // Recovery
+            ModifierRecoveryContext context = new ModifierRecoveryContext(this)
+              ..covariantToken = covariantToken
+              ..requiredToken = requiredToken
+              ..varFinalOrConst = varFinalOrConst;
+
+            token = context.parseFormalParameterModifiers(
+                token, parameterKind, memberKind);
+            next = token.next;
+
+            covariantToken = context.covariantToken;
+            requiredToken = context.requiredToken;
+            varFinalOrConst = context.varFinalOrConst;
+
+            context = null;
+          }
         }
       }
     }
 
     listener.beginFormalParameter(
-        start, memberKind, covariantToken, varFinalOrConst);
+        start, memberKind, requiredToken, covariantToken, varFinalOrConst);
 
     // Type is required in a generalized function type, but optional otherwise.
     final Token beforeType = token;
@@ -2113,6 +2126,7 @@
     listener.beginTopLevelMember(next);
 
     Token externalToken;
+    Token lateToken;
     Token varFinalOrConst;
 
     if (isModifier(next)) {
@@ -2130,6 +2144,13 @@
         } else if (optional('const', next)) {
           varFinalOrConst = token = next;
           next = token.next;
+        } else if (optional('late', next)) {
+          lateToken = token = next;
+          next = token.next;
+          if (isModifier(next) && optional('final', next)) {
+            varFinalOrConst = token = next;
+            next = token.next;
+          }
         }
         if (isModifier(next)) {
           // Recovery
@@ -2140,13 +2161,18 @@
             // If another `var`, `final`, or `const` then fall through
             // to parse that as part of the next top level declaration.
           } else {
-            ModifierRecoveryContext context = new ModifierRecoveryContext(this);
-            token = context.parseTopLevelModifiers(token,
-                externalToken: externalToken, varFinalOrConst: varFinalOrConst);
+            ModifierRecoveryContext context = new ModifierRecoveryContext(this)
+              ..externalToken = externalToken
+              ..lateToken = lateToken
+              ..varFinalOrConst = varFinalOrConst;
+
+            token = context.parseTopLevelModifiers(token);
             next = token.next;
 
             externalToken = context.externalToken;
+            lateToken = context.lateToken;
             varFinalOrConst = context.varFinalOrConst;
+
             context = null;
           }
         }
@@ -2238,6 +2264,9 @@
           reportRecoverableErrorWithToken(
               varFinalOrConst, fasta.templateExtraneousModifier);
         }
+      } else if (lateToken != null) {
+        reportRecoverableErrorWithToken(
+            lateToken, fasta.templateExtraneousModifier);
       }
       return parseTopLevelMethod(beforeStart, externalToken, beforeType,
           typeInfo, getOrSet, token.next);
@@ -2247,8 +2276,8 @@
       reportRecoverableErrorWithToken(
           getOrSet, fasta.templateExtraneousModifier);
     }
-    return parseFields(beforeStart, externalToken, null, null, varFinalOrConst,
-        beforeType, typeInfo, token.next, true);
+    return parseFields(beforeStart, externalToken, null, null, lateToken,
+        varFinalOrConst, beforeType, typeInfo, token.next, true);
   }
 
   Token parseFields(
@@ -2256,6 +2285,7 @@
       Token externalToken,
       Token staticToken,
       Token covariantToken,
+      Token lateToken,
       Token varFinalOrConst,
       Token beforeType,
       TypeInfo typeInfo,
@@ -2271,7 +2301,7 @@
       }
     }
     if (typeInfo == noType) {
-      if (varFinalOrConst == null) {
+      if (varFinalOrConst == null && lateToken == null) {
         reportRecoverableError(name, fasta.messageMissingConstFinalVarOrType);
       }
     } else {
@@ -2289,19 +2319,21 @@
     name = ensureIdentifier(token, context);
 
     int fieldCount = 1;
-    token = parseFieldInitializerOpt(name, name, varFinalOrConst, isTopLevel);
+    token = parseFieldInitializerOpt(
+        name, name, lateToken, varFinalOrConst, isTopLevel);
     while (optional(',', token.next)) {
       name = ensureIdentifier(token.next, context);
-      token = parseFieldInitializerOpt(name, name, varFinalOrConst, isTopLevel);
+      token = parseFieldInitializerOpt(
+          name, name, lateToken, varFinalOrConst, isTopLevel);
       ++fieldCount;
     }
     token = ensureSemicolon(token);
     if (isTopLevel) {
-      listener.endTopLevelFields(staticToken, covariantToken, varFinalOrConst,
-          fieldCount, beforeStart.next, token);
+      listener.endTopLevelFields(staticToken, covariantToken, lateToken,
+          varFinalOrConst, fieldCount, beforeStart.next, token);
     } else {
-      listener.endFields(staticToken, covariantToken, varFinalOrConst,
-          fieldCount, beforeStart.next, token);
+      listener.endFields(staticToken, covariantToken, lateToken,
+          varFinalOrConst, fieldCount, beforeStart.next, token);
     }
     return token;
   }
@@ -2356,8 +2388,8 @@
     return token;
   }
 
-  Token parseFieldInitializerOpt(
-      Token token, Token name, Token varFinalOrConst, bool isTopLevel) {
+  Token parseFieldInitializerOpt(Token token, Token name, Token lateToken,
+      Token varFinalOrConst, bool isTopLevel) {
     Token next = token.next;
     if (optional('=', next)) {
       Token assignment = next;
@@ -2371,7 +2403,9 @@
               name,
               fasta.templateConstFieldWithoutInitializer
                   .withArguments(name.lexeme));
-        } else if (isTopLevel && optional("final", varFinalOrConst)) {
+        } else if (isTopLevel &&
+            optional("final", varFinalOrConst) &&
+            lateToken == null) {
           reportRecoverableError(
               name,
               fasta.templateFinalFieldWithoutInitializer
@@ -2816,6 +2850,7 @@
 
     Token covariantToken;
     Token externalToken;
+    Token lateToken;
     Token staticToken;
     Token varFinalOrConst;
 
@@ -2843,18 +2878,28 @@
           } else if (optional('const', next) && covariantToken == null) {
             varFinalOrConst = token = next;
             next = token.next;
+          } else if (optional('late', next)) {
+            lateToken = token = next;
+            next = token.next;
+            if (isModifier(next) && optional('final', next)) {
+              varFinalOrConst = token = next;
+              next = token.next;
+            }
           }
           if (isModifier(next)) {
-            ModifierRecoveryContext context = new ModifierRecoveryContext(this);
-            token = context.parseClassMemberModifiers(token,
-                externalToken: externalToken,
-                staticToken: staticToken,
-                covariantToken: covariantToken,
-                varFinalOrConst: varFinalOrConst);
+            ModifierRecoveryContext context = new ModifierRecoveryContext(this)
+              ..covariantToken = covariantToken
+              ..externalToken = externalToken
+              ..lateToken = lateToken
+              ..staticToken = staticToken
+              ..varFinalOrConst = varFinalOrConst;
+
+            token = context.parseClassMemberModifiers(token);
             next = token.next;
 
             covariantToken = context.covariantToken;
             externalToken = context.externalToken;
+            lateToken = context.lateToken;
             staticToken = context.staticToken;
             varFinalOrConst = context.varFinalOrConst;
 
@@ -2883,6 +2928,9 @@
       } else if (identical(value, 'factory')) {
         Token next2 = next.next;
         if (next2.isIdentifier || next2.isModifier) {
+          if (beforeType != token) {
+            reportRecoverableError(token, fasta.messageTypeBeforeFactory);
+          }
           token = parseFactoryMethod(token, beforeStart, externalToken,
               staticToken ?? covariantToken, varFinalOrConst);
           listener.endMember();
@@ -2900,6 +2948,7 @@
               externalToken,
               staticToken,
               covariantToken,
+              lateToken,
               varFinalOrConst,
               beforeType,
               typeInfo,
@@ -2913,8 +2962,14 @@
                 !optional('=', next2) &&
                 !optional('<', next2))) {
           // Recovery: Invalid operator
-          return parseInvalidOperatorDeclaration(beforeStart, externalToken,
-              staticToken, covariantToken, varFinalOrConst, beforeType);
+          return parseInvalidOperatorDeclaration(
+              beforeStart,
+              externalToken,
+              staticToken,
+              covariantToken,
+              lateToken,
+              varFinalOrConst,
+              beforeType);
         } else if (isUnaryMinus(next2)) {
           // Recovery
           token = parseMethod(
@@ -2922,6 +2977,7 @@
               externalToken,
               staticToken,
               covariantToken,
+              lateToken,
               varFinalOrConst,
               beforeType,
               typeInfo,
@@ -2942,6 +2998,7 @@
             externalToken,
             staticToken,
             covariantToken,
+            lateToken,
             varFinalOrConst,
             beforeType,
             typeInfo,
@@ -2955,8 +3012,14 @@
             identical(value, '{') ||
             identical(value, '=>')) {
           // Recovery: Missing `operator` keyword
-          return parseInvalidOperatorDeclaration(beforeStart, externalToken,
-              staticToken, covariantToken, varFinalOrConst, beforeType);
+          return parseInvalidOperatorDeclaration(
+              beforeStart,
+              externalToken,
+              staticToken,
+              covariantToken,
+              lateToken,
+              varFinalOrConst,
+              beforeType);
         }
       }
     }
@@ -2975,6 +3038,7 @@
           externalToken,
           staticToken,
           covariantToken,
+          lateToken,
           varFinalOrConst,
           beforeType,
           typeInfo,
@@ -2990,6 +3054,7 @@
           externalToken,
           staticToken,
           covariantToken,
+          lateToken,
           varFinalOrConst,
           beforeType,
           typeInfo,
@@ -3005,11 +3070,16 @@
       Token externalToken,
       Token staticToken,
       Token covariantToken,
+      Token lateToken,
       Token varFinalOrConst,
       Token beforeType,
       TypeInfo typeInfo,
       Token getOrSet,
       Token name) {
+    if (lateToken != null) {
+      reportRecoverableErrorWithToken(
+          lateToken, fasta.templateExtraneousModifier);
+    }
     bool isOperator = false;
     if (getOrSet == null && optional('operator', name)) {
       Token operator = name.next;
@@ -3115,15 +3185,18 @@
 
     if (!isValidTypeReference(token.next)) {
       // Recovery
-      ModifierRecoveryContext context = new ModifierRecoveryContext(this);
-      token = context.parseModifiersAfterFactory(token,
-          externalToken: externalToken,
-          staticOrCovariant: staticOrCovariant,
-          varFinalOrConst: varFinalOrConst);
+      ModifierRecoveryContext context = new ModifierRecoveryContext(this)
+        ..externalToken = externalToken
+        ..staticOrCovariant = staticOrCovariant
+        ..varFinalOrConst = varFinalOrConst;
+
+      token = context.parseModifiersAfterFactory(token);
 
       externalToken = context.externalToken;
       staticOrCovariant = context.staticToken ?? context.covariantToken;
       varFinalOrConst = context.varFinalOrConst;
+
+      context = null;
     }
 
     if (staticOrCovariant != null) {
@@ -3553,7 +3626,8 @@
       if (optional(':', token.next.next)) {
         return parseLabeledStatement(token);
       }
-      return parseExpressionStatementOrDeclarationAfterModifiers(token, token);
+      return parseExpressionStatementOrDeclarationAfterModifiers(
+          token, token, null, null, null, false);
     }
     final value = token.next.stringValue;
     if (identical(value, '{')) {
@@ -3562,12 +3636,18 @@
       return parseReturnStatement(token);
     } else if (identical(value, 'var') || identical(value, 'final')) {
       Token varOrFinal = token.next;
-      if (isModifier(varOrFinal.next)) {
-        return parseExpressionStatementOrDeclaration(token);
-      } else {
+      if (!isModifier(varOrFinal.next)) {
         return parseExpressionStatementOrDeclarationAfterModifiers(
-            varOrFinal, token, varOrFinal);
+            varOrFinal, token, null, varOrFinal, null, false);
       }
+      return parseExpressionStatementOrDeclaration(token);
+    } else if (identical(value, 'late')) {
+      Token lateToken = token.next;
+      if (!isModifier(lateToken.next)) {
+        return parseExpressionStatementOrDeclarationAfterModifiers(
+            lateToken, token, lateToken, null, null, false);
+      }
+      return parseExpressionStatementOrDeclaration(token);
     } else if (identical(value, 'if')) {
       return parseIfStatement(token);
     } else if (identical(value, 'await') && optional('for', token.next.next)) {
@@ -3800,7 +3880,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)) {
@@ -3823,11 +3903,7 @@
               (identical(type, TokenType.MINUS_MINUS))) {
             listener.handleUnaryPostfixAssignmentExpression(token.next);
             token = next;
-          }
-        } else if (identical(tokenLevel, PREFIX_PRECEDENCE)) {
-          // The '!' has prefix precedence but here it's being used as a
-          // postfix operator to assert the expression has a non-null value.
-          if ((identical(type, TokenType.BANG))) {
+          } else if (identical(type, TokenType.BANG)) {
             listener.handleNonNullAssertExpression(token.next);
             token = next;
           }
@@ -3885,12 +3961,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));
@@ -4977,7 +5063,7 @@
         }
       }
       return parseExpressionStatementOrDeclarationAfterModifiers(
-          constToken, start, constToken, typeInfo);
+          constToken, start, null, constToken, typeInfo, false);
     }
     return parseExpressionStatementOrDeclaration(start);
   }
@@ -5003,50 +5089,71 @@
       next = token.next;
     }
 
+    Token lateToken;
     Token varFinalOrConst;
+
     if (isModifier(next)) {
-      if (optional('var', next)) {
+      if (optional('var', next) ||
+          optional('final', next) ||
+          optional('const', next)) {
         varFinalOrConst = token = token.next;
         next = token.next;
-      } else if (optional('final', next) || optional('const', next)) {
-        varFinalOrConst = token = token.next;
+      } else if (optional('late', next)) {
+        lateToken = token = next;
         next = token.next;
+        if (isModifier(next) && optional('final', next)) {
+          varFinalOrConst = token = next;
+          next = token.next;
+        }
       }
 
       if (isModifier(next)) {
         // Recovery
-        ModifierRecoveryContext modifierContext =
-            new ModifierRecoveryContext(this);
-        token = modifierContext.parseVariableDeclarationModifiers(token,
-            varFinalOrConst: varFinalOrConst);
+        ModifierRecoveryContext context = new ModifierRecoveryContext(this)
+          ..lateToken = lateToken
+          ..varFinalOrConst = varFinalOrConst;
+
+        token = context.parseVariableDeclarationModifiers(token);
         next = token.next;
 
-        varFinalOrConst = modifierContext.varFinalOrConst;
-        modifierContext = null;
+        lateToken = context.lateToken;
+        varFinalOrConst = context.varFinalOrConst;
+
+        context = null;
       }
     }
 
-    return parseExpressionStatementOrDeclarationAfterModifiers(
-        token, start, varFinalOrConst, null, onlyParseVariableDeclarationStart);
+    return parseExpressionStatementOrDeclarationAfterModifiers(token, start,
+        lateToken, varFinalOrConst, null, onlyParseVariableDeclarationStart);
   }
 
   /// See [parseExpressionStatementOrDeclaration]
   Token parseExpressionStatementOrDeclarationAfterModifiers(
-      final Token beforeType, final Token start,
-      [Token varFinalOrConst = null,
+      final Token beforeType,
+      final Token start,
+      final Token lateToken,
+      Token varFinalOrConst,
       TypeInfo typeInfo,
-      bool onlyParseVariableDeclarationStart = false]) {
+      bool onlyParseVariableDeclarationStart) {
     typeInfo ??= computeType(beforeType, false);
 
     Token token = typeInfo.skipType(beforeType);
     Token next = token.next;
 
-    if (!onlyParseVariableDeclarationStart) {
+    if (onlyParseVariableDeclarationStart) {
+      if (lateToken != null) {
+        reportRecoverableErrorWithToken(
+            lateToken, fasta.templateExtraneousModifier);
+      }
+    } else {
       if (looksLikeLocalFunction(next)) {
         // Parse a local function declaration.
         if (varFinalOrConst != null) {
           reportRecoverableErrorWithToken(
               varFinalOrConst, fasta.templateExtraneousModifier);
+        } else if (lateToken != null) {
+          reportRecoverableErrorWithToken(
+              lateToken, fasta.templateExtraneousModifier);
         }
         if (!optional('@', start.next)) {
           listener.beginMetadataStar(start.next);
@@ -5135,7 +5242,7 @@
       // identifier, then allow ensureIdentifier to report an error
       // and don't report errors here.
       if (varFinalOrConst == null) {
-        if (typeInfo == noType) {
+        if (typeInfo == noType && lateToken == null) {
           reportRecoverableError(next, fasta.messageMissingConstFinalVarOrType);
         }
       } else if (optional('var', varFinalOrConst)) {
@@ -5151,7 +5258,7 @@
     }
     token = typeInfo.parseType(beforeType, this);
     next = token.next;
-    listener.beginVariablesDeclaration(next, varFinalOrConst);
+    listener.beginVariablesDeclaration(next, lateToken, varFinalOrConst);
     if (!onlyParseVariableDeclarationStart) {
       token = parseVariablesDeclarationRest(token, true);
     }
@@ -6043,6 +6150,7 @@
       Token externalToken,
       Token staticToken,
       Token covariantToken,
+      Token lateToken,
       Token varFinalOrConst,
       Token beforeType) {
     TypeInfo typeInfo = computeType(beforeType, true, true);
@@ -6067,6 +6175,7 @@
         externalToken,
         staticToken,
         covariantToken,
+        lateToken,
         varFinalOrConst,
         beforeType,
         typeInfo,
@@ -6085,6 +6194,7 @@
       Token externalToken,
       Token staticToken,
       Token covariantToken,
+      Token lateToken,
       Token varFinalOrConst,
       Token beforeType,
       TypeInfo typeInfo,
@@ -6100,7 +6210,7 @@
       return reportAndSkipTypedefInClass(next);
     } else if (next.isOperator && next.endGroup == null) {
       return parseInvalidOperatorDeclaration(beforeStart, externalToken,
-          staticToken, covariantToken, varFinalOrConst, beforeType);
+          staticToken, covariantToken, lateToken, varFinalOrConst, beforeType);
     }
 
     if (getOrSet != null ||
@@ -6112,6 +6222,7 @@
           externalToken,
           staticToken,
           covariantToken,
+          lateToken,
           varFinalOrConst,
           beforeType,
           typeInfo,
@@ -6131,6 +6242,7 @@
           externalToken,
           staticToken,
           covariantToken,
+          lateToken,
           varFinalOrConst,
           beforeType,
           typeInfo,
@@ -6182,7 +6294,7 @@
   }
 
   void reportErrorToken(ErrorToken token) {
-    listener.handleRecoverableError(token.assertionMessage, token, token);
+    listener.handleErrorToken(token);
   }
 
   Token parseInvalidTopLevelDeclaration(Token token) {
diff --git a/front_end/lib/src/fasta/parser/type_info.dart b/front_end/lib/src/fasta/parser/type_info.dart
index 8214825..cf59846 100644
--- a/front_end/lib/src/fasta/parser/type_info.dart
+++ b/front_end/lib/src/fasta/parser/type_info.dart
@@ -34,26 +34,26 @@
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the type, inserting a synthetic type reference if
   /// necessary. This may modify the token stream when parsing `>>` or `>>>`
-  /// in valid code or during recovery.
+  /// or `>>>=` in valid code or during recovery.
   Token ensureTypeNotVoid(Token token, Parser parser);
 
   /// Call this function when the token after [token] must be a type or void.
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the type, inserting a synthetic type reference if
   /// necessary. This may modify the token stream when parsing `>>` or `>>>`
-  /// in valid code or during recovery.
+  /// or `>>>=` in valid code or during recovery.
   Token ensureTypeOrVoid(Token token, Parser parser);
 
   /// Call this function to parse an optional type (not void) after [token].
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the type. This may modify the token stream
-  /// when parsing `>>` or `>>>` in valid code or during recovery.
+  /// when parsing `>>` or `>>>` or `>>>=`  in valid code or during recovery.
   Token parseTypeNotVoid(Token token, Parser parser);
 
   /// Call this function to parse an optional type or void after [token].
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the type. This may modify the token stream
-  /// when parsing `>>` or `>>>` in valid code or during recovery.
+  /// when parsing `>>` or `>>>` or `>>>=` in valid code or during recovery.
   Token parseType(Token token, Parser parser);
 
   /// Call this function with the [token] before the type to obtain
@@ -83,14 +83,14 @@
   /// Call this function to parse optional type arguments after [token].
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the arguments. This may modify the token stream
-  /// when parsing `>>` or `>>>` in valid code or during recovery.
+  /// when parsing `>>` or `>>>` or `>>>=` in valid code or during recovery.
   Token parseArguments(Token token, Parser parser);
 
   /// Call this function to parse optional type parameters
   /// (also known as type variables) after [token].
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the parameters. This may modify the token stream
-  /// when parsing `>>` or `>>>` in valid code or during recovery.
+  /// when parsing `>>` or `>>>` or `>>>=` in valid code or during recovery.
   Token parseVariables(Token token, Parser parser);
 
   /// Call this function with the [token] before the type var to obtain
diff --git a/front_end/lib/src/fasta/parser/type_info_impl.dart b/front_end/lib/src/fasta/parser/type_info_impl.dart
index 6d670a1..b6d698e 100644
--- a/front_end/lib/src/fasta/parser/type_info_impl.dart
+++ b/front_end/lib/src/fasta/parser/type_info_impl.dart
@@ -31,6 +31,7 @@
         splitGtEq,
         splitGtFromGtGtEq,
         splitGtFromGtGtGt,
+        splitGtFromGtGtGtEq,
         splitGtGt,
         syntheticGt;
 
@@ -1163,17 +1164,18 @@
   }
 }
 
-/// Return `true` if [token] is one of `>`, `>>`, `>=`, `>>>`, or `>>=`.
+/// Return `true` if [token] is one of `>`, `>>`, `>>>`, `>=`, `>>=`, or `>>>=`.
 bool isCloser(Token token) {
   final value = token.stringValue;
   return identical(value, '>') ||
       identical(value, '>>') ||
       identical(value, '>=') ||
       identical(value, '>>>') ||
-      identical(value, '>>=');
+      identical(value, '>>=') ||
+      identical(value, '>>>=');
 }
 
-/// If [beforeCloser].next is one of `>`, `>>`, `>=`, `>>>`, or `>>=`,
+/// If [beforeCloser].next is one of `>`, `>>`, `>>>`, `>=`, `>>=`, or `>>>=`
 /// then update the token stream and return `true`.
 bool parseCloser(Token beforeCloser) {
   Token unsplit = beforeCloser.next;
@@ -1189,8 +1191,8 @@
 }
 
 /// If [closer] is `>` then return it.
-/// If [closer] is one of `>>`, `>=`, `>>>`, or `>>=` then split then token
-/// and return the leading `>` without updating the token stream.
+/// If [closer] is one of `>>`, `>>>`, `>=`, `>>=`,  or `>>>=` then split
+/// the token and return the leading `>` without updating the token stream.
 /// If [closer] is none of the above, then return null;
 Token splitCloser(Token closer) {
   String value = closer.stringValue;
@@ -1204,6 +1206,8 @@
     return splitGtFromGtGtGt(closer);
   } else if (identical(value, '>>=')) {
     return splitGtFromGtGtEq(closer);
+  } else if (identical(value, '>>>=')) {
+    return splitGtFromGtGtGtEq(closer);
   }
   return null;
 }
diff --git a/front_end/lib/src/fasta/parser/util.dart b/front_end/lib/src/fasta/parser/util.dart
index e02385f..2e7b441 100644
--- a/front_end/lib/src/fasta/parser/util.dart
+++ b/front_end/lib/src/fasta/parser/util.dart
@@ -190,6 +190,18 @@
       ..next = token.next);
 }
 
+/// Split `>>>=` into two separate tokens... `>` followed by `>>=`.
+/// Call [Token.setNext] to add the token to the stream.
+Token splitGtFromGtGtGtEq(Token token) {
+  assert(optional('>>>=', token));
+  return new SimpleToken(
+      TokenType.GT, token.charOffset, token.precedingComments)
+    ..setNext(new SimpleToken(TokenType.GT_GT_EQ, token.charOffset + 1)
+      // Set next rather than calling Token.setNext
+      // so that the previous token is not set.
+      ..next = token.next);
+}
+
 /// Return a synthetic `<` followed by [next].
 /// Call [Token.setNext] to add the token to the stream.
 Token syntheticGt(Token next) {
diff --git a/front_end/lib/src/fasta/rewrite_severity.dart b/front_end/lib/src/fasta/rewrite_severity.dart
index 5d521bb..40f5b8c 100644
--- a/front_end/lib/src/fasta/rewrite_severity.dart
+++ b/front_end/lib/src/fasta/rewrite_severity.dart
@@ -9,20 +9,6 @@
 Severity rewriteSeverity(
     Severity severity, msg.Code<Object> code, Uri fileUri) {
   if (severity != Severity.ignored) {
-    if (code == msg.codeFinalFieldNotInitialized) {
-      // TODO(johnniwinther): Use external getters instead of final fields.
-      // See https://github.com/dart-lang/sdk/issues/33762
-      for (String path in [
-        "/pkg/dev_compiler/tool/input_sdk/private/js_string.dart",
-        "/sdk/lib/html/dart2js/html_dart2js.dart",
-        "/sdk/lib/svg/dart2js/svg_dart2js.dart",
-        "/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart"
-      ]) {
-        if (fileUri.path.endsWith(path)) {
-          return Severity.ignored;
-        }
-      }
-    }
     return severity;
   }
 
diff --git a/front_end/lib/src/fasta/scanner.dart b/front_end/lib/src/fasta/scanner.dart
index f276eda..7df276f 100644
--- a/front_end/lib/src/fasta/scanner.dart
+++ b/front_end/lib/src/fasta/scanner.dart
@@ -6,18 +6,23 @@
 
 import 'dart:convert' show unicodeReplacementCharacterRune, utf8;
 
-import 'fasta_codes.dart' show LocatedMessage;
-
 import '../scanner/token.dart' show Token;
 
+import 'scanner/abstract_scanner.dart'
+    show LanguageVersionChanged, ScannerConfiguration;
+
 import 'scanner/string_scanner.dart' show StringScanner;
 
 import 'scanner/utf8_bytes_scanner.dart' show Utf8BytesScanner;
 
 import 'scanner/recover.dart' show defaultRecoveryStrategy;
 
+export 'scanner/abstract_scanner.dart'
+    show LanguageVersionChanged, ScannerConfiguration;
+
 export 'scanner/token.dart'
     show
+        LanguageVersionToken,
         StringToken,
         isBinaryOperator,
         isMinusOperator,
@@ -28,6 +33,8 @@
 export 'scanner/error_token.dart'
     show ErrorToken, buildUnexpectedCharacterToken;
 
+export 'scanner/token.dart' show LanguageVersionToken;
+
 export 'scanner/token_constants.dart' show EOF_TOKEN;
 
 export 'scanner/utf8_bytes_scanner.dart' show Utf8BytesScanner;
@@ -41,19 +48,14 @@
 typedef Token Recover(List<int> bytes, Token tokens, List<int> lineStarts);
 
 abstract class Scanner {
-  /// A list of errors that occured during [tokenize] or `null` if none.
-  List<LocatedMessage> errors;
-
-  /// Set true if errors should be reported via the [errors] list.
-  // TODO(danrubel): Remove this once all scanner clients can process
-  // errors reported via the [errors] list.
-  bool reportErrors;
-
   /// Returns true if an error occured during [tokenize].
   bool get hasErrors;
 
   List<int> get lineStarts;
 
+  /// Configure which tokens are produced.
+  set configuration(ScannerConfiguration config);
+
   Token tokenize();
 }
 
@@ -62,37 +64,39 @@
   final List<int> lineStarts;
   final bool hasErrors;
 
-  /// Returns a list of errors that occured during [tokenize] or `null` if none.
-  final List<LocatedMessage> errors;
-
-  ScannerResult(this.tokens, this.lineStarts, this.hasErrors, this.errors);
+  ScannerResult(this.tokens, this.lineStarts, this.hasErrors);
 }
 
 /// Scan/tokenize the given UTF8 [bytes].
 /// If [recover] is null, then the [defaultRecoveryStrategy] is used.
 ScannerResult scan(List<int> bytes,
-    {bool includeComments: false, Recover recover}) {
+    {ScannerConfiguration configuration,
+    bool includeComments: false,
+    LanguageVersionChanged languageVersionChanged,
+    Recover recover}) {
   if (bytes.last != 0) {
     throw new ArgumentError("[bytes]: the last byte must be null.");
   }
-  Scanner scanner =
-      new Utf8BytesScanner(bytes, includeComments: includeComments);
+  Scanner scanner = new Utf8BytesScanner(bytes,
+      configuration: configuration,
+      includeComments: includeComments,
+      languageVersionChanged: languageVersionChanged);
   return _tokenizeAndRecover(scanner, recover, bytes: bytes);
 }
 
 /// Scan/tokenize the given [source].
 /// If [recover] is null, then the [defaultRecoveryStrategy] is used.
 ScannerResult scanString(String source,
-    {bool enableGtGtGt: false,
+    {ScannerConfiguration configuration,
     bool includeComments: false,
+    LanguageVersionChanged languageVersionChanged,
     bool scanLazyAssignmentOperators: false,
     Recover recover}) {
-  // TODO(brianwilkerson): Remove the parameter `enableGtGtGt` after the feature
-  // has been anabled by default.
   assert(source != null, 'source must not be null');
-  StringScanner scanner =
-      new StringScanner(source, includeComments: includeComments);
-  scanner.enableGtGtGt = enableGtGtGt;
+  StringScanner scanner = new StringScanner(source,
+      configuration: configuration,
+      includeComments: includeComments,
+      languageVersionChanged: languageVersionChanged);
   return _tokenizeAndRecover(scanner, recover, source: source);
 }
 
@@ -104,6 +108,5 @@
     recover ??= defaultRecoveryStrategy;
     tokens = recover(bytes, tokens, scanner.lineStarts);
   }
-  return new ScannerResult(
-      tokens, scanner.lineStarts, scanner.hasErrors, scanner.errors);
+  return new ScannerResult(tokens, scanner.lineStarts, scanner.hasErrors);
 }
diff --git a/front_end/lib/src/fasta/scanner/abstract_scanner.dart b/front_end/lib/src/fasta/scanner/abstract_scanner.dart
index 3377316..3c18577 100644
--- a/front_end/lib/src/fasta/scanner/abstract_scanner.dart
+++ b/front_end/lib/src/fasta/scanner/abstract_scanner.dart
@@ -16,8 +16,7 @@
         messageExpectedHexDigit,
         messageMissingExponent,
         messageUnexpectedDollarInString,
-        messageUnterminatedComment,
-        templateUnterminatedString;
+        messageUnterminatedComment;
 
 import '../scanner.dart'
     show ErrorToken, Keyword, Scanner, buildUnexpectedCharacterToken;
@@ -27,12 +26,15 @@
 
 import 'keyword_state.dart' show KeywordState;
 
-import 'token.dart' show CommentToken, DartDocToken;
+import 'token.dart' show CommentToken, DartDocToken, LanguageVersionToken;
 
 import 'token_constants.dart';
 
 import 'characters.dart';
 
+typedef void LanguageVersionChanged(
+    Scanner scanner, LanguageVersionToken languageVersion);
+
 abstract class AbstractScanner implements Scanner {
   /**
    * A flag indicating whether character sequences `&&=` and `||=`
@@ -44,10 +46,24 @@
 
   final bool includeComments;
 
-  /// Experimental flag for enabling parsing of `>>>`.
+  /// Called when the scanner detects a language version comment
+  /// so that the listener can update the scanner configuration
+  /// based upon the specified language version.
+  final LanguageVersionChanged languageVersionChanged;
+
+  /// Experimental flag for enabling scanning of `>>>`.
   /// See https://github.com/dart-lang/language/issues/61
   /// and https://github.com/dart-lang/language/issues/60
-  bool enableGtGtGt = false;
+  bool _enableGtGtGt = false;
+
+  /// Experimental flag for enabling scanning of `>>>=`.
+  /// See https://github.com/dart-lang/language/issues/61
+  /// and https://github.com/dart-lang/language/issues/60
+  bool _enableGtGtGtEq = false;
+
+  /// Experimental flag for enabling scanning of NNBD tokens
+  /// such as 'required' and 'late'.
+  bool _enableNonNullable = false;
 
   /**
    * The string offset for the next token that will be created.
@@ -86,9 +102,21 @@
 
   final List<int> lineStarts;
 
-  AbstractScanner(this.includeComments, {int numberOfBytesHint})
+  AbstractScanner(ScannerConfiguration config, this.includeComments,
+      this.languageVersionChanged,
+      {int numberOfBytesHint})
       : lineStarts = new LineStarts(numberOfBytesHint) {
     this.tail = this.tokens;
+    this.configuration = config;
+  }
+
+  @override
+  set configuration(ScannerConfiguration config) {
+    if (config != null) {
+      _enableNonNullable = config.enableNonNullable;
+      _enableGtGtGt = config.enableGtGtGt;
+      _enableGtGtGtEq = config.enableGtGtGtEq;
+    }
   }
 
   /**
@@ -245,6 +273,13 @@
   DartDocToken createDartDocToken(TokenType type, int start, bool asciiOnly,
       [int extraOffset = 0]);
 
+  /**
+   * Returns a new language version token from the scan offset [start]
+   * to the current [scanOffset] similar to createCommentToken.
+   */
+  LanguageVersionToken createLanguageVersionToken(
+      int start, int major, int minor);
+
   /** Documentation in subclass [ArrayBasedScanner]. */
   void discardOpenLt();
 
@@ -257,6 +292,21 @@
   Token tokenize() {
     while (!atEndOfFile()) {
       int next = advance();
+
+      // Scan the header looking for a language version
+      if (!identical(next, $EOF)) {
+        Token oldTail = tail;
+        next = bigHeaderSwitch(next);
+        if (!identical(next, $EOF) && tail.kind == SCRIPT_TOKEN) {
+          oldTail = tail;
+          next = bigHeaderSwitch(next);
+        }
+        while (!identical(next, $EOF) && tail == oldTail) {
+          next = bigHeaderSwitch(next);
+        }
+        next = next;
+      }
+
       while (!identical(next, $EOF)) {
         next = bigSwitch(next);
       }
@@ -273,6 +323,17 @@
     return firstToken();
   }
 
+  int bigHeaderSwitch(int next) {
+    if (!identical(next, $SLASH)) {
+      return bigSwitch(next);
+    }
+    beginToken();
+    if (!identical($SLASH, peek())) {
+      return tokenizeSlashOrComment(next);
+    }
+    return tokenizeLanguageVersionOrSingleLineComment(next);
+  }
+
   int bigSwitch(int next) {
     beginToken();
     if (identical(next, $SPACE) ||
@@ -643,7 +704,7 @@
   }
 
   int tokenizeGreaterThan(int next) {
-    // > >= >> >>= >>>
+    // > >= >> >>= >>> >>>=
     next = advance();
     if (identical($EQ, next)) {
       appendPrecedenceToken(TokenType.GT_EQ);
@@ -653,9 +714,14 @@
       if (identical($EQ, next)) {
         appendPrecedenceToken(TokenType.GT_GT_EQ);
         return advance();
-      } else if (enableGtGtGt && identical($GT, next)) {
+      } else if (_enableGtGtGt && identical($GT, next)) {
+        next = advance();
+        if (_enableGtGtGtEq && identical($EQ, next)) {
+          appendPrecedenceToken(TokenType.GT_GT_GT_EQ);
+          return advance();
+        }
         appendPrecedenceToken(TokenType.GT_GT_GT);
-        return advance();
+        return next;
       } else {
         appendGtGt(TokenType.GT_GT);
         return next;
@@ -826,11 +892,111 @@
     }
   }
 
-  int tokenizeSingleLineComment(int next, int start) {
-    bool asciiOnly = true;
-    bool dartdoc = identical($SLASH, peek());
-    while (true) {
+  int tokenizeLanguageVersionOrSingleLineComment(int next) {
+    int start = scanOffset;
+    next = advance();
+
+    // Dart doc
+    if (identical($SLASH, peek())) {
+      return tokenizeSingleLineComment(next, start);
+    }
+
+    // "@dart"
+    next = advance();
+    while (identical($SPACE, next)) {
       next = advance();
+    }
+    if (!identical($AT, next)) {
+      return tokenizeSingleLineCommentRest(next, start, false);
+    }
+    next = advance();
+    if (!identical($d, next)) {
+      return tokenizeSingleLineCommentRest(next, start, false);
+    }
+    next = advance();
+    if (!identical($a, next)) {
+      return tokenizeSingleLineCommentRest(next, start, false);
+    }
+    next = advance();
+    if (!identical($r, next)) {
+      return tokenizeSingleLineCommentRest(next, start, false);
+    }
+    next = advance();
+    if (!identical($t, next)) {
+      return tokenizeSingleLineCommentRest(next, start, false);
+    }
+    next = advance();
+
+    // "="
+    while (identical($SPACE, next)) {
+      next = advance();
+    }
+    if (!identical($EQ, next)) {
+      return tokenizeSingleLineCommentRest(next, start, false);
+    }
+    next = advance();
+
+    // major
+    while (identical($SPACE, next)) {
+      next = advance();
+    }
+    int major = 0;
+    int majorStart = scanOffset;
+    while (isDigit(next)) {
+      major = major * 10 + next - $0;
+      next = advance();
+    }
+    if (scanOffset == majorStart) {
+      return tokenizeSingleLineCommentRest(next, start, false);
+    }
+
+    // minor
+    if (!identical($PERIOD, next)) {
+      return tokenizeSingleLineCommentRest(next, start, false);
+    }
+    next = advance();
+    int minor = 0;
+    int minorStart = scanOffset;
+    while (isDigit(next)) {
+      minor = minor * 10 + next - $0;
+      next = advance();
+    }
+    if (scanOffset == minorStart) {
+      return tokenizeSingleLineCommentRest(next, start, false);
+    }
+
+    // trailing spaces
+    while (identical($SPACE, next)) {
+      next = advance();
+    }
+    if (next != $LF && next != $CR && next != $EOF) {
+      return tokenizeSingleLineCommentRest(next, start, false);
+    }
+
+    var languageVersion = createLanguageVersionToken(start, major, minor);
+    if (languageVersionChanged != null) {
+      // TODO(danrubel): make this required and remove the languageVersion field
+      languageVersionChanged(this, languageVersion);
+    } else {
+      // TODO(danrubel): remove this hack and require listener to update
+      // the scanner's configuration.
+      configuration = ScannerConfiguration.classic;
+    }
+    if (includeComments) {
+      _appendToCommentStream(languageVersion);
+    }
+    return next;
+  }
+
+  int tokenizeSingleLineComment(int next, int start) {
+    bool dartdoc = identical($SLASH, peek());
+    next = advance();
+    return tokenizeSingleLineCommentRest(next, start, dartdoc);
+  }
+
+  int tokenizeSingleLineCommentRest(int next, int start, bool dartdoc) {
+    bool asciiOnly = true;
+    while (true) {
       if (next > 127) asciiOnly = false;
       if (identical($LF, next) ||
           identical($CR, next) ||
@@ -843,6 +1009,7 @@
         }
         return next;
       }
+      next = advance();
     }
   }
 
@@ -974,6 +1141,10 @@
     if (state == null || state.keyword == null) {
       return tokenizeIdentifier(next, start, allowDollar);
     }
+    if (!_enableNonNullable &&
+        (state.keyword == Keyword.LATE || state.keyword == Keyword.REQUIRED)) {
+      return tokenizeIdentifier(next, start, allowDollar);
+    }
     if (($A <= next && next <= $Z) ||
         ($0 <= next && next <= $9) ||
         identical(next, $_) ||
@@ -1262,17 +1433,9 @@
     appendSyntheticSubstringToken(TokenType.STRING, start, asciiOnly, suffix);
     // Ensure that the error is reported on a visible token
     int errorStart = tokenStart < stringOffset ? tokenStart : quoteStart;
-    if (reportErrors) {
-      addError(errorStart, stringOffset - errorStart,
-          templateUnterminatedString.withArguments(prefix, suffix));
-    } else {
-      appendErrorToken(
-          new UnterminatedString(prefix, errorStart, stringOffset));
-    }
+    appendErrorToken(new UnterminatedString(prefix, errorStart, stringOffset));
   }
 
-  void addError(int charOffset, int length, Message message);
-
   int advanceAfterError(bool shouldAdvance) {
     if (atEndOfFile()) return $EOF;
     if (shouldAdvance) {
@@ -1369,3 +1532,32 @@
     array = newArray;
   }
 }
+
+/// [ScannerConfiguration] contains information for configuring which tokens
+/// the scanner produces based upon the Dart language level.
+class ScannerConfiguration {
+  static const classic = ScannerConfiguration();
+  static const nonNullable = ScannerConfiguration(enableNonNullable: true);
+
+  /// Experimental flag for enabling scanning of NNBD tokens
+  /// such as 'required' and 'late'
+  final bool enableNonNullable;
+
+  /// Experimental flag for enabling scanning of `>>>`.
+  /// See https://github.com/dart-lang/language/issues/61
+  /// and https://github.com/dart-lang/language/issues/60
+  final bool enableGtGtGt;
+
+  /// Experimental flag for enabling scanning of `>>>=`.
+  /// See https://github.com/dart-lang/language/issues/61
+  /// and https://github.com/dart-lang/language/issues/60
+  final bool enableGtGtGtEq;
+
+  const ScannerConfiguration({
+    bool enableGtGtGt,
+    bool enableGtGtGtEq,
+    bool enableNonNullable,
+  })  : this.enableGtGtGt = enableGtGtGt ?? false,
+        this.enableGtGtGtEq = enableGtGtGtEq ?? false,
+        this.enableNonNullable = enableNonNullable ?? false;
+}
diff --git a/front_end/lib/src/fasta/scanner/array_based_scanner.dart b/front_end/lib/src/fasta/scanner/array_based_scanner.dart
index 39fba7f..22df483 100644
--- a/front_end/lib/src/fasta/scanner/array_based_scanner.dart
+++ b/front_end/lib/src/fasta/scanner/array_based_scanner.dart
@@ -6,8 +6,6 @@
 
 import 'error_token.dart' show ErrorToken, UnmatchedToken;
 
-import '../fasta_codes.dart' show LocatedMessage, Message;
-
 import '../../scanner/token.dart'
     show BeginToken, Keyword, KeywordToken, SyntheticToken, Token, TokenType;
 
@@ -22,17 +20,22 @@
 
 import 'characters.dart' show $LF, $STX;
 
-import 'abstract_scanner.dart' show AbstractScanner, closeBraceInfoFor;
+import 'abstract_scanner.dart'
+    show
+        AbstractScanner,
+        LanguageVersionChanged,
+        ScannerConfiguration,
+        closeBraceInfoFor;
 
 import '../util/link.dart' show Link;
 
 abstract class ArrayBasedScanner extends AbstractScanner {
-  List<LocatedMessage> errors;
-  bool reportErrors = false;
   bool hasErrors = false;
 
-  ArrayBasedScanner(bool includeComments, {int numberOfBytesHint})
-      : super(includeComments, numberOfBytesHint: numberOfBytesHint);
+  ArrayBasedScanner(ScannerConfiguration config, bool includeComments,
+      LanguageVersionChanged languageVersionChanged, {int numberOfBytesHint})
+      : super(config, includeComments, languageVersionChanged,
+            numberOfBytesHint: numberOfBytesHint);
 
   /**
    * The stack of open groups, e.g [: { ... ( .. :]
@@ -367,10 +370,4 @@
     begin.endGroup = tail;
     appendErrorToken(new UnmatchedToken(begin));
   }
-
-  void addError(int charOffset, int length, Message message) {
-    hasErrors = true;
-    (errors ??= <LocatedMessage>[])
-        .add(new LocatedMessage(null, charOffset, length, message));
-  }
 }
diff --git a/front_end/lib/src/fasta/scanner/characters.dart b/front_end/lib/src/fasta/scanner/characters.dart
index e9f1e6f..21edbe7 100644
--- a/front_end/lib/src/fasta/scanner/characters.dart
+++ b/front_end/lib/src/fasta/scanner/characters.dart
@@ -116,6 +116,10 @@
 const int $LAST_SURROGATE = 0xdfff;
 const int $LAST_CODE_POINT = 0x10ffff;
 
+bool isDigit(int characterCode) {
+  return $0 <= characterCode && characterCode <= $9;
+}
+
 bool isHexDigit(int characterCode) {
   if (characterCode <= $9) return $0 <= characterCode;
   characterCode |= $a ^ $A;
diff --git a/front_end/lib/src/fasta/scanner/scanner_main.dart b/front_end/lib/src/fasta/scanner/scanner_main.dart
index 848b65d..fd3c030 100644
--- a/front_end/lib/src/fasta/scanner/scanner_main.dart
+++ b/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/front_end/lib/src/fasta/scanner/string_scanner.dart b/front_end/lib/src/fasta/scanner/string_scanner.dart
index b5cb240..7fa5203 100644
--- a/front_end/lib/src/fasta/scanner/string_scanner.dart
+++ b/front_end/lib/src/fasta/scanner/string_scanner.dart
@@ -8,9 +8,13 @@
 
 import '../../scanner/token.dart' as analyzer show StringToken;
 
+import 'abstract_scanner.dart'
+    show LanguageVersionChanged, ScannerConfiguration;
+
 import 'array_based_scanner.dart' show ArrayBasedScanner;
 
-import 'token.dart' show CommentToken, DartDocToken, StringToken;
+import 'token.dart'
+    show CommentToken, DartDocToken, LanguageVersionToken, StringToken;
 
 import 'error_token.dart' show ErrorToken;
 
@@ -26,9 +30,11 @@
   int scanOffset = -1;
 
   StringScanner(String string,
-      {bool includeComments: false, bool scanLazyAssignmentOperators: false})
+      {ScannerConfiguration configuration,
+      bool includeComments: false,
+      LanguageVersionChanged languageVersionChanged})
       : string = ensureZeroTermination(string),
-        super(includeComments);
+        super(configuration, includeComments, languageVersionChanged);
 
   static String ensureZeroTermination(String string) {
     return (string.isEmpty || string.codeUnitAt(string.length - 1) != 0)
@@ -85,5 +91,13 @@
         canonicalize: true);
   }
 
+  @override
+  LanguageVersionToken createLanguageVersionToken(
+      int start, int major, int minor) {
+    return new LanguageVersionToken.fromSubstring(
+        string, start, scanOffset, tokenStart, major, minor,
+        canonicalize: true);
+  }
+
   bool atEndOfFile() => scanOffset >= string.length - 1;
 }
diff --git a/front_end/lib/src/fasta/scanner/token.dart b/front_end/lib/src/fasta/scanner/token.dart
index f10081d..e347dc2 100644
--- a/front_end/lib/src/fasta/scanner/token.dart
+++ b/front_end/lib/src/fasta/scanner/token.dart
@@ -187,6 +187,41 @@
   }
 }
 
+/**
+ * A specialized comment token representing a language version
+ * (e.g. '// @dart = 2.1').
+ */
+class LanguageVersionToken extends CommentToken {
+  /**
+   * The major language version.
+   */
+  int major;
+
+  /**
+   * The minor language version.
+   */
+  int minor;
+
+  LanguageVersionToken.from(String text, int offset, this.major, this.minor)
+      : super.fromString(TokenType.SINGLE_LINE_COMMENT, text, offset);
+
+  LanguageVersionToken.fromSubstring(
+      String string, int start, int end, int tokenStart, this.major, this.minor,
+      {bool canonicalize})
+      : super.fromSubstring(
+            TokenType.SINGLE_LINE_COMMENT, string, start, end, tokenStart,
+            canonicalize: canonicalize);
+
+  LanguageVersionToken.fromUtf8Bytes(List<int> bytes, int start, int end,
+      int tokenStart, this.major, this.minor)
+      : super.fromUtf8Bytes(
+            TokenType.SINGLE_LINE_COMMENT, bytes, start, end, true, tokenStart);
+
+  @override
+  LanguageVersionToken copy() =>
+      new LanguageVersionToken.from(lexeme, offset, major, minor);
+}
+
 class DartDocToken extends CommentToken
     implements analyzer.DocumentationCommentToken {
   /**
@@ -299,6 +334,7 @@
       identical(value, "+") ||
       identical(value, "<<") ||
       identical(value, ">>") ||
+      identical(value, ">>>") ||
       identical(value, ">=") ||
       identical(value, ">") ||
       identical(value, "<=") ||
diff --git a/front_end/lib/src/fasta/scanner/token_constants.dart b/front_end/lib/src/fasta/scanner/token_constants.dart
index f29765c..fff742e 100644
--- a/front_end/lib/src/fasta/scanner/token_constants.dart
+++ b/front_end/lib/src/fasta/scanner/token_constants.dart
@@ -88,3 +88,4 @@
 const int GENERIC_METHOD_TYPE_LIST_TOKEN = GENERIC_METHOD_TYPE_ASSIGN_TOKEN + 1;
 const int GT_GT_GT_TOKEN = GENERIC_METHOD_TYPE_LIST_TOKEN + 1;
 const int PERIOD_PERIOD_PERIOD_QUESTION_TOKEN = GT_GT_GT_TOKEN + 1;
+const int GT_GT_GT_EQ_TOKEN = PERIOD_PERIOD_PERIOD_QUESTION_TOKEN + 1;
diff --git a/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart b/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart
index eec14d4..e847390 100644
--- a/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart
+++ b/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart
@@ -12,7 +12,11 @@
 
 import '../scanner.dart' show unicodeReplacementCharacter;
 
-import 'token.dart' show CommentToken, DartDocToken, StringToken;
+import 'abstract_scanner.dart'
+    show LanguageVersionChanged, ScannerConfiguration;
+
+import 'token.dart'
+    show CommentToken, DartDocToken, LanguageVersionToken, StringToken;
 
 import 'array_based_scanner.dart' show ArrayBasedScanner;
 
@@ -81,8 +85,12 @@
    * array whose last element is '0' to signal the end of the file. If this
    * is not the case, the entire array is copied before scanning.
    */
-  Utf8BytesScanner(this.bytes, {bool includeComments: false})
-      : super(includeComments, numberOfBytesHint: bytes.length) {
+  Utf8BytesScanner(this.bytes,
+      {ScannerConfiguration configuration,
+      bool includeComments: false,
+      LanguageVersionChanged languageVersionChanged})
+      : super(configuration, includeComments, languageVersionChanged,
+            numberOfBytesHint: bytes.length) {
     assert(bytes.last == 0);
     // Skip a leading BOM.
     if (containsBomAt(0)) byteOffset += 3;
@@ -232,5 +240,12 @@
         type, bytes, start, byteOffset + extraOffset, asciiOnly, tokenStart);
   }
 
+  @override
+  LanguageVersionToken createLanguageVersionToken(
+      int start, int major, int minor) {
+    return new LanguageVersionToken.fromUtf8Bytes(
+        bytes, start, byteOffset, tokenStart, major, minor);
+  }
+
   bool atEndOfFile() => byteOffset >= bytes.length - 1;
 }
diff --git a/front_end/lib/src/fasta/source/diet_listener.dart b/front_end/lib/src/fasta/source/diet_listener.dart
index 88edaba..1125c14 100644
--- a/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/front_end/lib/src/fasta/source/diet_listener.dart
@@ -287,8 +287,8 @@
   }
 
   @override
-  void endFields(Token staticToken, Token covariantToken, Token varFinalOrConst,
-      int count, Token beginToken, Token endToken) {
+  void endFields(Token staticToken, Token covariantToken, Token lateToken,
+      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
     debugEvent("Fields");
     buildFields(count, beginToken, false);
   }
@@ -318,8 +318,14 @@
   }
 
   @override
-  void endTopLevelFields(Token staticToken, Token covariantToken,
-      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
+  void endTopLevelFields(
+      Token staticToken,
+      Token covariantToken,
+      Token lateToken,
+      Token varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
     debugEvent("TopLevelFields");
     buildFields(count, beginToken, true);
   }
diff --git a/front_end/lib/src/fasta/source/outline_builder.dart b/front_end/lib/src/fasta/source/outline_builder.dart
index 32a7071..24d3a08 100644
--- a/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/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
@@ -1005,8 +1017,10 @@
   }
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token covariantToken,
-      Token varFinalOrConst) {
+  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
+      Token covariantToken, Token varFinalOrConst) {
+    // TODO(danrubel): handle required token
+    reportNonNullableModifierError(requiredToken);
     push((covariantToken != null ? covariantMask : 0) |
         Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme));
   }
@@ -1168,13 +1182,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
@@ -1274,9 +1289,17 @@
   }
 
   @override
-  void endTopLevelFields(Token staticToken, Token covariantToken,
-      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
+  void endTopLevelFields(
+      Token staticToken,
+      Token covariantToken,
+      Token lateToken,
+      Token varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
     debugEvent("endTopLevelFields");
+    // TODO(danrubel): handle NNBD 'late' modifier
+    reportNonNullableModifierError(lateToken);
     List<FieldInfo> fieldInfos = popFieldInfos(count);
     TypeBuilder type = nullIfParserRecovery(pop());
     int modifiers = (staticToken != null ? staticMask : 0) |
@@ -1291,9 +1314,11 @@
   }
 
   @override
-  void endFields(Token staticToken, Token covariantToken, Token varFinalOrConst,
-      int count, Token beginToken, Token endToken) {
+  void endFields(Token staticToken, Token covariantToken, Token lateToken,
+      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
     debugEvent("Fields");
+    // TODO(danrubel): handle NNBD 'late' modifier
+    reportNonNullableModifierError(lateToken);
     List<FieldInfo> fieldInfos = popFieldInfos(count);
     TypeBuilder type = pop();
     int modifiers = (staticToken != null ? staticMask : 0) |
diff --git a/front_end/lib/src/fasta/source/scope_listener.dart b/front_end/lib/src/fasta/source/scope_listener.dart
index c49ce08..80db65e 100644
--- a/front_end/lib/src/fasta/source/scope_listener.dart
+++ b/front_end/lib/src/fasta/source/scope_listener.dart
@@ -94,6 +94,12 @@
   }
 
   @override
+  void beginForControlFlow(Token awaitToken, Token forToken) {
+    debugEvent("beginForControlFlow");
+    enterLocalScope("for in a collection");
+  }
+
+  @override
   void beginBlock(Token token) {
     debugEvent("beginBlock");
     enterLocalScope("block");
@@ -102,7 +108,7 @@
   @override
   void beginSwitchBlock(Token token) {
     debugEvent("beginSwitchBlock");
-    enterLocalScope("swithc block");
+    enterLocalScope("switch block");
     enterBreakTarget(token.charOffset);
   }
 
diff --git a/front_end/lib/src/fasta/source/source_class_builder.dart b/front_end/lib/src/fasta/source/source_class_builder.dart
index bfcb069..be97aab 100644
--- a/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -7,8 +7,6 @@
 import 'package:kernel/ast.dart'
     show Class, Constructor, Member, Supertype, TreeNode;
 
-import '../../base/instrumentation.dart' show Instrumentation;
-
 import '../dill/dill_member_builder.dart' show DillMemberBuilder;
 
 import '../fasta_codes.dart'
@@ -259,13 +257,6 @@
   }
 
   @override
-  void instrumentTopLevelInference(Instrumentation instrumentation) {
-    scope.forEach((name, declaration) {
-      declaration.instrumentTopLevelInference(instrumentation);
-    });
-  }
-
-  @override
   int finishPatch() {
     if (!isPatch) return 0;
 
diff --git a/front_end/lib/src/fasta/source/source_library_builder.dart b/front_end/lib/src/fasta/source/source_library_builder.dart
index 3d178d3..07d9eb6 100644
--- a/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -8,8 +8,6 @@
 
 import '../../base/resolve_relative_uri.dart' show resolveRelativeUri;
 
-import '../../base/instrumentation.dart' show Instrumentation;
-
 import '../../scanner/token.dart' show Token;
 
 import '../builder/builder.dart'
@@ -380,7 +378,9 @@
       int modifiers,
       T mixinApplication,
       List<T> interfaces,
-      int charOffset);
+      int startCharOffset,
+      int charOffset,
+      int charEndOffset);
 
   void addField(
       String documentationComment,
@@ -455,6 +455,7 @@
       List<MetadataBuilder> metadata,
       String name,
       List<EnumConstantInfo> enumConstantInfos,
+      int startCharOffset,
       int charOffset,
       int charEndOffset);
 
@@ -643,7 +644,7 @@
       // If [library] is null, we have already reported a problem that this
       // part is orphaned.
       List<LocatedMessage> context = <LocatedMessage>[
-        messagePartInPartLibraryContext.withLocation(library.fileUri, 0, 1),
+        messagePartInPartLibraryContext.withLocation(library.fileUri, -1, 1),
       ];
       for (int offset in partOffsets) {
         addProblem(messagePartInPart, offset, noLength, fileUri,
@@ -657,7 +658,7 @@
     parts.clear();
     if (exporters.isNotEmpty) {
       List<LocatedMessage> context = <LocatedMessage>[
-        messagePartExportContext.withLocation(fileUri, 0, 1),
+        messagePartExportContext.withLocation(fileUri, -1, 1),
       ];
       for (Export export in exporters) {
         export.exporter.addProblem(
@@ -881,14 +882,6 @@
   }
 
   @override
-  void instrumentTopLevelInference(Instrumentation instrumentation) {
-    Iterator<Declaration> iterator = this.iterator;
-    while (iterator.moveNext()) {
-      iterator.current.instrumentTopLevelInference(instrumentation);
-    }
-  }
-
-  @override
   void recordAccess(int charOffset, int length, Uri fileUri) {
     accessors.add(fileUri);
     accessors.add(charOffset);
diff --git a/front_end/lib/src/fasta/source/source_loader.dart b/front_end/lib/src/fasta/source/source_loader.dart
index dee067a..4c3b6c9 100644
--- a/front_end/lib/src/fasta/source/source_loader.dart
+++ b/front_end/lib/src/fasta/source/source_loader.dart
@@ -33,8 +33,7 @@
 
 import '../../api_prototype/file_system.dart';
 
-import '../../base/instrumentation.dart'
-    show Instrumentation, InstrumentationValueLiteral;
+import '../../base/instrumentation.dart' show Instrumentation;
 
 import '../blacklisted_classes.dart' show blacklistedCoreClasses;
 
@@ -69,8 +68,6 @@
         templateSourceOutlineSummary,
         templateUntranslatableUri;
 
-import '../fasta_codes.dart' as fasta_codes;
-
 import '../kernel/kernel_shadow_ast.dart'
     show ShadowClass, ShadowTypeInferenceEngine;
 
@@ -104,12 +101,10 @@
 
 import '../parser.dart' show Parser, lengthForToken, offsetForToken;
 
-import '../problems.dart' show internalProblem, unhandled;
+import '../problems.dart' show internalProblem;
 
 import '../scanner.dart' show ErrorToken, ScannerResult, Token, scan;
 
-import '../severity.dart' show Severity;
-
 import '../type_inference/interface_resolver.dart' show InterfaceResolver;
 
 import 'diet_listener.dart' show DietListener;
@@ -208,7 +203,22 @@
     Token token = result.tokens;
     if (!suppressLexicalErrors) {
       List<int> source = getSource(bytes);
-      target.addSourceInformation(library.fileUri, result.lineStarts, source);
+      Uri importUri = library.uri;
+      if (library.isPatch) {
+        // For patch files we create a "fake" import uri.
+        // We cannot use the import uri from the patched libarary because
+        // several different files would then have the same import uri,
+        // and the VM does not support that. Also, what would, for instance,
+        // setting a breakpoint on line 42 of some import uri mean, if the uri
+        // represented several files?
+        List<String> newPathSegments =
+            new List<String>.from(importUri.pathSegments);
+        newPathSegments.add(library.fileUri.pathSegments.last);
+        newPathSegments[0] = "${newPathSegments[0]}-patch";
+        importUri = importUri.replace(pathSegments: newPathSegments);
+      }
+      target.addSourceInformation(
+          importUri, library.fileUri, result.lineStarts, source);
     }
     while (token is ErrorToken) {
       if (!suppressLexicalErrors) {
@@ -229,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} */");
     }
@@ -998,13 +1014,6 @@
     }
 
     typeInferenceEngine.finishTopLevelInitializingFormals();
-    if (instrumentation != null) {
-      builders.forEach((Uri uri, LibraryBuilder library) {
-        if (library.loader == this) {
-          library.instrumentTopLevelInference(instrumentation);
-        }
-      });
-    }
     interfaceResolver = null;
     // Since finalization of covariance may have added forwarding stubs, we need
     // to recompute the class hierarchy so that method compilation will properly
@@ -1020,15 +1029,17 @@
       node.accept(collectionTransformer ??= new CollectionTransformer(this));
     }
     if (transformSetLiterals) {
-      node.accept(setLiteralTransformer ??= new SetLiteralTransformer(this));
+      node.accept(setLiteralTransformer ??= new SetLiteralTransformer(this,
+          transformConst: !target.enableConstantUpdate2018));
     }
   }
 
   void transformListPostInference(List<TreeNode> list,
       bool transformSetLiterals, bool transformCollections) {
     if (transformSetLiterals) {
-      SetLiteralTransformer transformer =
-          setLiteralTransformer ??= new SetLiteralTransformer(this);
+      SetLiteralTransformer transformer = setLiteralTransformer ??=
+          new SetLiteralTransformer(this,
+              transformConst: !target.enableConstantUpdate2018);
       for (int i = 0; i < list.length; ++i) {
         list[i] = list[i].accept(transformer);
       }
@@ -1074,67 +1085,6 @@
         isTopLevel: isTopLevel);
   }
 
-  void recordMessage(Severity severity, Message message, int charOffset,
-      int length, Uri fileUri,
-      {List<LocatedMessage> context}) {
-    if (instrumentation == null) return;
-
-    if (charOffset == -1 &&
-        (message.code == fasta_codes.codeConstConstructorWithBody ||
-            message.code == fasta_codes.codeConstructorNotFound ||
-            message.code == fasta_codes.codeSuperclassHasNoDefaultConstructor ||
-            message.code == fasta_codes.codeTypeArgumentsOnTypeVariable ||
-            message.code == fasta_codes.codeUnspecified)) {
-      // TODO(ahe): All warnings should have a charOffset, but currently, some
-      // warnings lack them.
-      return;
-    }
-
-    String severityString;
-    switch (severity) {
-      case Severity.error:
-        severityString = "error";
-        break;
-
-      case Severity.internalProblem:
-        severityString = "internal problem";
-        break;
-
-      case Severity.warning:
-        severityString = "warning";
-        break;
-
-      case Severity.errorLegacyWarning:
-        // Should have been resolved to either error or warning at this point.
-        // Use a property name expressing that, in case it slips through.
-        severityString = "unresolved severity";
-        break;
-
-      case Severity.context:
-        severityString = "context";
-        break;
-
-      case Severity.ignored:
-        unhandled("IGNORED", "recordMessage", charOffset, fileUri);
-        return;
-    }
-    instrumentation.record(
-        fileUri,
-        charOffset,
-        severityString,
-        // TODO(ahe): Should I add an InstrumentationValue for Message?
-        new InstrumentationValueLiteral(message.code.name));
-    if (context != null) {
-      for (LocatedMessage contextMessage in context) {
-        instrumentation.record(
-            contextMessage.uri,
-            contextMessage.charOffset,
-            "context",
-            new InstrumentationValueLiteral(contextMessage.code.name));
-      }
-    }
-  }
-
   void releaseAncillaryResources() {
     hierarchy = null;
     typeInferenceEngine = null;
@@ -1192,6 +1142,8 @@
 
 class Symbol {}
 
+class Set {}
+
 class Type {}
 
 class _InvocationMirror {
@@ -1277,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/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart b/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
index c818a43..6c48edf 100644
--- a/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
+++ b/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
@@ -139,6 +139,10 @@
 
   Uri get uri => state.uri;
 
+  void logEvent(String name) {
+    throw new UnimplementedError(name);
+  }
+
   void debugEvent(String name, Token token) {
     // state.trace(name, token);
   }
@@ -389,15 +393,21 @@
   }
 
   @override
+  void handleElseControlFlow(Token token) {}
+
+  @override
   void endIfControlFlow(Token token) {
-    // TODO(danrubel) add support for if control flow collection entries
-    // but for now this is ignored and an error reported in the body builder.
+    state.pop(); // Element.
+    state.pop(); // Condition.
+    state.pushNull("%IfControlFlow%", token);
   }
 
   @override
   void endIfElseControlFlow(Token token) {
-    // TODO(danrubel) add support for if control flow collection entries
-    // but for now this is ignored and an error reported in the body builder.
+    state.pop(); // Else element.
+    state.pop(); // Then element.
+    state.pop(); // Condition.
+    state.pushNull("%IfElseControlFlow%", token);
   }
 
   @override
@@ -540,8 +550,8 @@
   }
 
   @override
-  void endFields(Token staticToken, Token covariantToken, Token varFinalOrConst,
-      int count, Token beginToken, Token endToken) {
+  void endFields(Token staticToken, Token covariantToken, Token lateToken,
+      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
     debugEvent("Fields", staticToken);
     state.discard(count); // Field names.
     state.checkEmpty(endToken);
@@ -1228,8 +1238,14 @@
   }
 
   @override
-  void endTopLevelFields(Token staticToken, Token covariantToken,
-      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
+  void endTopLevelFields(
+      Token staticToken,
+      Token covariantToken,
+      Token lateToken,
+      Token varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
     debugEvent("TopLevelFields", staticToken);
     state.discard(count); // Field names.
     state.checkEmpty(endToken);
diff --git a/front_end/lib/src/fasta/target_implementation.dart b/front_end/lib/src/fasta/target_implementation.dart
index 037e74e..6e82a7d 100644
--- a/front_end/lib/src/fasta/target_implementation.dart
+++ b/front_end/lib/src/fasta/target_implementation.dart
@@ -131,7 +131,7 @@
   }
 
   void addSourceInformation(
-      Uri uri, List<int> lineStarts, List<int> sourceCode);
+      Uri importUri, Uri fileUri, List<int> lineStarts, List<int> sourceCode);
 
   void readPatchFiles(covariant LibraryBuilder library) {}
 
diff --git a/front_end/lib/src/fasta/testing/validating_instrumentation.dart b/front_end/lib/src/fasta/testing/validating_instrumentation.dart
index b721d4e..5547c5f 100644
--- a/front_end/lib/src/fasta/testing/validating_instrumentation.dart
+++ b/front_end/lib/src/fasta/testing/validating_instrumentation.dart
@@ -30,7 +30,6 @@
   /// Map from feature names to the property names they are short for.
   static const _FEATURES = const {
     'inference': const [
-      'topType',
       'typeArg',
       'typeArgs',
       'promotedType',
@@ -39,10 +38,8 @@
       'target',
     ],
     'checks': const [
-      'covariance',
       'checkGetterReturn',
       'checkReturn',
-      'forwardingStub',
       'genericContravariant',
     ],
   };
diff --git a/front_end/lib/src/fasta/type_inference/interface_resolver.dart b/front_end/lib/src/fasta/type_inference/interface_resolver.dart
index 65db7c3..5c8dbfa 100644
--- a/front_end/lib/src/fasta/type_inference/interface_resolver.dart
+++ b/front_end/lib/src/fasta/type_inference/interface_resolver.dart
@@ -12,6 +12,7 @@
         Field,
         FunctionNode,
         FunctionType,
+        InvalidType,
         Member,
         Name,
         NamedExpression,
@@ -37,10 +38,7 @@
     show HierarchyBasedTypeEnvironment;
 
 import '../../base/instrumentation.dart'
-    show
-        Instrumentation,
-        InstrumentationValueForForwardingStub,
-        InstrumentationValueLiteral;
+    show Instrumentation, InstrumentationValueLiteral;
 
 import '../builder/builder.dart' show LibraryBuilder;
 
@@ -119,23 +117,26 @@
     var declaredMethod = _declaredMethod;
     var kind = declaredMethod.kind;
     var overriddenTypes = _computeAccessorOverriddenTypes();
+    DartType inferredType;
     if (isCircular) {
+      inferredType = const InvalidType();
       _library.addProblem(
           templateCantInferTypeDueToCircularity.withArguments(_name),
           _offset,
           noLength,
           _fileUri);
     } else {
-      var inferredType = _interfaceResolver.matchTypes(
+      inferredType = _interfaceResolver.matchTypes(
           overriddenTypes, _library, _name, _fileUri, _offset);
-      if (declaredMethod is SyntheticAccessor) {
-        declaredMethod._field.type = inferredType;
+    }
+    if (declaredMethod is SyntheticAccessor) {
+      declaredMethod._field.type = inferredType;
+      declaredMethod._field.initializer = null;
+    } else {
+      if (kind == ProcedureKind.Getter) {
+        declaredMethod.function.returnType = inferredType;
       } else {
-        if (kind == ProcedureKind.Getter) {
-          declaredMethod.function.returnType = inferredType;
-        } else {
-          declaredMethod.function.positionalParameters[0].type = inferredType;
-        }
+        declaredMethod.function.positionalParameters[0].type = inferredType;
       }
     }
   }
@@ -374,8 +375,7 @@
     }
     for (int i = 0; i < interfaceTypeParameters.length; i++) {
       var typeParameter = interfaceTypeParameters[i];
-      var isGenericCovariantImpl = typeParameter.isGenericCovariantImpl ||
-          needsCheck(typeParameter.bound);
+      var isGenericCovariantImpl = typeParameter.isGenericCovariantImpl;
       var superTypeParameter = typeParameter;
       for (int j = _start; j < _end; j++) {
         var otherMember = _finalizedCandidate(j);
@@ -946,11 +946,6 @@
           resolution.isSyntheticForwarder &&
           identical(resolution.enclosingClass, class_)) {
         class_.addMember(resolution);
-        _instrumentation?.record(
-            class_.location.file,
-            class_.fileOffset,
-            'forwardingStub',
-            new InstrumentationValueForForwardingStub(resolution));
       }
     }
   }
@@ -977,14 +972,6 @@
     return candidates;
   }
 
-  /// If instrumentation is enabled, records the covariance bits for the given
-  /// [class_] to [_instrumentation].
-  void recordInstrumentation(Class class_) {
-    if (_instrumentation != null) {
-      _recordInstrumentation(class_);
-    }
-  }
-
   /// Creates the appropriate [InferenceNode] for inferring [procedure] in the
   /// context of [class_].
   ///
@@ -1081,51 +1068,6 @@
     return result;
   }
 
-  /// Records the covariance bits for the given [class_] to [_instrumentation].
-  ///
-  /// Caller is responsible for checking whether [_instrumentation] is `null`.
-  void _recordInstrumentation(Class class_) {
-    var uri = class_.fileUri;
-    void recordCovariance(int fileOffset, bool isExplicitlyCovariant,
-        bool isGenericCovariantImpl) {
-      var covariance = <String>[];
-      if (isExplicitlyCovariant) covariance.add('explicit');
-      if (!isExplicitlyCovariant && isGenericCovariantImpl) {
-        covariance.add('genericImpl');
-      }
-      if (covariance.isNotEmpty) {
-        _instrumentation.record(uri, fileOffset, 'covariance',
-            new InstrumentationValueLiteral(covariance.join(', ')));
-      }
-    }
-
-    for (var procedure in class_.procedures) {
-      if (procedure.isStatic) continue;
-      // Forwarding stubs are annotated separately
-      if (procedure.isSyntheticForwarder) {
-        continue;
-      }
-      void recordFormalAnnotations(VariableDeclaration formal) {
-        recordCovariance(formal.fileOffset, formal.isCovariant,
-            formal.isGenericCovariantImpl);
-      }
-
-      void recordTypeParameterAnnotations(TypeParameter typeParameter) {
-        recordCovariance(typeParameter.fileOffset, false,
-            typeParameter.isGenericCovariantImpl);
-      }
-
-      procedure.function.positionalParameters.forEach(recordFormalAnnotations);
-      procedure.function.namedParameters.forEach(recordFormalAnnotations);
-      procedure.function.typeParameters.forEach(recordTypeParameterAnnotations);
-    }
-    for (var field in class_.fields) {
-      if (field.isStatic) continue;
-      recordCovariance(
-          field.fileOffset, field.isCovariant, field.isGenericCovariantImpl);
-    }
-  }
-
   /// Determines the appropriate substitution to translate type parameters
   /// mentioned in the given [candidate] to type parameters on [class_].
   Substitution _substitutionFor(Procedure candidate, Class class_) {
diff --git a/front_end/lib/src/fasta/type_inference/standard_bounds.dart b/front_end/lib/src/fasta/type_inference/standard_bounds.dart
index 2d5cb3a..2a97c19 100644
--- a/front_end/lib/src/fasta/type_inference/standard_bounds.dart
+++ b/front_end/lib/src/fasta/type_inference/standard_bounds.dart
@@ -12,6 +12,7 @@
         DynamicType,
         FunctionType,
         InterfaceType,
+        InvalidType,
         NamedType,
         TypeParameterType,
         VoidType;
@@ -177,8 +178,12 @@
       return _functionStandardUpperBound(type1, type2);
     }
 
+    if (type1 is InvalidType || type2 is InvalidType) {
+      return const InvalidType();
+    }
+
     // Should never happen. As a defensive measure, return the dynamic type.
-    assert(false);
+    assert(false, "type1 = $type1; type2 = $type2");
     return const DynamicType();
   }
 
diff --git a/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index a3251d6..bbf090a 100644
--- a/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -11,6 +11,7 @@
         Field,
         FunctionType,
         InterfaceType,
+        InvalidType,
         Member,
         TypeParameter,
         TypeParameterType,
@@ -64,7 +65,7 @@
             field.fileOffset,
             noLength,
             field.fileUri);
-        inferredType = const DynamicType();
+        inferredType = const InvalidType();
       }
       field.setInferredType(
           _typeInferenceEngine, typeInferrer.uri, inferredType);
diff --git a/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 98cbf73..05052a6 100644
--- a/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -22,6 +22,7 @@
         FunctionType,
         Instantiation,
         InterfaceType,
+        InvalidType,
         InvocationExpression,
         Let,
         ListLiteral,
@@ -677,21 +678,22 @@
     if (!typeSchemaEnvironment.isSubtypeOf(expectedType, actualType)) {
       // Error: not assignable.  Perform error recovery.
       var parent = expression.parent;
-      var errorNode = helper.wrapInProblem(
-          new AsExpression(
-              expression,
-              // TODO(ahe): The outline phase doesn't correctly remove invalid
-              // uses of type variables, for example, on static members. Once
-              // that has been fixed, we should always be able to use
-              // [expectedType] directly here.
-              hasAnyTypeVariables(expectedType)
-                  ? const BottomType()
-                  : expectedType)
-            ..isTypeError = true
-            ..fileOffset = expression.fileOffset,
-          (template ?? templateInvalidAssignment)
-              .withArguments(actualType, expectedType),
-          noLength);
+      Expression errorNode = new AsExpression(
+          expression,
+          // TODO(ahe): The outline phase doesn't correctly remove invalid
+          // uses of type variables, for example, on static members. Once
+          // that has been fixed, we should always be able to use
+          // [expectedType] directly here.
+          hasAnyTypeVariables(expectedType) ? const BottomType() : expectedType)
+        ..isTypeError = true
+        ..fileOffset = expression.fileOffset;
+      if (expectedType is! InvalidType && actualType is! InvalidType) {
+        errorNode = helper.wrapInProblem(
+            errorNode,
+            (template ?? templateInvalidAssignment)
+                .withArguments(actualType, expectedType),
+            noLength);
+      }
       parent?.replaceChild(expression, errorNode);
       return errorNode;
     } else {
@@ -759,6 +761,7 @@
     if (!isTopLevel &&
         interfaceMember == null &&
         receiverType is! DynamicType &&
+        receiverType is! InvalidType &&
         !(receiverType == coreTypes.functionClass.rawType &&
             name.name == 'call') &&
         errorTemplate != null) {
diff --git a/front_end/lib/src/kernel_generator_impl.dart b/front_end/lib/src/kernel_generator_impl.dart
index 61d49fb..0a4fad1 100644
--- a/front_end/lib/src/kernel_generator_impl.dart
+++ b/front_end/lib/src/kernel_generator_impl.dart
@@ -117,7 +117,7 @@
             libraryFilter: kernelTarget.isSourceLibrary);
       }
 
-      // Copy the component to exclude the uriToSource map from the summary.
+      // Create the requested component ("truncating" or not).
       //
       // Note: we don't pass the library argument to the constructor to
       // preserve the the libraries parent pointer (it should continue to point
@@ -128,6 +128,7 @@
                 ? kernelTarget.loader.libraries
                 : summaryComponent.libraries);
       trimmedSummaryComponent.metadata.addAll(summaryComponent.metadata);
+      trimmedSummaryComponent.uriToSource.addAll(summaryComponent.uriToSource);
 
       // As documented, we only run outline transformations when we are building
       // summaries without building a full component (at this time, that's
@@ -136,7 +137,9 @@
         options.target.performOutlineTransformations(trimmedSummaryComponent);
         options.ticker.logMs("Transformed outline");
       }
-      summary = serializeComponent(trimmedSummaryComponent);
+      // Don't include source (but do add it above to include importUris).
+      summary =
+          serializeComponent(trimmedSummaryComponent, includeSources: false);
       options.ticker.logMs("Generated outline");
     }
 
diff --git a/front_end/lib/src/scanner/errors.dart b/front_end/lib/src/scanner/errors.dart
index 9e54680..4a7bb1d 100644
--- a/front_end/lib/src/scanner/errors.dart
+++ b/front_end/lib/src/scanner/errors.dart
@@ -63,7 +63,7 @@
       const ScannerErrorCode(
           'UNTERMINATED_MULTI_LINE_COMMENT', "Unterminated multi-line comment.",
           correction: "Try terminating the comment with '*/', or "
-              "removing any unbalanced occurances of '/*'"
+              "removing any unbalanced occurrences of '/*'"
               " (because comments nest in Dart).");
 
   static const ScannerErrorCode UNTERMINATED_STRING_LITERAL =
@@ -174,22 +174,6 @@
   }
 }
 
-void translateScanError(
-    Code errorCode, int charOffset, int length, ReportError reportError) {
-  switch (errorCode.analyzerCodes?.first) {
-    case "UNTERMINATED_STRING_LITERAL":
-      // TODO(paulberry,ahe): Fasta reports the error location as the entire
-      // string; analyzer expects the end of the string.
-      reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
-          charOffset + length - 1, null);
-      break;
-
-    default:
-      throw new UnimplementedError(
-          '$errorCode "${errorCode.analyzerCodes?.first}"');
-  }
-}
-
 /**
  * Determines whether the given [charOffset], which came from the non-EOF token
  * [token], represents the end of the input.
diff --git a/front_end/lib/src/scanner/token.dart b/front_end/lib/src/scanner/token.dart
index 5a78cd2..0ffd35b 100644
--- a/front_end/lib/src/scanner/token.dart
+++ b/front_end/lib/src/scanner/token.dart
@@ -211,6 +211,8 @@
   static const Keyword IS =
       const Keyword("is", "IS", precedence: RELATIONAL_PRECEDENCE);
 
+  static const Keyword LATE = const Keyword("late", "LATE", isModifier: true);
+
   static const Keyword LIBRARY = const Keyword("library", "LIBRARY",
       isBuiltIn: true, isTopLevelKeyword: true);
 
@@ -236,6 +238,9 @@
 
   static const Keyword PATCH = const Keyword("patch", "PATCH", isPseudo: true);
 
+  static const Keyword REQUIRED =
+      const Keyword("required", "REQUIRED", isBuiltIn: true, isModifier: true);
+
   static const Keyword RETHROW = const Keyword("rethrow", "RETHROW");
 
   static const Keyword RETURN = const Keyword("return", "RETURN");
@@ -313,6 +318,7 @@
     IN,
     INTERFACE,
     IS,
+    LATE,
     LIBRARY,
     MIXIN,
     NATIVE,
@@ -323,6 +329,7 @@
     OPERATOR,
     PART,
     PATCH,
+    REQUIRED,
     RETHROW,
     RETURN,
     SET,
@@ -1279,6 +1286,10 @@
       '>>>', 'GT_GT_GT', SHIFT_PRECEDENCE, GT_GT_GT_TOKEN,
       isOperator: true, isUserDefinableOperator: true);
 
+  static const TokenType GT_GT_GT_EQ = const TokenType(
+      '>>>=', 'GT_GT_GT_EQ', ASSIGNMENT_PRECEDENCE, GT_GT_GT_EQ_TOKEN,
+      isOperator: true);
+
   static const TokenType HASH =
       const TokenType('#', 'HASH', NO_PRECEDENCE, HASH_TOKEN);
 
diff --git a/front_end/messages.status b/front_end/messages.status
index cfa04f1..0229457 100644
--- a/front_end/messages.status
+++ b/front_end/messages.status
@@ -31,18 +31,18 @@
 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
+ConflictingModifiers/script1: Fail
 ConflictsWithConstructor/example: Fail
 ConflictsWithFactory/analyzerCode: Fail
 ConflictsWithFactory/example: Fail
@@ -51,11 +51,8 @@
 ConflictsWithSetter/example: Fail
 ConflictsWithSetterWarning/example: Fail
 ConflictsWithTypeVariable/example: Fail
-ConstAfterFactory/script1: Fail
-ConstAndCovariant/script2: Fail
 ConstAndFinal/declaration3: Fail
 ConstAndFinal/declaration4: Fail
-ConstAndVar/script1: Fail
 ConstConstructorInSubclassOfMixinApplication/example: Fail
 ConstConstructorNonFinalField/example: Fail
 ConstConstructorRedirectionToNonConst/analyzerCode: Fail # The analyzer doesn't report this error.
@@ -64,23 +61,37 @@
 ConstEvalContext/analyzerCode: Fail # This is just used for displaying the context.
 ConstEvalContext/example: Fail # This is just used for displaying the context.
 ConstEvalDeferredLibrary/example: Fail
+ConstEvalDuplicateElement/example: Fail
 ConstEvalDuplicateKey/example: Fail
+ConstEvalElementImplementsEqual/example: Fail
 ConstEvalFailedAssertion/example: Fail
 ConstEvalFailedAssertionWithMessage/example: Fail
 ConstEvalFreeTypeParameter/analyzerCode: Fail
 ConstEvalFreeTypeParameter/example: Fail
 ConstEvalInvalidBinaryOperandType/analyzerCode: Fail # CONST_EVAL_TYPE_NUM / CONST_EVAL_TYPE_BOOL
 ConstEvalInvalidBinaryOperandType/example: Fail
+ConstEvalInvalidEqualsOperandType/analyzerCode: Fail
+ConstEvalInvalidEqualsOperandType/example: Fail
 ConstEvalInvalidMethodInvocation/example: Fail
+ConstEvalInvalidPropertyGet/example: Fail
 ConstEvalInvalidStaticInvocation/example: Fail
 ConstEvalInvalidStringInterpolationOperand/example: Fail
 ConstEvalInvalidSymbolName/example: Fail
 ConstEvalInvalidType/analyzerCode: Fail # CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH / CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH / CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH / ...
 ConstEvalInvalidType/example: Fail
+ConstEvalIterationInConstList/example: Fail
+ConstEvalIterationInConstMap/example: Fail
+ConstEvalIterationInConstSet/example: Fail
+ConstEvalKeyImplementsEqual/example: Fail
 ConstEvalNegativeShift/analyzerCode: Fail # http://dartbug.com/33481
 ConstEvalNegativeShift/example: Fail
 ConstEvalNonConstantLiteral/example: Fail
 ConstEvalNonConstantVariableGet/example: Fail
+ConstEvalNotListOrSetInSpread/example: Fail
+ConstEvalNotMapInSpread/example: Fail
+ConstEvalNullValue/example: Fail
+ConstEvalUnevaluated/analyzerCode: Fail
+ConstEvalUnevaluated/example: Fail
 ConstEvalZeroDivisor/example: Fail
 ConstFieldWithoutInitializer/example: Fail
 ConstructorNotFound/example: Fail
@@ -90,7 +101,6 @@
 ContinueWithoutLabelInCase/script1: Fail
 CouldNotParseUri/analyzerCode: Fail
 CouldNotParseUri/example: Fail
-CovariantAfterFinal/script1: Fail
 CovariantAfterVar/script1: Fail
 CovariantAndStatic/script1: Fail
 CovariantAndStatic/script2: Fail
@@ -239,6 +249,8 @@
 InvalidInitializer/example: Fail
 InvalidPackageUri/analyzerCode: Fail
 InvalidPackageUri/example: Fail
+InvalidSuperInInitializer/example: Fail
+InvalidThisInInitializer/example: Fail
 InvalidUseOfNullAwareAccess/example: Fail
 InvalidVoid/script1: Fail
 InvalidVoid/script2: Fail
@@ -261,6 +273,7 @@
 MissingMain/example: Fail
 MissingPrefixInDeferredImport/example: Fail
 MixinInferenceNoMatchingClass/example: Fail
+ModifierOutOfOrder/script1: Fail
 MultipleExtends/script: Fail
 MultipleImplements/script: Fail
 MultipleLibraryDirectives/example: Fail
@@ -277,11 +290,11 @@
 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
 NotAnLvalue/example: Fail
+NotBinaryOperator/analyzerCode: Fail
 NotConstantExpression/example: Fail
 OperatorMinusParameterMismatch/example: Fail
 OperatorParameterMismatch0/analyzerCode: Fail
@@ -343,15 +356,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/front_end/messages.yaml b/front_end/messages.yaml
index 195f967..53c901f 100644
--- a/front_end/messages.yaml
+++ b/front_end/messages.yaml
@@ -85,9 +85,21 @@
 ConstEvalContext:
   template: "While analyzing:"
 
+ConstEvalDuplicateElement:
+  template: "The element '#constant' conflicts with another existing element in the set."
+  analyzerCode: EQUAL_ELEMENTS_IN_CONST_SET
+
 ConstEvalDuplicateKey:
   template: "The key '#constant' conflicts with another existing key in the map."
-  analyzerCode: EQUAL_KEYS_IN_MAP
+  analyzerCode: EQUAL_KEYS_IN_CONST_MAP
+
+ConstEvalElementImplementsEqual:
+  template: "The element '#constant' does not have a primitive operator '=='."
+  analyzerCode: CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS
+
+ConstEvalKeyImplementsEqual:
+  template: "The key '#constant' does not have a primitive operator '=='."
+  analyzerCode: CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
 
 ConstEvalNonConstantLiteral:
   template: "Can't have a non-constant #string literal within a const context."
@@ -99,6 +111,9 @@
 ConstEvalInvalidBinaryOperandType:
   template: "Binary operator '#string' on '#constant' requires operand of type '#type', but was of type '#type2'."
 
+ConstEvalInvalidEqualsOperandType:
+  template: "Binary operator '==' requires receiver constant '#constant' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type '#type'."
+
 ConstEvalZeroDivisor:
   template: "Binary operator '#string' on '#string2' requires non-zero divisor, but divisor was '0'."
   analyzerCode: CONST_EVAL_THROWS_IDBZE
@@ -110,6 +125,10 @@
   template: "The method '#string' can't be invoked on '#constant' within a const context."
   analyzerCode: UNDEFINED_OPERATOR
 
+ConstEvalInvalidPropertyGet:
+  template: "The property '#string' can't be accessed on '#constant' within a const context."
+  analyzerCode: CONST_EVAL_THROWS_EXCEPTION
+
 ConstEvalInvalidStringInterpolationOperand:
   template: "The '#constant' can't be used as part of a string interpolation within a const context, only values of type 'null', 'bool', 'int', 'double', or 'String' can be used."
   analyzerCode: CONST_EVAL_TYPE_BOOL_NUM_STRING
@@ -150,6 +169,33 @@
   template: "Constant expression depends on itself."
   analyzerCode: RECURSIVE_COMPILE_TIME_CONSTANT
 
+ConstEvalNullValue:
+  template: "Null value during constant evaluation."
+  analyzerCode: CONST_EVAL_THROWS_EXCEPTION
+
+ConstEvalNotListOrSetInSpread:
+  template: "Only lists and sets can be used in spreads in constant lists and sets."
+  analyzerCode: CONST_SPREAD_EXPECTED_LIST_OR_SET
+
+ConstEvalNotMapInSpread:
+  template: "Only maps can be used in spreads in constant maps."
+  analyzerCode: CONST_SPREAD_EXPECTED_MAP
+
+ConstEvalIterationInConstList:
+  template: "Iteration can't be used in a constant list."
+  analyzerCode: NON_CONSTANT_LIST_ELEMENT
+
+ConstEvalIterationInConstSet:
+  template: "Iteration can't be used in a constant set."
+  analyzerCode: NON_CONSTANT_SET_ELEMENT
+
+ConstEvalIterationInConstMap:
+  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
@@ -175,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
 
@@ -528,15 +574,6 @@
   analyzerCode: ParserErrorCode.CONST_CLASS
   script: "const class C {}"
 
-ConstAndCovariant:
-  index: 57
-  template: "Members can't be declared to be both 'const' and 'covariant'."
-  tip: "Try removing either the 'const' or 'covariant' keyword."
-  analyzerCode: ParserErrorCode.CONST_AND_COVARIANT
-  script:
-    - "class C { covariant const C f; }"
-    - "class C { const covariant C f; }"
-
 ConstAndFinal:
   index: 58
   template: "Members can't be declared to be both 'const' and 'final'."
@@ -548,11 +585,11 @@
     - "const final int x = 5;"
     - "final const int x = 5;"
 
-ConstAndVar:
+ConflictingModifiers:
   index: 59
-  template: "Members can't be declared to be both 'const' and 'var'."
-  tip: "Try removing either the 'const' or 'var' keyword."
-  analyzerCode: ParserErrorCode.CONST_AND_VAR
+  template: "Members can't be declared to be both '#string' and '#string2'."
+  tip: "Try removing one of the keywords."
+  analyzerCode: ParserErrorCode.CONFLICTING_MODIFIERS
   script:
     - "class C { const var x; }"
     - "class C { var const x; }"
@@ -586,14 +623,22 @@
   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; }"
 
+TypeBeforeFactory:
+  index: 57
+  template: "Factory constructors cannot have a return type."
+  tip: "Try removing the type appearing before 'factory'."
+  analyzerCode: ParserErrorCode.TYPE_BEFORE_FACTORY
+  script:
+    - "class C { T factory C() { return null; } }"
+
 ConstConstructorWithBody:
   template: "A const constructor can't have a body."
   tip: "Try removing either the 'const' keyword or the body."
@@ -609,14 +654,6 @@
   script:
     - "class C { const m() {} }"
 
-CovariantAfterFinal:
-  index: 65
-  template: "The modifier 'covariant' should be before the modifier 'final'."
-  tip: "Try re-ordering the modifiers."
-  analyzerCode: ParserErrorCode.COVARIANT_AFTER_FINAL
-  script:
-    - "final covariant f;"
-
 CovariantAfterVar:
   index: 8
   template: "The modifier 'covariant' should be before the modifier 'var'."
@@ -637,7 +674,7 @@
 DuplicatedModifier:
   index: 70
   template: "The modifier '#lexeme' was already specified."
-  tip: "Try removing all but one occurance of the modifier."
+  tip: "Try removing all but one occurence of the modifier."
   analyzerCode: ParserErrorCode.DUPLICATED_MODIFIER
   script:
     - "class C { const const m; }"
@@ -2133,7 +2170,7 @@
 
 ImportAfterPart:
   index: 10
-  template: "Import directives must preceed part directives."
+  template: "Import directives must precede part directives."
   tip: "Try moving the import directives before the part directives."
   analyzerCode: ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE
   script:
@@ -2141,7 +2178,7 @@
 
 ExportAfterPart:
   index: 75
-  template: "Export directives must preceed part directives."
+  template: "Export directives must precede part directives."
   tip: "Try moving the export directives before the part directives."
   analyzerCode: ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE
   script:
@@ -2431,7 +2468,7 @@
 
 MissingOperatorKeyword:
   index: 31
-  template: "Operator declarations must be preceeded by the keyword 'operator'."
+  template: "Operator declarations must be preceded by the keyword 'operator'."
   tip: "Try adding the keyword 'operator'."
   analyzerCode: ParserErrorCode.MISSING_KEYWORD_OPERATOR
   script:
@@ -2444,6 +2481,16 @@
   script:
     - "class C { void operator %=(x) {} }"
 
+NotBinaryOperator:
+  template: "'#lexeme' isn't a binary operator."
+  script: >
+    class C { operator~() { return null; } }
+
+    main() {
+      C c = new C();
+      print(c ~ 2);
+    }
+
 OperatorParameterMismatch0:
   template: "Operator '#name' shouldn't have any parameters."
 
@@ -2506,9 +2553,19 @@
   template: "SDK libraries specification not found: #uri."
   tip: "Normally, the specification is a file named 'libraries.json' in the Dart SDK install location."
 
+InvalidSuperInInitializer:
+  index: 95
+  template: "Can only use 'super' in an initializer for calling the superclass constructor (e.g. 'super()' or 'super.namedConstructor()')"
+  analyzerCode: ParserErrorCode.INVALID_SUPER_IN_INITIALIZER
+
+InvalidThisInInitializer:
+  index: 65
+  template: "Can only use 'this' in an initializer for field initialization (e.g. 'this.x = something') and constructor redirection (e.g. 'this()' or 'this.namedConstructor())"
+  analyzerCode: ParserErrorCode.INVALID_THIS_IN_INITIALIZER
+
 ThisAccessInFieldInitializer:
   template: "Can't access 'this' in a field initializer to read '#name'."
-  analyzerCode: THIS_ACCESS_FROM_INITIALIZER
+  analyzerCode: THIS_ACCESS_FROM_FIELD_INITIALIZER
 
 ThisOrSuperAccessInFieldInitializer:
   template: "Can't access '#string' in a field initializer."
@@ -3126,6 +3183,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/front_end/pubspec.yaml b/front_end/pubspec.yaml
index b3f5034..64e9958 100644
--- a/front_end/pubspec.yaml
+++ b/front_end/pubspec.yaml
@@ -1,31 +1,24 @@
 name: front_end
 # Currently, front_end API is not stable and users should not
 # depend on semver semantics when depending on this package.
-version: 0.1.14
+version: 0.1.18
 author: Dart Team <misc@dartlang.org>
 description: Front end for compilation of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/front_end
 environment:
   sdk: '>=2.1.0-dev.5.0 <3.0.0'
 dependencies:
-  charcode: '^1.1.1'
-  convert: '^2.0.1'
-  crypto: '^2.0.2'
-  kernel: 0.3.14
-  meta: '^1.1.1'
+  kernel: 0.3.18
   package_config: '^1.0.1'
   path: '^1.3.9'
-  source_span: '^1.2.3'
   yaml: '^2.1.12'
 dev_dependencies:
-  analyzer: 0.35.4
+  analyzer: 0.36.3
   args: '>=0.13.0 <2.0.0'
   build_integration:
     path: ../build_integration
   dart_style: '^1.0.7'
   json_rpc_2: ^2.0.9
-  mockito: ^2.0.2
-  stream_channel: ^1.6.1
   test: ^1.3.4
   test_reflective_loader: ^0.1.0
   web_socket_channel: ^1.0.4
diff --git a/front_end/testcases/argument_mismatch.dart b/front_end/testcases/argument_mismatch.dart
index 61a678e..7cce446 100644
--- a/front_end/testcases/argument_mismatch.dart
+++ b/front_end/testcases/argument_mismatch.dart
@@ -2,9 +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.
 
-/*@testedFeatures=warning,context*/
-
-/*@context=CandidateFound*/ foo() {}
+foo() {}
 
 test() {
   /*@warning=MethodNotFound*/ foo(null);
diff --git a/front_end/testcases/argument_mismatch.dart.legacy.expect b/front_end/testcases/argument_mismatch.dart.legacy.expect
index d836fc0..ac488e4 100644
--- a/front_end/testcases/argument_mismatch.dart.legacy.expect
+++ b/front_end/testcases/argument_mismatch.dart.legacy.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/argument_mismatch.dart:10:34: Warning: Too many positional arguments: 0 allowed, but 1 found.
+// pkg/front_end/testcases/argument_mismatch.dart:8:34: Warning: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //   /*@warning=MethodNotFound*/ foo(null);
 //                                  ^
-// pkg/front_end/testcases/argument_mismatch.dart:7:29: Context: Found this candidate, but the arguments don't match.
-// /*@context=CandidateFound*/ foo() {}
-//                             ^^^
+// pkg/front_end/testcases/argument_mismatch.dart:5:1: Context: Found this candidate, but the arguments don't match.
+// foo() {}
+// ^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/front_end/testcases/argument_mismatch.dart.legacy.transformed.expect b/front_end/testcases/argument_mismatch.dart.legacy.transformed.expect
index d836fc0..ac488e4 100644
--- a/front_end/testcases/argument_mismatch.dart.legacy.transformed.expect
+++ b/front_end/testcases/argument_mismatch.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/argument_mismatch.dart:10:34: Warning: Too many positional arguments: 0 allowed, but 1 found.
+// pkg/front_end/testcases/argument_mismatch.dart:8:34: Warning: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //   /*@warning=MethodNotFound*/ foo(null);
 //                                  ^
-// pkg/front_end/testcases/argument_mismatch.dart:7:29: Context: Found this candidate, but the arguments don't match.
-// /*@context=CandidateFound*/ foo() {}
-//                             ^^^
+// pkg/front_end/testcases/argument_mismatch.dart:5:1: Context: Found this candidate, but the arguments don't match.
+// foo() {}
+// ^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.expect b/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.expect
index 92d0def..abff6cf 100644
--- a/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.expect
+++ b/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
-  method bar<Y extends self::A::X = dynamic>() → dynamic
+  method bar<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic
     return null;
 }
 class B extends core::Object {
diff --git a/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.transformed.expect b/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.transformed.expect
index 92d0def..abff6cf 100644
--- a/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.transformed.expect
+++ b/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
-  method bar<Y extends self::A::X = dynamic>() → dynamic
+  method bar<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic
     return null;
 }
 class B extends core::Object {
diff --git a/front_end/testcases/bounds_check_depends_on_inference.dart.outline.expect b/front_end/testcases/bounds_check_depends_on_inference.dart.outline.expect
index ec400af..8a919db 100644
--- a/front_end/testcases/bounds_check_depends_on_inference.dart.outline.expect
+++ b/front_end/testcases/bounds_check_depends_on_inference.dart.outline.expect
@@ -5,7 +5,7 @@
 class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     ;
-  method bar<Y extends self::A::X = dynamic>() → dynamic
+  method bar<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic
     ;
 }
 class B extends core::Object {
diff --git a/front_end/testcases/bug21938.dart b/front_end/testcases/bug21938.dart
index c8555af..b6e851b 100644
--- a/front_end/testcases/bug21938.dart
+++ b/front_end/testcases/bug21938.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 test() {
   Object x;
   Function f;
-  x /*@error=UndefinedMethod*/ ();
-  x /*@error=UndefinedMethod*/ (3);
+  x();
+  x(3);
   f(5, 2);
-  x. /*@error=UndefinedMethod*/ call();
+  x.call();
   f.call;
   f.call(5, 2);
 }
diff --git a/front_end/testcases/bug21938.dart.strong.expect b/front_end/testcases/bug21938.dart.strong.expect
index 25e833b..aa88e80 100644
--- a/front_end/testcases/bug21938.dart.strong.expect
+++ b/front_end/testcases/bug21938.dart.strong.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/bug21938.dart:10:4: Error: The method 'call' isn't defined for the class 'Object'.
+// pkg/front_end/testcases/bug21938.dart:8:4: Error: The method 'call' isn't defined for the class 'Object'.
 //  - 'Object' is from 'dart:core'.
 // Try correcting the name to the name of an existing method, or defining a method named 'call'.
-//   x /*@error=UndefinedMethod*/ ();
+//   x();
 //    ^
 //
-// pkg/front_end/testcases/bug21938.dart:11:4: Error: The method 'call' isn't defined for the class 'Object'.
+// pkg/front_end/testcases/bug21938.dart:9:4: Error: The method 'call' isn't defined for the class 'Object'.
 //  - 'Object' is from 'dart:core'.
 // Try correcting the name to the name of an existing method, or defining a method named 'call'.
-//   x /*@error=UndefinedMethod*/ (3);
+//   x(3);
 //    ^
 //
-// pkg/front_end/testcases/bug21938.dart:13:33: Error: The method 'call' isn't defined for the class 'Object'.
+// pkg/front_end/testcases/bug21938.dart:11:5: Error: The method 'call' isn't defined for the class 'Object'.
 //  - 'Object' is from 'dart:core'.
 // Try correcting the name to the name of an existing method, or defining a method named 'call'.
-//   x. /*@error=UndefinedMethod*/ call();
-//                                 ^^^^
+//   x.call();
+//     ^^^^
 //
 import self as self;
 import "dart:core" as core;
@@ -26,22 +26,22 @@
 static method test() → dynamic {
   core::Object x;
   core::Function f;
-  invalid-expression "pkg/front_end/testcases/bug21938.dart:10:4: Error: The method 'call' isn't defined for the class 'Object'.
+  invalid-expression "pkg/front_end/testcases/bug21938.dart:8:4: Error: The method 'call' isn't defined for the class 'Object'.
  - 'Object' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
-  x /*@error=UndefinedMethod*/ ();
+  x();
    ^";
-  invalid-expression "pkg/front_end/testcases/bug21938.dart:11:4: Error: The method 'call' isn't defined for the class 'Object'.
+  invalid-expression "pkg/front_end/testcases/bug21938.dart:9:4: Error: The method 'call' isn't defined for the class 'Object'.
  - 'Object' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
-  x /*@error=UndefinedMethod*/ (3);
+  x(3);
    ^";
   f.call(5, 2);
-  invalid-expression "pkg/front_end/testcases/bug21938.dart:13:33: Error: The method 'call' isn't defined for the class 'Object'.
+  invalid-expression "pkg/front_end/testcases/bug21938.dart:11:5: Error: The method 'call' isn't defined for the class 'Object'.
  - 'Object' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
-  x. /*@error=UndefinedMethod*/ call();
-                                ^^^^";
+  x.call();
+    ^^^^";
   f.call;
   f.call(5, 2);
 }
diff --git a/front_end/testcases/bug32629.dart b/front_end/testcases/bug32629.dart
index 88610e0..fc0492f 100644
--- a/front_end/testcases/bug32629.dart
+++ b/front_end/testcases/bug32629.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class A {
   dynamic call(dynamic a, dynamic b) {
     return a;
diff --git a/front_end/testcases/bug33298.dart.legacy.expect b/front_end/testcases/bug33298.dart.legacy.expect
index c9a8e28..c12d485 100644
--- a/front_end/testcases/bug33298.dart.legacy.expect
+++ b/front_end/testcases/bug33298.dart.legacy.expect
@@ -13,7 +13,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  method call(self::B::T t) → self::B::T
+  method call(generic-covariant-impl self::B::T t) → self::B::T
     return t;
 }
 class C extends core::Object {
diff --git a/front_end/testcases/bug33298.dart.legacy.transformed.expect b/front_end/testcases/bug33298.dart.legacy.transformed.expect
index c9a8e28..c12d485 100644
--- a/front_end/testcases/bug33298.dart.legacy.transformed.expect
+++ b/front_end/testcases/bug33298.dart.legacy.transformed.expect
@@ -13,7 +13,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  method call(self::B::T t) → self::B::T
+  method call(generic-covariant-impl self::B::T t) → self::B::T
     return t;
 }
 class C extends core::Object {
diff --git a/front_end/testcases/bug33298.dart.outline.expect b/front_end/testcases/bug33298.dart.outline.expect
index ed25402..1d7e071 100644
--- a/front_end/testcases/bug33298.dart.outline.expect
+++ b/front_end/testcases/bug33298.dart.outline.expect
@@ -11,7 +11,7 @@
 class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T>
     ;
-  method call(self::B::T t) → self::B::T
+  method call(generic-covariant-impl self::B::T t) → self::B::T
     ;
 }
 class C extends core::Object {
diff --git a/front_end/testcases/bug35470.dart.legacy.expect b/front_end/testcases/bug35470.dart.legacy.expect
index 7f2ad6a..630df24 100644
--- a/front_end/testcases/bug35470.dart.legacy.expect
+++ b/front_end/testcases/bug35470.dart.legacy.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
-  method foo<Y extends self::A::X = dynamic>() → dynamic {}
+  method foo<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic {}
 }
 class B extends self::A<dynamic> {
   synthetic constructor •() → self::B
diff --git a/front_end/testcases/bug35470.dart.legacy.transformed.expect b/front_end/testcases/bug35470.dart.legacy.transformed.expect
index 7f2ad6a..630df24 100644
--- a/front_end/testcases/bug35470.dart.legacy.transformed.expect
+++ b/front_end/testcases/bug35470.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
-  method foo<Y extends self::A::X = dynamic>() → dynamic {}
+  method foo<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic {}
 }
 class B extends self::A<dynamic> {
   synthetic constructor •() → self::B
diff --git a/front_end/testcases/bug35470.dart.outline.expect b/front_end/testcases/bug35470.dart.outline.expect
index 26320fb..33d29f3 100644
--- a/front_end/testcases/bug35470.dart.outline.expect
+++ b/front_end/testcases/bug35470.dart.outline.expect
@@ -5,7 +5,7 @@
 class A<X extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     ;
-  method foo<Y extends self::A::X = dynamic>() → dynamic
+  method foo<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic
     ;
 }
 class B extends self::A<dynamic> {
diff --git a/front_end/testcases/check_deferred_allocation.dart.legacy.expect b/front_end/testcases/check_deferred_allocation.dart.legacy.expect
index 5167dc9..c660edf 100644
--- a/front_end/testcases/check_deferred_allocation.dart.legacy.expect
+++ b/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/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect b/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect
index 5167dc9..c660edf 100644
--- a/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/check_deferred_allocation.dart.strong.expect b/front_end/testcases/check_deferred_allocation.dart.strong.expect
index 799a3cd..0a70d79 100644
--- a/front_end/testcases/check_deferred_allocation.dart.strong.expect
+++ b/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/front_end/testcases/check_deferred_allocation.dart.strong.transformed.expect b/front_end/testcases/check_deferred_allocation.dart.strong.transformed.expect
index 494d25e..b5040a5 100644
--- a/front_end/testcases/check_deferred_allocation.dart.strong.transformed.expect
+++ b/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/front_end/testcases/check_deferred_before_args.dart.legacy.expect b/front_end/testcases/check_deferred_before_args.dart.legacy.expect
index 908e7aa..e223280 100644
--- a/front_end/testcases/check_deferred_before_args.dart.legacy.expect
+++ b/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/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect b/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect
index 908e7aa..e223280 100644
--- a/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/check_deferred_before_args.dart.strong.expect b/front_end/testcases/check_deferred_before_args.dart.strong.expect
index b570941..26b5b7d 100644
--- a/front_end/testcases/check_deferred_before_args.dart.strong.expect
+++ b/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/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect b/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect
index 1ea2a3f..1f4e6c8 100644
--- a/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect
+++ b/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/front_end/testcases/check_deferred_before_args2.dart.legacy.expect b/front_end/testcases/check_deferred_before_args2.dart.legacy.expect
index e9712c6..eebc07b 100644
--- a/front_end/testcases/check_deferred_before_args2.dart.legacy.expect
+++ b/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/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect b/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect
index 7f12556..989c4c4 100644
--- a/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/check_deferred_before_args2.dart.strong.expect b/front_end/testcases/check_deferred_before_args2.dart.strong.expect
index db0bb07..512b965 100644
--- a/front_end/testcases/check_deferred_before_args2.dart.strong.expect
+++ b/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/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect b/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
index 5ac3a08..7b3dfb1 100644
--- a/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
+++ b/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/front_end/testcases/check_deferred_before_call.dart.legacy.expect b/front_end/testcases/check_deferred_before_call.dart.legacy.expect
index 2a8fcd5..3cf5bf4 100644
--- a/front_end/testcases/check_deferred_before_call.dart.legacy.expect
+++ b/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/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect b/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect
index 2a8fcd5..3cf5bf4 100644
--- a/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/check_deferred_before_call.dart.strong.expect b/front_end/testcases/check_deferred_before_call.dart.strong.expect
index a4a8839..feb2112 100644
--- a/front_end/testcases/check_deferred_before_call.dart.strong.expect
+++ b/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/front_end/testcases/check_deferred_before_call.dart.strong.transformed.expect b/front_end/testcases/check_deferred_before_call.dart.strong.transformed.expect
index 2b6f45a..b755990 100644
--- a/front_end/testcases/check_deferred_before_call.dart.strong.transformed.expect
+++ b/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/front_end/testcases/check_deferred_before_write.dart.legacy.expect b/front_end/testcases/check_deferred_before_write.dart.legacy.expect
index d1bc459..169b56c 100644
--- a/front_end/testcases/check_deferred_before_write.dart.legacy.expect
+++ b/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/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect b/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect
index d1bc459..169b56c 100644
--- a/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/check_deferred_before_write.dart.strong.expect b/front_end/testcases/check_deferred_before_write.dart.strong.expect
index cf5fce5..3fa478a 100644
--- a/front_end/testcases/check_deferred_before_write.dart.strong.expect
+++ b/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/front_end/testcases/check_deferred_before_write.dart.strong.transformed.expect b/front_end/testcases/check_deferred_before_write.dart.strong.transformed.expect
index a6a7f4a..40b7cc6 100644
--- a/front_end/testcases/check_deferred_before_write.dart.strong.transformed.expect
+++ b/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/front_end/testcases/check_deferred_read.dart.legacy.expect b/front_end/testcases/check_deferred_read.dart.legacy.expect
index 175fa7c..714d35c 100644
--- a/front_end/testcases/check_deferred_read.dart.legacy.expect
+++ b/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/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect b/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect
index 175fa7c..714d35c 100644
--- a/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/check_deferred_read.dart.strong.expect b/front_end/testcases/check_deferred_read.dart.strong.expect
index 1af399d..500b9e9 100644
--- a/front_end/testcases/check_deferred_read.dart.strong.expect
+++ b/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/front_end/testcases/check_deferred_read.dart.strong.transformed.expect b/front_end/testcases/check_deferred_read.dart.strong.transformed.expect
index daa8674..1e9676c 100644
--- a/front_end/testcases/check_deferred_read.dart.strong.transformed.expect
+++ b/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/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect b/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect
index 60e13fd..01f9ffd 100644
--- a/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect
+++ b/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/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect b/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect
index 60e13fd..01f9ffd 100644
--- a/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/check_deferred_read_static_field.dart.strong.expect b/front_end/testcases/check_deferred_read_static_field.dart.strong.expect
index 90d44a4..a454d85 100644
--- a/front_end/testcases/check_deferred_read_static_field.dart.strong.expect
+++ b/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/front_end/testcases/check_deferred_read_static_field.dart.strong.transformed.expect b/front_end/testcases/check_deferred_read_static_field.dart.strong.transformed.expect
index ed7f244..c8d8259 100644
--- a/front_end/testcases/check_deferred_read_static_field.dart.strong.transformed.expect
+++ b/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/front_end/testcases/check_deferred_read_type.dart.legacy.expect b/front_end/testcases/check_deferred_read_type.dart.legacy.expect
index 3982934..8acc0bb 100644
--- a/front_end/testcases/check_deferred_read_type.dart.legacy.expect
+++ b/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/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect b/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect
index 3982934..8acc0bb 100644
--- a/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/check_deferred_read_type.dart.strong.expect b/front_end/testcases/check_deferred_read_type.dart.strong.expect
index d62739e..413f2f6 100644
--- a/front_end/testcases/check_deferred_read_type.dart.strong.expect
+++ b/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/front_end/testcases/check_deferred_read_type.dart.strong.transformed.expect b/front_end/testcases/check_deferred_read_type.dart.strong.transformed.expect
index 747f240..363f918 100644
--- a/front_end/testcases/check_deferred_read_type.dart.strong.transformed.expect
+++ b/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/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect b/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect
index a054b09..5e32eae 100644
--- a/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect
+++ b/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/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect b/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect
index a054b09..5e32eae 100644
--- a/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/check_deferred_static_method_call.dart.strong.expect b/front_end/testcases/check_deferred_static_method_call.dart.strong.expect
index 6ee7c79..cf7b29c 100644
--- a/front_end/testcases/check_deferred_static_method_call.dart.strong.expect
+++ b/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/front_end/testcases/check_deferred_static_method_call.dart.strong.transformed.expect b/front_end/testcases/check_deferred_static_method_call.dart.strong.transformed.expect
index cfe8c33..0e05e8f 100644
--- a/front_end/testcases/check_deferred_static_method_call.dart.strong.transformed.expect
+++ b/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/front_end/testcases/constructor_const_inference.dart.legacy.expect b/front_end/testcases/constructor_const_inference.dart.legacy.expect
index b3c195b..fa5e33f 100644
--- a/front_end/testcases/constructor_const_inference.dart.legacy.expect
+++ b/front_end/testcases/constructor_const_inference.dart.legacy.expect
@@ -8,7 +8,7 @@
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
-  field self::_Y<self::A::T> x;
+  generic-covariant-impl field self::_Y<self::A::T> x;
   constructor •(self::_Y<self::A::T> x) → self::A<self::A::T>
     : self::A::x = x, super core::Object::•()
     ;
diff --git a/front_end/testcases/constructor_const_inference.dart.legacy.transformed.expect b/front_end/testcases/constructor_const_inference.dart.legacy.transformed.expect
index b3c195b..fa5e33f 100644
--- a/front_end/testcases/constructor_const_inference.dart.legacy.transformed.expect
+++ b/front_end/testcases/constructor_const_inference.dart.legacy.transformed.expect
@@ -8,7 +8,7 @@
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
-  field self::_Y<self::A::T> x;
+  generic-covariant-impl field self::_Y<self::A::T> x;
   constructor •(self::_Y<self::A::T> x) → self::A<self::A::T>
     : self::A::x = x, super core::Object::•()
     ;
diff --git a/front_end/testcases/constructor_const_inference.dart.outline.expect b/front_end/testcases/constructor_const_inference.dart.outline.expect
index 071faac..2ad0826 100644
--- a/front_end/testcases/constructor_const_inference.dart.outline.expect
+++ b/front_end/testcases/constructor_const_inference.dart.outline.expect
@@ -7,7 +7,7 @@
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
-  field self::_Y<self::A::T> x;
+  generic-covariant-impl field self::_Y<self::A::T> x;
   constructor •(self::_Y<self::A::T> x) → self::A<self::A::T>
     ;
 }
diff --git a/front_end/testcases/control_flow_collection.dart b/front_end/testcases/control_flow_collection.dart
new file mode 100644
index 0000000..987769f
--- /dev/null
+++ b/front_end/testcases/control_flow_collection.dart
@@ -0,0 +1,39 @@
+// 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.
+
+main() {
+  final aList = <int>[
+      1,
+      if (oracle()) 2,
+      if (oracle()) 3 else -1,
+      if (oracle()) if (oracle()) 4,
+      for (int i in <int>[5, 6, 7]) i,
+      for (int i in <int>[8, 9, 10]) if (oracle()) i,
+      for (int i = 11; i <= 14; ++i) i,
+  ];
+  final aSet = <int>{
+      1,
+      if (oracle()) 2,
+      if (oracle()) 3 else -1,
+      if (oracle()) if (oracle()) 4,
+      for (int i in <int>[5, 6, 7]) i,
+      for (int i in <int>[8, 9, 10]) if (oracle()) i,
+      for (int i = 11; i <= 14; ++i) i,
+  };
+  final aMap = <int, int>{
+      1: 1,
+      if (oracle()) 2: 2,
+      if (oracle()) 3: 3 else -1: -1,
+      if (oracle()) if (oracle()) 4: 4,
+      for (int i in <int>[5, 6, 7]) i: i,
+      for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
+      for (int i = 11; i <= 14; ++i) i: i,
+  };
+
+  print(aList);
+  print(aSet);
+  print(aMap);
+}
+
+oracle() => true;
diff --git a/front_end/testcases/control_flow_collection.dart.legacy.expect b/front_end/testcases/control_flow_collection.dart.legacy.expect
new file mode 100644
index 0000000..099350f
--- /dev/null
+++ b/front_end/testcases/control_flow_collection.dart.legacy.expect
@@ -0,0 +1,113 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/control_flow_collection.dart:8:7: Error: Unexpected token 'if'.
+//       if (oracle()) 2,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:9:7: Error: Unexpected token 'if'.
+//       if (oracle()) 3 else -1,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:10:21: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4,
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:10:7: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:11:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[5, 6, 7]) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:12:38: Error: Unexpected token 'if'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//                                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:12:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:13:7: Error: Unexpected token 'for'.
+//       for (int i = 11; i <= 14; ++i) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:17:7: Error: Unexpected token 'if'.
+//       if (oracle()) 2,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:18:7: Error: Unexpected token 'if'.
+//       if (oracle()) 3 else -1,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:19:21: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4,
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:19:7: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:20:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[5, 6, 7]) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:21:38: Error: Unexpected token 'if'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//                                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:21:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:22:7: Error: Unexpected token 'for'.
+//       for (int i = 11; i <= 14; ++i) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:26:7: Error: Unexpected token 'if'.
+//       if (oracle()) 2: 2,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:27:7: Error: Unexpected token 'if'.
+//       if (oracle()) 3: 3 else -1: -1,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:28:21: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4: 4,
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:28:7: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4: 4,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:29:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[5, 6, 7]) i: i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:30:38: Error: Unexpected token 'if'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
+//                                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:30:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:31:7: Error: Unexpected token 'for'.
+//       for (int i = 11; i <= 14; ++i) i: i,
+//       ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  final dynamic aList = <core::int>[1];
+  final dynamic aSet = <core::int>{1};
+  final dynamic aMap = <core::int, core::int>{1: 1};
+  core::print(aList);
+  core::print(aSet);
+  core::print(aMap);
+}
+static method oracle() → dynamic
+  return true;
diff --git a/front_end/testcases/control_flow_collection.dart.legacy.transformed.expect b/front_end/testcases/control_flow_collection.dart.legacy.transformed.expect
new file mode 100644
index 0000000..099350f
--- /dev/null
+++ b/front_end/testcases/control_flow_collection.dart.legacy.transformed.expect
@@ -0,0 +1,113 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/control_flow_collection.dart:8:7: Error: Unexpected token 'if'.
+//       if (oracle()) 2,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:9:7: Error: Unexpected token 'if'.
+//       if (oracle()) 3 else -1,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:10:21: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4,
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:10:7: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:11:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[5, 6, 7]) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:12:38: Error: Unexpected token 'if'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//                                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:12:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:13:7: Error: Unexpected token 'for'.
+//       for (int i = 11; i <= 14; ++i) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:17:7: Error: Unexpected token 'if'.
+//       if (oracle()) 2,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:18:7: Error: Unexpected token 'if'.
+//       if (oracle()) 3 else -1,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:19:21: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4,
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:19:7: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:20:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[5, 6, 7]) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:21:38: Error: Unexpected token 'if'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//                                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:21:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:22:7: Error: Unexpected token 'for'.
+//       for (int i = 11; i <= 14; ++i) i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:26:7: Error: Unexpected token 'if'.
+//       if (oracle()) 2: 2,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:27:7: Error: Unexpected token 'if'.
+//       if (oracle()) 3: 3 else -1: -1,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:28:21: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4: 4,
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:28:7: Error: Unexpected token 'if'.
+//       if (oracle()) if (oracle()) 4: 4,
+//       ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:29:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[5, 6, 7]) i: i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:30:38: Error: Unexpected token 'if'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
+//                                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:30:7: Error: Unexpected token 'for'.
+//       for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
+//       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection.dart:31:7: Error: Unexpected token 'for'.
+//       for (int i = 11; i <= 14; ++i) i: i,
+//       ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  final dynamic aList = <core::int>[1];
+  final dynamic aSet = <core::int>{1};
+  final dynamic aMap = <core::int, core::int>{1: 1};
+  core::print(aList);
+  core::print(aSet);
+  core::print(aMap);
+}
+static method oracle() → dynamic
+  return true;
diff --git a/front_end/testcases/control_flow_collection.dart.outline.expect b/front_end/testcases/control_flow_collection.dart.outline.expect
new file mode 100644
index 0000000..b0c1797
--- /dev/null
+++ b/front_end/testcases/control_flow_collection.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
+static method oracle() → dynamic
+  ;
diff --git a/front_end/testcases/control_flow_collection.dart.strong.expect b/front_end/testcases/control_flow_collection.dart.strong.expect
new file mode 100644
index 0000000..8c19425
--- /dev/null
+++ b/front_end/testcases/control_flow_collection.dart.strong.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic {
+  final core::List<core::int> aList = block {
+    final core::List<core::int> #t1 = <core::int>[];
+    #t1.{core::List::add}(1);
+    if(self::oracle() as{TypeError} core::bool)
+      #t1.{core::List::add}(2);
+    if(self::oracle() as{TypeError} core::bool)
+      #t1.{core::List::add}(3);
+    else
+      #t1.{core::List::add}(1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool)
+      if(self::oracle() as{TypeError} core::bool)
+        #t1.{core::List::add}(4);
+    for (core::int i in <core::int>[5, 6, 7])
+      #t1.{core::List::add}(i);
+    for (core::int i in <core::int>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool)
+        #t1.{core::List::add}(i);
+    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t1.{core::List::add}(i);
+  } =>#t1;
+  final core::Set<core::int> aSet = block {
+    final core::Set<core::int> #t2 = col::LinkedHashSet::•<core::int>();
+    #t2.{core::Set::add}(1);
+    if(self::oracle() as{TypeError} core::bool)
+      #t2.{core::Set::add}(2);
+    if(self::oracle() as{TypeError} core::bool)
+      #t2.{core::Set::add}(3);
+    else
+      #t2.{core::Set::add}(1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool)
+      if(self::oracle() as{TypeError} core::bool)
+        #t2.{core::Set::add}(4);
+    for (core::int i in <core::int>[5, 6, 7])
+      #t2.{core::Set::add}(i);
+    for (core::int i in <core::int>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool)
+        #t2.{core::Set::add}(i);
+    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t2.{core::Set::add}(i);
+  } =>#t2;
+  final core::Map<core::int, core::int> aMap = block {
+    final core::Map<core::int, core::int> #t3 = <core::int, core::int>{};
+    #t3.{core::Map::[]=}(1, 1);
+    if(self::oracle() as{TypeError} core::bool)
+      #t3.{core::Map::[]=}(2, 2);
+    if(self::oracle() as{TypeError} core::bool)
+      #t3.{core::Map::[]=}(3, 3);
+    else
+      #t3.{core::Map::[]=}(1.{core::int::unary-}(), 1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool)
+      if(self::oracle() as{TypeError} core::bool)
+        #t3.{core::Map::[]=}(4, 4);
+    for (core::int i in <core::int>[5, 6, 7])
+      #t3.{core::Map::[]=}(i, i);
+    for (core::int i in <core::int>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool)
+        #t3.{core::Map::[]=}(i, i);
+    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t3.{core::Map::[]=}(i, i);
+  } =>#t3;
+  core::print(aList);
+  core::print(aSet);
+  core::print(aMap);
+}
+static method oracle() → dynamic
+  return true;
diff --git a/front_end/testcases/control_flow_collection.dart.strong.transformed.expect b/front_end/testcases/control_flow_collection.dart.strong.transformed.expect
new file mode 100644
index 0000000..8c19425
--- /dev/null
+++ b/front_end/testcases/control_flow_collection.dart.strong.transformed.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic {
+  final core::List<core::int> aList = block {
+    final core::List<core::int> #t1 = <core::int>[];
+    #t1.{core::List::add}(1);
+    if(self::oracle() as{TypeError} core::bool)
+      #t1.{core::List::add}(2);
+    if(self::oracle() as{TypeError} core::bool)
+      #t1.{core::List::add}(3);
+    else
+      #t1.{core::List::add}(1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool)
+      if(self::oracle() as{TypeError} core::bool)
+        #t1.{core::List::add}(4);
+    for (core::int i in <core::int>[5, 6, 7])
+      #t1.{core::List::add}(i);
+    for (core::int i in <core::int>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool)
+        #t1.{core::List::add}(i);
+    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t1.{core::List::add}(i);
+  } =>#t1;
+  final core::Set<core::int> aSet = block {
+    final core::Set<core::int> #t2 = col::LinkedHashSet::•<core::int>();
+    #t2.{core::Set::add}(1);
+    if(self::oracle() as{TypeError} core::bool)
+      #t2.{core::Set::add}(2);
+    if(self::oracle() as{TypeError} core::bool)
+      #t2.{core::Set::add}(3);
+    else
+      #t2.{core::Set::add}(1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool)
+      if(self::oracle() as{TypeError} core::bool)
+        #t2.{core::Set::add}(4);
+    for (core::int i in <core::int>[5, 6, 7])
+      #t2.{core::Set::add}(i);
+    for (core::int i in <core::int>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool)
+        #t2.{core::Set::add}(i);
+    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t2.{core::Set::add}(i);
+  } =>#t2;
+  final core::Map<core::int, core::int> aMap = block {
+    final core::Map<core::int, core::int> #t3 = <core::int, core::int>{};
+    #t3.{core::Map::[]=}(1, 1);
+    if(self::oracle() as{TypeError} core::bool)
+      #t3.{core::Map::[]=}(2, 2);
+    if(self::oracle() as{TypeError} core::bool)
+      #t3.{core::Map::[]=}(3, 3);
+    else
+      #t3.{core::Map::[]=}(1.{core::int::unary-}(), 1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool)
+      if(self::oracle() as{TypeError} core::bool)
+        #t3.{core::Map::[]=}(4, 4);
+    for (core::int i in <core::int>[5, 6, 7])
+      #t3.{core::Map::[]=}(i, i);
+    for (core::int i in <core::int>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool)
+        #t3.{core::Map::[]=}(i, i);
+    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t3.{core::Map::[]=}(i, i);
+  } =>#t3;
+  core::print(aList);
+  core::print(aSet);
+  core::print(aMap);
+}
+static method oracle() → dynamic
+  return true;
diff --git a/front_end/testcases/control_flow_collection.dart.type_promotion.expect b/front_end/testcases/control_flow_collection.dart.type_promotion.expect
new file mode 100644
index 0000000..5476097
--- /dev/null
+++ b/front_end/testcases/control_flow_collection.dart.type_promotion.expect
@@ -0,0 +1,9 @@
+pkg/front_end/testcases/control_flow_collection.dart:13:33: Context: Write to i@364
+      for (int i = 11; i <= 14; ++i) i,
+                                ^^
+pkg/front_end/testcases/control_flow_collection.dart:22:33: Context: Write to i@364
+      for (int i = 11; i <= 14; ++i) i,
+                                ^^
+pkg/front_end/testcases/control_flow_collection.dart:31:33: Context: Write to i@364
+      for (int i = 11; i <= 14; ++i) i: i,
+                                ^^
diff --git a/front_end/testcases/control_flow_collection_inference.dart b/front_end/testcases/control_flow_collection_inference.dart
new file mode 100644
index 0000000..4a64f6a
--- /dev/null
+++ b/front_end/testcases/control_flow_collection_inference.dart
@@ -0,0 +1,272 @@
+// 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.
+
+// Oracle is generic to test the inference in conditions of if-elements.
+oracle<T>([T t]) => true;
+
+testIfElement(dynamic dynVar, List<int> listInt, List<double> listDouble,
+    Map<String, int> mapToInt, Map<String, double> mapToDouble) {
+  var list10 = [if (oracle("foo")) 42];
+  var set10 = {if (oracle("foo")) 42, null};
+  var map10 = {if (oracle("foo")) "bar": 42, "baz": null};
+  var list11 = [if (oracle("foo")) dynVar];
+  var set11 = {if (oracle("foo")) dynVar, null};
+  var map11 = {if (oracle("foo")) "bar": dynVar, "baz": null};
+  var list12 = [if (oracle("foo")) [42]];
+  var set12 = {if (oracle("foo")) [42], null};
+  var map12 = {if (oracle("foo")) "bar": [42], "baz": null};
+  var list20 = [if (oracle("foo")) ...[42]];
+  var set20 = {if (oracle("foo")) ...[42], null};
+  var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
+  var list21 = [if (oracle("foo")) ...[dynVar]];
+  var set21 = {if (oracle("foo")) ...[dynVar], null};
+  var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
+  var list22 = [if (oracle("foo")) ...[[42]]];
+  var set22 = {if (oracle("foo")) ...[[42]], null};
+  var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
+  var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+  var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+  var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+  var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+  var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+  var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+  var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+  var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+  var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+  List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
+  Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
+  Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+  List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
+  Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
+  List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+  Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+  Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+  List<int> list50 = [if (oracle("foo")) ...[]];
+  Set<int> set50 = {if (oracle("foo")) ...[], null};
+  Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
+  List<int> list51 = [if (oracle("foo")) ...{}];
+  Set<int> set51 = {if (oracle("foo")) ...{}, null};
+  List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+  Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+  Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+  List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
+  Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
+  Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
+  List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+  Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+  Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+  List<List<int>> list70 = [if (oracle("foo")) []];
+  Set<List<int>> set70 = {if (oracle("foo")) [], null};
+  List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
+  Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
+  var list80 = [if (oracle("foo")) 42 else 3.14];
+  var set80 = {if (oracle("foo")) 42 else 3.14, null};
+  var map80 = {if (oracle("foo")) "bar": 42 else "bar": 3.14, "baz": null};
+  var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+  var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+  var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+  var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+  var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+  var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+  var list83 = [if (oracle("foo")) 42 else ...listDouble];
+  var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
+  var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
+  List<int> list90 = [if (oracle("foo")) dynVar];
+  Set<int> set90 = {if (oracle("foo")) dynVar, null};
+  Map<String, int> map90 = {if (oracle("foo")) "bar": dynVar, "baz": null};
+  List<int> list91 = [if (oracle("foo")) ...dynVar];
+  Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
+  Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
+  List<int> list100 = [if (dynVar) 42];
+  Set<int> set100 = {if (dynVar) 42};
+  Map<int, int> map100 = {if (dynVar) 42: 42};
+}
+
+testIfElementErrors(Map<int, int> map) {
+  <int>[if (oracle("foo")) "bar"];
+  <int>{if (oracle("foo")) "bar", null};
+  <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
+  <int>[if (oracle("foo")) ...["bar"]];
+  <int>{if (oracle("foo")) ...["bar"], null};
+  <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+  <int>[if (oracle("foo")) ...map];
+  <int>{if (oracle("foo")) ...map, null};
+  <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+  <String>[if (oracle("foo")) 42 else 3.14];
+  <String>{if (oracle("foo")) 42 else 3.14, null};
+  <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
+  <int>[if (oracle("foo")) ...map else 42];
+  <int>{if (oracle("foo")) ...map else 42, null};
+  <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+  <int>[if (oracle("foo")) 42 else ...map];
+  <int>{if (oracle("foo")) ...map else 42, null};
+  <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+
+  Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
+  Map<dynamic, dynamic> map10 = {if (oracle("foo")) 42 else "bar": 3.14};
+  Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
+  Map<dynamic, dynamic> map11 = {if (oracle("foo")) "bar": 3.14 else 42};
+  var map12 = {if (oracle("foo")) 42 else "bar": 3.14};
+  var map13 = {if (oracle("foo")) "bar": 3.14 else 42};
+  List<int> list20 = [if (42) 42];
+  Set<int> set20 = {if (42) 42};
+  Map<int, int> map30 = {if (42) 42: 42};
+  List<String> list40 = <String>[if (oracle("foo")) true else 42];
+  Set<String> set40 = <String>{if (oracle("foo")) true else 42};
+  Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
+  Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
+}
+
+testForElement(dynamic dynVar, List<int> listInt, List<double> listDouble, int
+    index, Map<String, int> mapStringInt, Map<String, double> mapStringDouble) {
+  var list10 = [for (int i = 0; oracle("foo"); i++) 42];
+  var set10 = {for (int i = 0; oracle("foo"); i++) 42, null};
+  var map10 = {for (int i = 0; oracle("foo"); i++) "bar": 42, "baz": null};
+  var list11 = [for (int i = 0; oracle("foo"); i++) dynVar];
+  var set11 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+  var map11 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+  var list12 = [for (int i = 0; oracle("foo"); i++) [42]];
+  var set12 = {for (int i = 0; oracle("foo"); i++) [42], null};
+  var map12 = {for (int i = 0; oracle("foo"); i++) "bar": [42], "baz": null};
+  var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
+  var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
+  var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
+  var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
+  var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
+  var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
+  var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
+  var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
+  var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
+  var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+  var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+  var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+  var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+  var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+  var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+  var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+  var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+  var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+  List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+  Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+  Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+  List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
+  Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
+  List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+  Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+  Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+  List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
+  Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
+  Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
+  List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
+  Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
+  List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+  Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+  List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+  Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+  Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+  List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+  Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+  Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+  List<List<int>> list70 = [for (int i = 0; oracle("foo"); i++) []];
+  Set<List<int>> set70 = {for (int i = 0; oracle("foo"); i++) [], null};
+  Map<String, List<int>> map70 = {for (int i = 0; oracle("foo"); i++) "bar": [], "baz": null};
+  List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
+  Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
+  Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
+  var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+  var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+  var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+  var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+  var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+  var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+  var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+  var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+  var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+  var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+  var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+  var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+  List<int> list90 = [for (int i = 0; oracle("foo"); i++) dynVar];
+  Set<int> set90 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+  Map<String, int> map90 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+  List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
+  Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
+  Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
+  List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
+  Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
+  Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
+  var list110 = [for (var i in [1, 2, 3]) i];
+  var set110 = {for (var i in [1, 2, 3]) i, null};
+  var map110 = {for (var i in [1, 2, 3]) "bar": i, "baz": null};
+  List<int> list120 = [for (var i in dynVar) i];
+  Set<int> set120 = {for (var i in dynVar) i, null};
+  Map<String, int> map120 = {for (var i in dynVar) "bar": i, "baz": null};
+  List<int> list130 = [for (var i = 1; i < 2; i++) i];
+  Set<int> set130 = {for (var i = 1; i < 2; i++) i};
+  Map<int, int> map130 = {for (var i = 1; i < 2; i++) i: i};
+}
+
+testForElementErrors(Map<int, int> map, List<int> list) async {
+  <int>[for (int i = 0; oracle("foo"); i++) "bar"];
+  <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
+  <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+  <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+  <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+  <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+  <int>[for (int i = 0; oracle("foo"); i++) ...map];
+  <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+  <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+  <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+  <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+  <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+  <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+  <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+  <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
+  <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+  <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+  <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
+
+  final i = 0;
+  <int>[for (i in <int>[1]) i];
+  <int>{for (i in <int>[1]) i, null};
+	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
+
+  var list10 = [for (var i in "not iterable") i];
+  var set10 = {for (var i in "not iterable") i, null};
+  var map10 = {for (var i in "not iterable") "bar": i, "baz": null};
+  var list20 = [for (int i in ["not", "int"]) i];
+  var set20 = {for (int i in ["not", "int"]) i, null};
+  var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
+  var list30 = [await for (var i in "not stream") i];
+  var set30 = {await for (var i in "not stream") i, null};
+  var map30 = {await for (var i in "not stream") "bar": i, "baz": null};
+  var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
+  var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
+  var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
+  var list50 = [await for (;;) 42];
+  var set50 = {await for (;;) 42, null};
+  var map50 = {await for (;;) "bar": 42, "baz": null};
+  var list60 = [for (; "not bool";) 42];
+  var set60 = {for (; "not bool";) 42, null};
+  var map60 = {for (; "not bool";) "bar": 42, "baz": null};
+}
+
+testForElementErrorsNotAsync(Stream<int> stream) {
+  <int>[await for (int i in stream) i];
+  <int>{await for (int i in stream) i};
+  <String, int>{await for (int i in stream) "bar": i};
+}
+
+class A {}
+
+class B extends A {
+  int get foo => 42;
+}
+
+testPromotion(A a) {
+  List<int> list10 = [if (a is B) a.foo];
+  Set<int> set10 = {if (a is B) a.foo};
+  Map<int, int> map10 = {if (a is B) a.foo: a.foo};
+}
+
+main() {}
diff --git a/front_end/testcases/control_flow_collection_inference.dart.hierarchy.expect b/front_end/testcases/control_flow_collection_inference.dart.hierarchy.expect
new file mode 100644
index 0000000..3a1da21
--- /dev/null
+++ b/front_end/testcases/control_flow_collection_inference.dart.hierarchy.expect
@@ -0,0 +1,55 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+A:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+B:
+  superclasses:
+    Object
+      -> A
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    B.foo
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/front_end/testcases/control_flow_collection_inference.dart.legacy.expect b/front_end/testcases/control_flow_collection_inference.dart.legacy.expect
new file mode 100644
index 0000000..ffd86f8
--- /dev/null
+++ b/front_end/testcases/control_flow_collection_inference.dart.legacy.expect
@@ -0,0 +1,2036 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:10:17: Error: Unexpected token 'if'.
+//   var list10 = [if (oracle("foo")) 42];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:11:16: Error: Unexpected token 'if'.
+//   var set10 = {if (oracle("foo")) 42, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:12:16: Error: Unexpected token 'if'.
+//   var map10 = {if (oracle("foo")) "bar": 42, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:13:17: Error: Unexpected token 'if'.
+//   var list11 = [if (oracle("foo")) dynVar];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:14:16: Error: Unexpected token 'if'.
+//   var set11 = {if (oracle("foo")) dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:15:16: Error: Unexpected token 'if'.
+//   var map11 = {if (oracle("foo")) "bar": dynVar, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:16:17: Error: Unexpected token 'if'.
+//   var list12 = [if (oracle("foo")) [42]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:17:16: Error: Unexpected token 'if'.
+//   var set12 = {if (oracle("foo")) [42], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:18:16: Error: Unexpected token 'if'.
+//   var map12 = {if (oracle("foo")) "bar": [42], "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:19:36: Error: Unexpected token '...'.
+//   var list20 = [if (oracle("foo")) ...[42]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:19:17: Error: Unexpected token 'if'.
+//   var list20 = [if (oracle("foo")) ...[42]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:20:35: Error: Unexpected token '...'.
+//   var set20 = {if (oracle("foo")) ...[42], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:20:16: Error: Unexpected token 'if'.
+//   var set20 = {if (oracle("foo")) ...[42], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:21:35: Error: Unexpected token '...'.
+//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:21:16: Error: Unexpected token 'if'.
+//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:22:36: Error: Unexpected token '...'.
+//   var list21 = [if (oracle("foo")) ...[dynVar]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:22:17: Error: Unexpected token 'if'.
+//   var list21 = [if (oracle("foo")) ...[dynVar]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:23:35: Error: Unexpected token '...'.
+//   var set21 = {if (oracle("foo")) ...[dynVar], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:23:16: Error: Unexpected token 'if'.
+//   var set21 = {if (oracle("foo")) ...[dynVar], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:24:35: Error: Unexpected token '...'.
+//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:24:16: Error: Unexpected token 'if'.
+//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:25:36: Error: Unexpected token '...'.
+//   var list22 = [if (oracle("foo")) ...[[42]]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:25:17: Error: Unexpected token 'if'.
+//   var list22 = [if (oracle("foo")) ...[[42]]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:26:35: Error: Unexpected token '...'.
+//   var set22 = {if (oracle("foo")) ...[[42]], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:26:16: Error: Unexpected token 'if'.
+//   var set22 = {if (oracle("foo")) ...[[42]], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:27:35: Error: Unexpected token '...'.
+//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:27:16: Error: Unexpected token 'if'.
+//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:28:50: Error: Unexpected token '...'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:28:36: Error: Unexpected token 'if'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:28:17: Error: Unexpected token 'if'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:29:49: Error: Unexpected token '...'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:29:35: Error: Unexpected token 'if'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:29:16: Error: Unexpected token 'if'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:30:49: Error: Unexpected token '...'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:30:35: Error: Unexpected token 'if'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:30:16: Error: Unexpected token 'if'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:31:50: Error: Unexpected token '...'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:31:36: Error: Unexpected token 'if'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:31:17: Error: Unexpected token 'if'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:32:49: Error: Unexpected token '...'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:32:35: Error: Unexpected token 'if'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:32:16: Error: Unexpected token 'if'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:33:49: Error: Unexpected token '...'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:33:35: Error: Unexpected token 'if'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:33:16: Error: Unexpected token 'if'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:34:50: Error: Unexpected token '...'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:34:36: Error: Unexpected token 'if'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:34:17: Error: Unexpected token 'if'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:35:49: Error: Unexpected token '...'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:35:35: Error: Unexpected token 'if'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:35:16: Error: Unexpected token 'if'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:36:49: Error: Unexpected token '...'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:36:35: Error: Unexpected token 'if'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:36:16: Error: Unexpected token 'if'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:37:48: Error: Unexpected token '...'.
+//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
+//                                                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:37:29: Error: Unexpected token 'if'.
+//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:38:46: Error: Unexpected token '...'.
+//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:38:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:39:54: Error: Unexpected token '...'.
+//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:39:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:40:48: Error: Unexpected token '...'.
+//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
+//                                                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:40:29: Error: Unexpected token 'if'.
+//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:41:46: Error: Unexpected token '...'.
+//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:41:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:42:62: Error: Unexpected token '...'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:42:48: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:42:29: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:43:60: Error: Unexpected token '...'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:43:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:43:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:44:68: Error: Unexpected token '...'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:44:54: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:44:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:45:42: Error: Unexpected token '...'.
+//   List<int> list50 = [if (oracle("foo")) ...[]];
+//                                          ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:45:23: Error: Unexpected token 'if'.
+//   List<int> list50 = [if (oracle("foo")) ...[]];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:46:40: Error: Unexpected token '...'.
+//   Set<int> set50 = {if (oracle("foo")) ...[], null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:46:21: Error: Unexpected token 'if'.
+//   Set<int> set50 = {if (oracle("foo")) ...[], null};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:47:48: Error: Unexpected token '...'.
+//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
+//                                                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:47:29: Error: Unexpected token 'if'.
+//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:48:42: Error: Unexpected token '...'.
+//   List<int> list51 = [if (oracle("foo")) ...{}];
+//                                          ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:48:23: Error: Unexpected token 'if'.
+//   List<int> list51 = [if (oracle("foo")) ...{}];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:49:40: Error: Unexpected token '...'.
+//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:49:21: Error: Unexpected token 'if'.
+//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:50:56: Error: Unexpected token '...'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                                                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:50:42: Error: Unexpected token 'if'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:50:23: Error: Unexpected token 'if'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:51:54: Error: Unexpected token '...'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:51:40: Error: Unexpected token 'if'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                                        ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:51:21: Error: Unexpected token 'if'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:52:62: Error: Unexpected token '...'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:52:48: Error: Unexpected token 'if'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:52:29: Error: Unexpected token 'if'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:53:48: Error: Unexpected token '...'.
+//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
+//                                                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:53:29: Error: Unexpected token 'if'.
+//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:54:46: Error: Unexpected token '...'.
+//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:54:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:55:54: Error: Unexpected token '...'.
+//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:55:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:56:62: Error: Unexpected token '...'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:56:48: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:56:29: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:57:60: Error: Unexpected token '...'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:57:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:57:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:58:68: Error: Unexpected token '...'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:58:54: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:58:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:59:29: Error: Unexpected token 'if'.
+//   List<List<int>> list70 = [if (oracle("foo")) []];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:60:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set70 = {if (oracle("foo")) [], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:61:48: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:61:29: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:62:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:62:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:63:17: Error: Unexpected token 'if'.
+//   var list80 = [if (oracle("foo")) 42 else 3.14];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:64:16: Error: Unexpected token 'if'.
+//   var set80 = {if (oracle("foo")) 42 else 3.14, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:65:16: Error: Unexpected token 'if'.
+//   var map80 = {if (oracle("foo")) "bar": 42 else "bar": 3.14, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:66:36: Error: Unexpected token '...'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:66:52: Error: Unexpected token '...'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:66:17: Error: Unexpected token 'if'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:67:35: Error: Unexpected token '...'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:67:51: Error: Unexpected token '...'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:67:16: Error: Unexpected token 'if'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:68:35: Error: Unexpected token '...'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:68:52: Error: Unexpected token '...'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:68:16: Error: Unexpected token 'if'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:69:36: Error: Unexpected token '...'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:69:52: Error: Unexpected token '...'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:69:17: Error: Unexpected token 'if'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:70:35: Error: Unexpected token '...'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:70:51: Error: Unexpected token '...'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:70:16: Error: Unexpected token 'if'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:71:35: Error: Unexpected token '...'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:71:52: Error: Unexpected token '...'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:71:16: Error: Unexpected token 'if'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:72:44: Error: Unexpected token '...'.
+//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
+//                                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:72:17: Error: Unexpected token 'if'.
+//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:73:35: Error: Unexpected token '...'.
+//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:73:16: Error: Unexpected token 'if'.
+//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:74:35: Error: Unexpected token '...'.
+//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:74:16: Error: Unexpected token 'if'.
+//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:75:23: Error: Unexpected token 'if'.
+//   List<int> list90 = [if (oracle("foo")) dynVar];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:76:21: Error: Unexpected token 'if'.
+//   Set<int> set90 = {if (oracle("foo")) dynVar, null};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:77:29: Error: Unexpected token 'if'.
+//   Map<String, int> map90 = {if (oracle("foo")) "bar": dynVar, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:78:42: Error: Unexpected token '...'.
+//   List<int> list91 = [if (oracle("foo")) ...dynVar];
+//                                          ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:78:23: Error: Unexpected token 'if'.
+//   List<int> list91 = [if (oracle("foo")) ...dynVar];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:79:40: Error: Unexpected token '...'.
+//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:79:21: Error: Unexpected token 'if'.
+//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:80:48: Error: Unexpected token '...'.
+//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
+//                                                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:80:29: Error: Unexpected token 'if'.
+//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:81:24: Error: Unexpected token 'if'.
+//   List<int> list100 = [if (dynVar) 42];
+//                        ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:82:22: Error: Unexpected token 'if'.
+//   Set<int> set100 = {if (dynVar) 42};
+//                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:83:27: Error: Unexpected token 'if'.
+//   Map<int, int> map100 = {if (dynVar) 42: 42};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:87:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) "bar"];
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:88:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) "bar", null};
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:89:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:90:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...["bar"]];
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:90:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...["bar"]];
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:91:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...["bar"], null};
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:91:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...["bar"], null};
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:92:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:92:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:93:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...map];
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:93:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...map];
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:94:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:94:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map, null};
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:95:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:95:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:96:12: Error: Unexpected token 'if'.
+//   <String>[if (oracle("foo")) 42 else 3.14];
+//            ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:97:12: Error: Unexpected token 'if'.
+//   <String>{if (oracle("foo")) 42 else 3.14, null};
+//            ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:98:20: Error: Unexpected token 'if'.
+//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
+//                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:99:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...map else 42];
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:99:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...map else 42];
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:100:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:100:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:101:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:101:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:102:36: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) 42 else ...map];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:102:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) 42 else ...map];
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:103:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:103:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:104:51: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:104:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:106:25: Error: Unexpected token 'if'.
+//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:107:34: Error: Unexpected token 'if'.
+//   Map<dynamic, dynamic> map10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                  ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:108:25: Error: Unexpected token 'if'.
+//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:109:34: Error: Unexpected token 'if'.
+//   Map<dynamic, dynamic> map11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                  ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:110:16: Error: Unexpected token 'if'.
+//   var map12 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:111:16: Error: Unexpected token 'if'.
+//   var map13 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:112:23: Error: Unexpected token 'if'.
+//   List<int> list20 = [if (42) 42];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:113:21: Error: Unexpected token 'if'.
+//   Set<int> set20 = {if (42) 42};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:114:26: Error: Unexpected token 'if'.
+//   Map<int, int> map30 = {if (42) 42: 42};
+//                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:115:34: Error: Unexpected token 'if'.
+//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
+//                                  ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:116:32: Error: Unexpected token 'if'.
+//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
+//                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:117:42: Error: Unexpected token 'if'.
+//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
+//                                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:118:42: Error: Unexpected token 'if'.
+//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
+//                                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:123:17: Error: Unexpected token 'for'.
+//   var list10 = [for (int i = 0; oracle("foo"); i++) 42];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:124:16: Error: Unexpected token 'for'.
+//   var set10 = {for (int i = 0; oracle("foo"); i++) 42, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:125:16: Error: Unexpected token 'for'.
+//   var map10 = {for (int i = 0; oracle("foo"); i++) "bar": 42, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:126:17: Error: Unexpected token 'for'.
+//   var list11 = [for (int i = 0; oracle("foo"); i++) dynVar];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:127:16: Error: Unexpected token 'for'.
+//   var set11 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:128:16: Error: Unexpected token 'for'.
+//   var map11 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:129:17: Error: Unexpected token 'for'.
+//   var list12 = [for (int i = 0; oracle("foo"); i++) [42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:130:16: Error: Unexpected token 'for'.
+//   var set12 = {for (int i = 0; oracle("foo"); i++) [42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:131:16: Error: Unexpected token 'for'.
+//   var map12 = {for (int i = 0; oracle("foo"); i++) "bar": [42], "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:132:53: Error: Unexpected token '...'.
+//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:132:17: Error: Unexpected token 'for'.
+//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:133:52: Error: Unexpected token '...'.
+//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:133:16: Error: Unexpected token 'for'.
+//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:134:52: Error: Unexpected token '...'.
+//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:134:16: Error: Unexpected token 'for'.
+//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:135:53: Error: Unexpected token '...'.
+//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:135:17: Error: Unexpected token 'for'.
+//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:136:52: Error: Unexpected token '...'.
+//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:136:16: Error: Unexpected token 'for'.
+//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:137:52: Error: Unexpected token '...'.
+//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:137:16: Error: Unexpected token 'for'.
+//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:138:53: Error: Unexpected token '...'.
+//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:138:17: Error: Unexpected token 'for'.
+//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:139:52: Error: Unexpected token '...'.
+//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:139:16: Error: Unexpected token 'for'.
+//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:140:52: Error: Unexpected token '...'.
+//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:140:16: Error: Unexpected token 'for'.
+//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:141:67: Error: Unexpected token '...'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:141:53: Error: Unexpected token 'if'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:141:17: Error: Unexpected token 'for'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:142:66: Error: Unexpected token '...'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:142:52: Error: Unexpected token 'if'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:142:16: Error: Unexpected token 'for'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:143:66: Error: Unexpected token '...'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:143:52: Error: Unexpected token 'if'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:143:16: Error: Unexpected token 'for'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:144:67: Error: Unexpected token '...'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:144:53: Error: Unexpected token 'if'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:144:17: Error: Unexpected token 'for'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:145:66: Error: Unexpected token '...'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:145:52: Error: Unexpected token 'if'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:145:16: Error: Unexpected token 'for'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:146:66: Error: Unexpected token '...'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:146:52: Error: Unexpected token 'if'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:146:16: Error: Unexpected token 'for'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:147:67: Error: Unexpected token '...'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:147:53: Error: Unexpected token 'if'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:147:17: Error: Unexpected token 'for'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:148:66: Error: Unexpected token '...'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:148:52: Error: Unexpected token 'if'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:148:16: Error: Unexpected token 'for'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:149:66: Error: Unexpected token '...'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:149:52: Error: Unexpected token 'if'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:149:16: Error: Unexpected token 'for'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:150:65: Error: Unexpected token '...'.
+//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:150:29: Error: Unexpected token 'for'.
+//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:151:63: Error: Unexpected token '...'.
+//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:151:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:152:71: Error: Unexpected token '...'.
+//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:152:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:153:65: Error: Unexpected token '...'.
+//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:153:29: Error: Unexpected token 'for'.
+//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:154:63: Error: Unexpected token '...'.
+//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:154:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:155:79: Error: Unexpected token '...'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:155:65: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:155:29: Error: Unexpected token 'for'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:156:77: Error: Unexpected token '...'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:156:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:156:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:157:85: Error: Unexpected token '...'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:157:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:157:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:158:59: Error: Unexpected token '...'.
+//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:158:23: Error: Unexpected token 'for'.
+//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:159:57: Error: Unexpected token '...'.
+//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:159:21: Error: Unexpected token 'for'.
+//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
+//                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:160:65: Error: Unexpected token '...'.
+//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:160:29: Error: Unexpected token 'for'.
+//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:161:59: Error: Unexpected token '...'.
+//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:161:23: Error: Unexpected token 'for'.
+//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:162:57: Error: Unexpected token '...'.
+//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:162:21: Error: Unexpected token 'for'.
+//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:163:73: Error: Unexpected token '...'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                                                                         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:163:59: Error: Unexpected token 'if'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                                                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:163:23: Error: Unexpected token 'for'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:164:71: Error: Unexpected token '...'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:164:57: Error: Unexpected token 'if'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                                                         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:164:21: Error: Unexpected token 'for'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:165:65: Error: Unexpected token '...'.
+//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:165:29: Error: Unexpected token 'for'.
+//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:166:63: Error: Unexpected token '...'.
+//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:166:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:167:71: Error: Unexpected token '...'.
+//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:167:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:168:79: Error: Unexpected token '...'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:168:65: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:168:29: Error: Unexpected token 'for'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:169:77: Error: Unexpected token '...'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:169:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:169:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:170:85: Error: Unexpected token '...'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:170:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:170:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:171:29: Error: Unexpected token 'for'.
+//   List<List<int>> list70 = [for (int i = 0; oracle("foo"); i++) []];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:172:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set70 = {for (int i = 0; oracle("foo"); i++) [], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:173:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map70 = {for (int i = 0; oracle("foo"); i++) "bar": [], "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:174:65: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:174:29: Error: Unexpected token 'for'.
+//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:175:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:175:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:176:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:176:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:177:53: Error: Unexpected token 'if'.
+//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:177:17: Error: Unexpected token 'for'.
+//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:178:52: Error: Unexpected token 'if'.
+//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:178:16: Error: Unexpected token 'for'.
+//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:179:52: Error: Unexpected token 'if'.
+//   var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:179:16: Error: Unexpected token 'for'.
+//   var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:180:67: Error: Unexpected token '...'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:180:83: Error: Unexpected token '...'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:180:53: Error: Unexpected token 'if'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:180:17: Error: Unexpected token 'for'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:181:66: Error: Unexpected token '...'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:181:82: Error: Unexpected token '...'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:181:52: Error: Unexpected token 'if'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:181:16: Error: Unexpected token 'for'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:182:66: Error: Unexpected token '...'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:182:87: Error: Unexpected token '...'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                                                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:182:52: Error: Unexpected token 'if'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:182:16: Error: Unexpected token 'for'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:183:67: Error: Unexpected token '...'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:183:83: Error: Unexpected token '...'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:183:53: Error: Unexpected token 'if'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:183:17: Error: Unexpected token 'for'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:184:66: Error: Unexpected token '...'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:184:82: Error: Unexpected token '...'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:184:52: Error: Unexpected token 'if'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:184:16: Error: Unexpected token 'for'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:185:66: Error: Unexpected token '...'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:185:87: Error: Unexpected token '...'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                                                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:185:52: Error: Unexpected token 'if'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:185:16: Error: Unexpected token 'for'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:186:75: Error: Unexpected token '...'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:186:53: Error: Unexpected token 'if'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:186:17: Error: Unexpected token 'for'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:187:66: Error: Unexpected token '...'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:187:52: Error: Unexpected token 'if'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:187:16: Error: Unexpected token 'for'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:188:66: Error: Unexpected token '...'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:188:52: Error: Unexpected token 'if'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:188:16: Error: Unexpected token 'for'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:189:23: Error: Unexpected token 'for'.
+//   List<int> list90 = [for (int i = 0; oracle("foo"); i++) dynVar];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:190:21: Error: Unexpected token 'for'.
+//   Set<int> set90 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:191:29: Error: Unexpected token 'for'.
+//   Map<String, int> map90 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:192:59: Error: Unexpected token '...'.
+//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:192:23: Error: Unexpected token 'for'.
+//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:193:57: Error: Unexpected token '...'.
+//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:193:21: Error: Unexpected token 'for'.
+//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:194:65: Error: Unexpected token '...'.
+//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:194:29: Error: Unexpected token 'for'.
+//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:195:29: Error: Unexpected token 'for'.
+//   List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:196:27: Error: Unexpected token 'for'.
+//   Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:197:43: Error: Unexpected token 'for'.
+//   Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
+//                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:198:18: Error: Unexpected token 'for'.
+//   var list110 = [for (var i in [1, 2, 3]) i];
+//                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:199:17: Error: Unexpected token 'for'.
+//   var set110 = {for (var i in [1, 2, 3]) i, null};
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:200:17: Error: Unexpected token 'for'.
+//   var map110 = {for (var i in [1, 2, 3]) "bar": i, "baz": null};
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:201:24: Error: Unexpected token 'for'.
+//   List<int> list120 = [for (var i in dynVar) i];
+//                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:202:22: Error: Unexpected token 'for'.
+//   Set<int> set120 = {for (var i in dynVar) i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:203:30: Error: Unexpected token 'for'.
+//   Map<String, int> map120 = {for (var i in dynVar) "bar": i, "baz": null};
+//                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:204:24: Error: Unexpected token 'for'.
+//   List<int> list130 = [for (var i = 1; i < 2; i++) i];
+//                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:205:22: Error: Unexpected token 'for'.
+//   Set<int> set130 = {for (var i = 1; i < 2; i++) i};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:206:27: Error: Unexpected token 'for'.
+//   Map<int, int> map130 = {for (var i = 1; i < 2; i++) i: i};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:210:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) "bar"];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:211:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:212:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:213:45: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+//                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:213:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:214:45: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+//                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:214:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:215:50: Error: Unexpected token '...'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:215:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:216:45: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
+//                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:216:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:217:45: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+//                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:217:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:218:50: Error: Unexpected token '...'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+//                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:218:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+//              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:219:48: Error: Unexpected token 'if'.
+//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:219:12: Error: Unexpected token 'for'.
+//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:220:48: Error: Unexpected token 'if'.
+//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:220:12: Error: Unexpected token 'for'.
+//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:221:56: Error: Unexpected token 'if'.
+//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                                                        ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:221:20: Error: Unexpected token 'for'.
+//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:222:59: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:222:45: Error: Unexpected token 'if'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//                                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:222:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:223:59: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:223:45: Error: Unexpected token 'if'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//                                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:223:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:224:67: Error: Unexpected token '...'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:224:53: Error: Unexpected token 'if'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:224:17: Error: Unexpected token 'for'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:225:67: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:225:45: Error: Unexpected token 'if'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//                                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:225:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:226:67: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:226:45: Error: Unexpected token 'if'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//                                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:226:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:227:82: Error: Unexpected token '...'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
+//                                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:227:53: Error: Unexpected token 'if'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:227:17: Error: Unexpected token 'for'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:230:9: Error: Unexpected token 'for'.
+//   <int>[for (i in <int>[1]) i];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:231:9: Error: Unexpected token 'for'.
+//   <int>{for (i in <int>[1]) i, null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:232:16: Error: Unexpected token 'for'.
+// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
+// 	              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:234:17: Error: Unexpected token 'for'.
+//   var list10 = [for (var i in "not iterable") i];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:235:16: Error: Unexpected token 'for'.
+//   var set10 = {for (var i in "not iterable") i, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:236:16: Error: Unexpected token 'for'.
+//   var map10 = {for (var i in "not iterable") "bar": i, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:237:17: Error: Unexpected token 'for'.
+//   var list20 = [for (int i in ["not", "int"]) i];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:238:16: Error: Unexpected token 'for'.
+//   var set20 = {for (int i in ["not", "int"]) i, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:239:16: Error: Unexpected token 'for'.
+//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:240:23: Error: Unexpected token 'for'.
+//   var list30 = [await for (var i in "not stream") i];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:241:22: Error: Unexpected token 'for'.
+//   var set30 = {await for (var i in "not stream") i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:242:22: Error: Unexpected token 'for'.
+//   var map30 = {await for (var i in "not stream") "bar": i, "baz": null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:243:23: Error: Unexpected token 'for'.
+//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:244:22: Error: Unexpected token 'for'.
+//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:245:22: Error: Unexpected token 'for'.
+//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:246:17: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var list50 = [await for (;;) 42];
+//                 ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:246:23: Error: Unexpected token 'for'.
+//   var list50 = [await for (;;) 42];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:247:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var set50 = {await for (;;) 42, null};
+//                ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:247:22: Error: Unexpected token 'for'.
+//   var set50 = {await for (;;) 42, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:248:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var map50 = {await for (;;) "bar": 42, "baz": null};
+//                ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:248:22: Error: Unexpected token 'for'.
+//   var map50 = {await for (;;) "bar": 42, "baz": null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:249:17: Error: Unexpected token 'for'.
+//   var list60 = [for (; "not bool";) 42];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:250:16: Error: Unexpected token 'for'.
+//   var set60 = {for (; "not bool";) 42, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:251:16: Error: Unexpected token 'for'.
+//   var map60 = {for (; "not bool";) "bar": 42, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:255:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <int>[await for (int i in stream) i];
+//                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:255:15: Error: Unexpected token 'for'.
+//   <int>[await for (int i in stream) i];
+//               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:256:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <int>{await for (int i in stream) i};
+//                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:256:15: Error: Unexpected token 'for'.
+//   <int>{await for (int i in stream) i};
+//               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:257:34: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <String, int>{await for (int i in stream) "bar": i};
+//                                  ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:257:23: Error: Unexpected token 'for'.
+//   <String, int>{await for (int i in stream) "bar": i};
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:267:23: Error: Unexpected token 'if'.
+//   List<int> list10 = [if (a is B) a.foo];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:268:21: Error: Unexpected token 'if'.
+//   Set<int> set10 = {if (a is B) a.foo};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:269:26: Error: Unexpected token 'if'.
+//   Map<int, int> map10 = {if (a is B) a.foo: a.foo};
+//                          ^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  get foo() → core::int
+    return 42;
+}
+static method oracle<T extends core::Object = dynamic>([self::oracle::T t = null]) → dynamic
+  return true;
+static method testIfElement(dynamic dynVar, core::List<core::int> listInt, core::List<core::double> listDouble, core::Map<core::String, core::int> mapToInt, core::Map<core::String, core::double> mapToDouble) → dynamic {
+  dynamic list10 = <dynamic>[];
+  dynamic set10 = <dynamic>{null};
+  dynamic map10 = <dynamic, dynamic>{"baz": null};
+  dynamic list11 = <dynamic>[];
+  dynamic set11 = <dynamic>{null};
+  dynamic map11 = <dynamic, dynamic>{"baz": null};
+  dynamic list12 = <dynamic>[];
+  dynamic set12 = <dynamic>{null};
+  dynamic map12 = <dynamic, dynamic>{"baz": null};
+  dynamic list20 = <dynamic>[];
+  dynamic set20 = <dynamic>{null};
+  dynamic map20 = <dynamic, dynamic>{"baz": null};
+  dynamic list21 = <dynamic>[];
+  dynamic set21 = <dynamic>{null};
+  dynamic map21 = <dynamic, dynamic>{"baz": null};
+  dynamic list22 = <dynamic>[];
+  dynamic set22 = <dynamic>{null};
+  dynamic map22 = <dynamic, dynamic>{"baz": null};
+  dynamic list30 = <dynamic>[];
+  dynamic set30 = <dynamic>{null};
+  dynamic map30 = <dynamic, dynamic>{"baz": null};
+  dynamic list31 = <dynamic>[];
+  dynamic set31 = <dynamic>{null};
+  dynamic map31 = <dynamic, dynamic>{"baz": null};
+  dynamic list33 = <dynamic>[];
+  dynamic set33 = <dynamic>{null};
+  dynamic map33 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list40 = <dynamic>[];
+  core::Set<core::List<core::int>> set40 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map40 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list41 = <dynamic>[];
+  core::Set<core::List<core::int>> set41 = <dynamic>{null};
+  core::List<core::List<core::int>> list42 = <dynamic>[];
+  core::Set<core::List<core::int>> set42 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map42 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list50 = <dynamic>[];
+  core::Set<core::int> set50 = <dynamic>{null};
+  core::Map<core::String, core::int> map50 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list51 = <dynamic>[];
+  core::Set<core::int> set51 = <dynamic>{null};
+  core::List<core::int> list52 = <dynamic>[];
+  core::Set<core::int> set52 = <dynamic>{null};
+  core::Map<core::String, core::int> map52 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list60 = <dynamic>[];
+  core::Set<core::List<core::int>> set60 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map60 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list61 = <dynamic>[];
+  core::Set<core::List<core::int>> set61 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map61 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list70 = <dynamic>[];
+  core::Set<core::List<core::int>> set70 = <dynamic>{null};
+  core::List<core::List<core::int>> list71 = <dynamic>[];
+  core::Set<core::List<core::int>> set71 = <dynamic>{null};
+  dynamic list80 = <dynamic>[];
+  dynamic set80 = <dynamic>{null};
+  dynamic map80 = <dynamic, dynamic>{"baz": null};
+  dynamic list81 = <dynamic>[];
+  dynamic set81 = <dynamic>{null};
+  dynamic map81 = <dynamic, dynamic>{"baz": null};
+  dynamic list82 = <dynamic>[];
+  dynamic set82 = <dynamic>{null};
+  dynamic map82 = <dynamic>{null};
+  dynamic list83 = <dynamic>[];
+  dynamic set83 = <dynamic>{null};
+  dynamic map83 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list90 = <dynamic>[];
+  core::Set<core::int> set90 = <dynamic>{null};
+  core::Map<core::String, core::int> map90 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list91 = <dynamic>[];
+  core::Set<core::int> set91 = <dynamic>{null};
+  core::Map<core::String, core::int> map91 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list100 = <dynamic>[];
+  core::Set<core::int> set100 = <dynamic, dynamic>{};
+  core::Map<core::int, core::int> map100 = <dynamic, dynamic>{};
+}
+static method testIfElementErrors(core::Map<core::int, core::int> map) → dynamic {
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  <core::String>[];
+  <core::String>{null};
+  <core::String, core::String>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  core::Set<dynamic> set10 = <dynamic, dynamic>{};
+  core::Map<dynamic, dynamic> map10 = <dynamic, dynamic>{};
+  core::Set<dynamic> set11 = <dynamic, dynamic>{};
+  core::Map<dynamic, dynamic> map11 = <dynamic, dynamic>{};
+  dynamic map12 = <dynamic, dynamic>{};
+  dynamic map13 = <dynamic, dynamic>{};
+  core::List<core::int> list20 = <dynamic>[];
+  core::Set<core::int> set20 = <dynamic, dynamic>{};
+  core::Map<core::int, core::int> map30 = <dynamic, dynamic>{};
+  core::List<core::String> list40 = <core::String>[];
+  core::Set<core::String> set40 = <core::String>{};
+  core::Map<core::String, core::int> map40 = <core::String, core::int>{};
+  core::Map<core::int, core::String> map41 = <core::int, core::String>{};
+}
+static method testForElement(dynamic dynVar, core::List<core::int> listInt, core::List<core::double> listDouble, core::int index, core::Map<core::String, core::int> mapStringInt, core::Map<core::String, core::double> mapStringDouble) → dynamic {
+  dynamic list10 = <dynamic>[];
+  dynamic set10 = <dynamic>{null};
+  dynamic map10 = <dynamic, dynamic>{"baz": null};
+  dynamic list11 = <dynamic>[];
+  dynamic set11 = <dynamic>{null};
+  dynamic map11 = <dynamic, dynamic>{"baz": null};
+  dynamic list12 = <dynamic>[];
+  dynamic set12 = <dynamic>{null};
+  dynamic map12 = <dynamic, dynamic>{"baz": null};
+  dynamic list20 = <dynamic>[];
+  dynamic set20 = <dynamic>{null};
+  dynamic map20 = <dynamic, dynamic>{"baz": null};
+  dynamic list21 = <dynamic>[];
+  dynamic set21 = <dynamic>{null};
+  dynamic map21 = <dynamic, dynamic>{"baz": null};
+  dynamic list22 = <dynamic>[];
+  dynamic set22 = <dynamic>{null};
+  dynamic map22 = <dynamic, dynamic>{"baz": null};
+  dynamic list30 = <dynamic>[];
+  dynamic set30 = <dynamic>{null};
+  dynamic map30 = <dynamic, dynamic>{"baz": null};
+  dynamic list31 = <dynamic>[];
+  dynamic set31 = <dynamic>{null};
+  dynamic map31 = <dynamic, dynamic>{"baz": null};
+  dynamic list33 = <dynamic>[];
+  dynamic set33 = <dynamic>{null};
+  dynamic map33 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list40 = <dynamic>[];
+  core::Set<core::List<core::int>> set40 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map40 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list41 = <dynamic>[];
+  core::Set<core::List<core::int>> set41 = <dynamic>{null};
+  core::List<core::List<core::int>> list42 = <dynamic>[];
+  core::Set<core::List<core::int>> set42 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map42 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list50 = <dynamic>[];
+  core::Set<core::int> set50 = <dynamic>{null};
+  core::Map<core::String, core::int> map50 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list51 = <dynamic>[];
+  core::Set<core::int> set51 = <dynamic>{null};
+  core::List<core::int> list52 = <dynamic>[];
+  core::Set<core::int> set52 = <dynamic>{null};
+  core::List<core::List<core::int>> list60 = <dynamic>[];
+  core::Set<core::List<core::int>> set60 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map60 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list61 = <dynamic>[];
+  core::Set<core::List<core::int>> set61 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map61 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list70 = <dynamic>[];
+  core::Set<core::List<core::int>> set70 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map70 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list71 = <dynamic>[];
+  core::Set<core::List<core::int>> set71 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map71 = <dynamic, dynamic>{"baz": null};
+  dynamic list80 = <dynamic>[];
+  dynamic set80 = <dynamic>{null};
+  dynamic map80 = <dynamic, dynamic>{"baz": null};
+  dynamic list81 = <dynamic>[];
+  dynamic set81 = <dynamic>{null};
+  dynamic map81 = <dynamic, dynamic>{"baz": null};
+  dynamic list82 = <dynamic>[];
+  dynamic set82 = <dynamic>{null};
+  dynamic map82 = <dynamic, dynamic>{"baz": null};
+  dynamic list83 = <dynamic>[];
+  dynamic set83 = <dynamic>{null};
+  dynamic map83 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list90 = <dynamic>[];
+  core::Set<core::int> set90 = <dynamic>{null};
+  core::Map<core::String, core::int> map90 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list91 = <dynamic>[];
+  core::Set<core::int> set91 = <dynamic>{null};
+  core::Map<core::String, core::int> map91 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list100 = <core::int>[];
+  core::Set<core::int> set100 = <core::int>{};
+  core::Map<core::String, core::int> map100 = <core::String, core::int>{};
+  dynamic list110 = <dynamic>[];
+  dynamic set110 = <dynamic>{null};
+  dynamic map110 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list120 = <dynamic>[];
+  core::Set<core::int> set120 = <dynamic>{null};
+  core::Map<core::String, core::int> map120 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list130 = <dynamic>[];
+  core::Set<core::int> set130 = <dynamic, dynamic>{};
+  core::Map<core::int, core::int> map130 = <dynamic, dynamic>{};
+}
+static method testForElementErrors(core::Map<core::int, core::int> map, core::List<core::int> list) → dynamic async {
+  <core::int>[];
+  <core::int>{null};
+  <core::int, core::int>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::int, core::int>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::int, core::int>{42: null};
+  <core::String>[];
+  <core::String>{null};
+  <core::String, core::String>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  final dynamic i = 0;
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  dynamic list10 = <dynamic>[];
+  dynamic set10 = <dynamic>{null};
+  dynamic map10 = <dynamic, dynamic>{"baz": null};
+  dynamic list20 = <dynamic>[];
+  dynamic set20 = <dynamic>{null};
+  dynamic map20 = <dynamic, dynamic>{"baz": null};
+  dynamic list30 = <dynamic>[];
+  dynamic set30 = <dynamic>{null};
+  dynamic map30 = <dynamic, dynamic>{"baz": null};
+  dynamic list40 = <dynamic>[];
+  dynamic set40 = <dynamic>{null};
+  dynamic map40 = <dynamic, dynamic>{"baz": null};
+  dynamic list50 = <dynamic>[];
+  dynamic set50 = <dynamic>{null};
+  dynamic map50 = <dynamic, dynamic>{"baz": null};
+  dynamic list60 = <dynamic>[];
+  dynamic set60 = <dynamic>{null};
+  dynamic map60 = <dynamic, dynamic>{"baz": null};
+}
+static method testForElementErrorsNotAsync(asy::Stream<core::int> stream) → dynamic {
+  <core::int>[];
+  <core::int>{};
+  <core::String, core::int>{};
+}
+static method testPromotion(self::A a) → dynamic {
+  core::List<core::int> list10 = <dynamic>[];
+  core::Set<core::int> set10 = <dynamic, dynamic>{};
+  core::Map<core::int, core::int> map10 = <dynamic, dynamic>{};
+}
+static method main() → dynamic {}
diff --git a/front_end/testcases/control_flow_collection_inference.dart.legacy.transformed.expect b/front_end/testcases/control_flow_collection_inference.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d384c49
--- /dev/null
+++ b/front_end/testcases/control_flow_collection_inference.dart.legacy.transformed.expect
@@ -0,0 +1,2059 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:10:17: Error: Unexpected token 'if'.
+//   var list10 = [if (oracle("foo")) 42];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:11:16: Error: Unexpected token 'if'.
+//   var set10 = {if (oracle("foo")) 42, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:12:16: Error: Unexpected token 'if'.
+//   var map10 = {if (oracle("foo")) "bar": 42, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:13:17: Error: Unexpected token 'if'.
+//   var list11 = [if (oracle("foo")) dynVar];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:14:16: Error: Unexpected token 'if'.
+//   var set11 = {if (oracle("foo")) dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:15:16: Error: Unexpected token 'if'.
+//   var map11 = {if (oracle("foo")) "bar": dynVar, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:16:17: Error: Unexpected token 'if'.
+//   var list12 = [if (oracle("foo")) [42]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:17:16: Error: Unexpected token 'if'.
+//   var set12 = {if (oracle("foo")) [42], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:18:16: Error: Unexpected token 'if'.
+//   var map12 = {if (oracle("foo")) "bar": [42], "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:19:36: Error: Unexpected token '...'.
+//   var list20 = [if (oracle("foo")) ...[42]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:19:17: Error: Unexpected token 'if'.
+//   var list20 = [if (oracle("foo")) ...[42]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:20:35: Error: Unexpected token '...'.
+//   var set20 = {if (oracle("foo")) ...[42], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:20:16: Error: Unexpected token 'if'.
+//   var set20 = {if (oracle("foo")) ...[42], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:21:35: Error: Unexpected token '...'.
+//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:21:16: Error: Unexpected token 'if'.
+//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:22:36: Error: Unexpected token '...'.
+//   var list21 = [if (oracle("foo")) ...[dynVar]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:22:17: Error: Unexpected token 'if'.
+//   var list21 = [if (oracle("foo")) ...[dynVar]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:23:35: Error: Unexpected token '...'.
+//   var set21 = {if (oracle("foo")) ...[dynVar], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:23:16: Error: Unexpected token 'if'.
+//   var set21 = {if (oracle("foo")) ...[dynVar], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:24:35: Error: Unexpected token '...'.
+//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:24:16: Error: Unexpected token 'if'.
+//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:25:36: Error: Unexpected token '...'.
+//   var list22 = [if (oracle("foo")) ...[[42]]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:25:17: Error: Unexpected token 'if'.
+//   var list22 = [if (oracle("foo")) ...[[42]]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:26:35: Error: Unexpected token '...'.
+//   var set22 = {if (oracle("foo")) ...[[42]], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:26:16: Error: Unexpected token 'if'.
+//   var set22 = {if (oracle("foo")) ...[[42]], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:27:35: Error: Unexpected token '...'.
+//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:27:16: Error: Unexpected token 'if'.
+//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:28:50: Error: Unexpected token '...'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:28:36: Error: Unexpected token 'if'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:28:17: Error: Unexpected token 'if'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:29:49: Error: Unexpected token '...'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:29:35: Error: Unexpected token 'if'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:29:16: Error: Unexpected token 'if'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:30:49: Error: Unexpected token '...'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:30:35: Error: Unexpected token 'if'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:30:16: Error: Unexpected token 'if'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:31:50: Error: Unexpected token '...'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:31:36: Error: Unexpected token 'if'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:31:17: Error: Unexpected token 'if'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:32:49: Error: Unexpected token '...'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:32:35: Error: Unexpected token 'if'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:32:16: Error: Unexpected token 'if'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:33:49: Error: Unexpected token '...'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:33:35: Error: Unexpected token 'if'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:33:16: Error: Unexpected token 'if'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:34:50: Error: Unexpected token '...'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:34:36: Error: Unexpected token 'if'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:34:17: Error: Unexpected token 'if'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:35:49: Error: Unexpected token '...'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:35:35: Error: Unexpected token 'if'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:35:16: Error: Unexpected token 'if'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:36:49: Error: Unexpected token '...'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:36:35: Error: Unexpected token 'if'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:36:16: Error: Unexpected token 'if'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:37:48: Error: Unexpected token '...'.
+//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
+//                                                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:37:29: Error: Unexpected token 'if'.
+//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:38:46: Error: Unexpected token '...'.
+//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:38:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:39:54: Error: Unexpected token '...'.
+//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:39:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:40:48: Error: Unexpected token '...'.
+//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
+//                                                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:40:29: Error: Unexpected token 'if'.
+//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:41:46: Error: Unexpected token '...'.
+//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:41:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:42:62: Error: Unexpected token '...'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:42:48: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:42:29: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:43:60: Error: Unexpected token '...'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:43:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:43:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:44:68: Error: Unexpected token '...'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:44:54: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:44:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:45:42: Error: Unexpected token '...'.
+//   List<int> list50 = [if (oracle("foo")) ...[]];
+//                                          ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:45:23: Error: Unexpected token 'if'.
+//   List<int> list50 = [if (oracle("foo")) ...[]];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:46:40: Error: Unexpected token '...'.
+//   Set<int> set50 = {if (oracle("foo")) ...[], null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:46:21: Error: Unexpected token 'if'.
+//   Set<int> set50 = {if (oracle("foo")) ...[], null};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:47:48: Error: Unexpected token '...'.
+//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
+//                                                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:47:29: Error: Unexpected token 'if'.
+//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:48:42: Error: Unexpected token '...'.
+//   List<int> list51 = [if (oracle("foo")) ...{}];
+//                                          ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:48:23: Error: Unexpected token 'if'.
+//   List<int> list51 = [if (oracle("foo")) ...{}];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:49:40: Error: Unexpected token '...'.
+//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:49:21: Error: Unexpected token 'if'.
+//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:50:56: Error: Unexpected token '...'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                                                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:50:42: Error: Unexpected token 'if'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:50:23: Error: Unexpected token 'if'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:51:54: Error: Unexpected token '...'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:51:40: Error: Unexpected token 'if'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                                        ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:51:21: Error: Unexpected token 'if'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:52:62: Error: Unexpected token '...'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:52:48: Error: Unexpected token 'if'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:52:29: Error: Unexpected token 'if'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:53:48: Error: Unexpected token '...'.
+//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
+//                                                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:53:29: Error: Unexpected token 'if'.
+//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:54:46: Error: Unexpected token '...'.
+//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:54:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:55:54: Error: Unexpected token '...'.
+//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:55:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:56:62: Error: Unexpected token '...'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:56:48: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:56:29: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:57:60: Error: Unexpected token '...'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:57:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:57:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:58:68: Error: Unexpected token '...'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:58:54: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:58:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:59:29: Error: Unexpected token 'if'.
+//   List<List<int>> list70 = [if (oracle("foo")) []];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:60:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set70 = {if (oracle("foo")) [], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:61:48: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:61:29: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:62:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:62:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:63:17: Error: Unexpected token 'if'.
+//   var list80 = [if (oracle("foo")) 42 else 3.14];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:64:16: Error: Unexpected token 'if'.
+//   var set80 = {if (oracle("foo")) 42 else 3.14, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:65:16: Error: Unexpected token 'if'.
+//   var map80 = {if (oracle("foo")) "bar": 42 else "bar": 3.14, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:66:36: Error: Unexpected token '...'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:66:52: Error: Unexpected token '...'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:66:17: Error: Unexpected token 'if'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:67:35: Error: Unexpected token '...'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:67:51: Error: Unexpected token '...'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:67:16: Error: Unexpected token 'if'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:68:35: Error: Unexpected token '...'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:68:52: Error: Unexpected token '...'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:68:16: Error: Unexpected token 'if'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:69:36: Error: Unexpected token '...'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:69:52: Error: Unexpected token '...'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:69:17: Error: Unexpected token 'if'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:70:35: Error: Unexpected token '...'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:70:51: Error: Unexpected token '...'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:70:16: Error: Unexpected token 'if'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:71:35: Error: Unexpected token '...'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:71:52: Error: Unexpected token '...'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:71:16: Error: Unexpected token 'if'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:72:44: Error: Unexpected token '...'.
+//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
+//                                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:72:17: Error: Unexpected token 'if'.
+//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:73:35: Error: Unexpected token '...'.
+//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:73:16: Error: Unexpected token 'if'.
+//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:74:35: Error: Unexpected token '...'.
+//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:74:16: Error: Unexpected token 'if'.
+//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:75:23: Error: Unexpected token 'if'.
+//   List<int> list90 = [if (oracle("foo")) dynVar];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:76:21: Error: Unexpected token 'if'.
+//   Set<int> set90 = {if (oracle("foo")) dynVar, null};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:77:29: Error: Unexpected token 'if'.
+//   Map<String, int> map90 = {if (oracle("foo")) "bar": dynVar, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:78:42: Error: Unexpected token '...'.
+//   List<int> list91 = [if (oracle("foo")) ...dynVar];
+//                                          ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:78:23: Error: Unexpected token 'if'.
+//   List<int> list91 = [if (oracle("foo")) ...dynVar];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:79:40: Error: Unexpected token '...'.
+//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:79:21: Error: Unexpected token 'if'.
+//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:80:48: Error: Unexpected token '...'.
+//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
+//                                                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:80:29: Error: Unexpected token 'if'.
+//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:81:24: Error: Unexpected token 'if'.
+//   List<int> list100 = [if (dynVar) 42];
+//                        ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:82:22: Error: Unexpected token 'if'.
+//   Set<int> set100 = {if (dynVar) 42};
+//                      ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:83:27: Error: Unexpected token 'if'.
+//   Map<int, int> map100 = {if (dynVar) 42: 42};
+//                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:87:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) "bar"];
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:88:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) "bar", null};
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:89:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:90:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...["bar"]];
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:90:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...["bar"]];
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:91:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...["bar"], null};
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:91:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...["bar"], null};
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:92:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:92:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:93:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...map];
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:93:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...map];
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:94:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:94:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map, null};
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:95:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:95:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:96:12: Error: Unexpected token 'if'.
+//   <String>[if (oracle("foo")) 42 else 3.14];
+//            ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:97:12: Error: Unexpected token 'if'.
+//   <String>{if (oracle("foo")) 42 else 3.14, null};
+//            ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:98:20: Error: Unexpected token 'if'.
+//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
+//                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:99:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...map else 42];
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:99:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...map else 42];
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:100:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:100:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:101:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:101:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:102:36: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) 42 else ...map];
+//                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:102:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) 42 else ...map];
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:103:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:103:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:104:51: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:104:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:106:25: Error: Unexpected token 'if'.
+//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:107:34: Error: Unexpected token 'if'.
+//   Map<dynamic, dynamic> map10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                  ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:108:25: Error: Unexpected token 'if'.
+//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:109:34: Error: Unexpected token 'if'.
+//   Map<dynamic, dynamic> map11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                  ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:110:16: Error: Unexpected token 'if'.
+//   var map12 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:111:16: Error: Unexpected token 'if'.
+//   var map13 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:112:23: Error: Unexpected token 'if'.
+//   List<int> list20 = [if (42) 42];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:113:21: Error: Unexpected token 'if'.
+//   Set<int> set20 = {if (42) 42};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:114:26: Error: Unexpected token 'if'.
+//   Map<int, int> map30 = {if (42) 42: 42};
+//                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:115:34: Error: Unexpected token 'if'.
+//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
+//                                  ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:116:32: Error: Unexpected token 'if'.
+//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
+//                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:117:42: Error: Unexpected token 'if'.
+//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
+//                                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:118:42: Error: Unexpected token 'if'.
+//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
+//                                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:123:17: Error: Unexpected token 'for'.
+//   var list10 = [for (int i = 0; oracle("foo"); i++) 42];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:124:16: Error: Unexpected token 'for'.
+//   var set10 = {for (int i = 0; oracle("foo"); i++) 42, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:125:16: Error: Unexpected token 'for'.
+//   var map10 = {for (int i = 0; oracle("foo"); i++) "bar": 42, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:126:17: Error: Unexpected token 'for'.
+//   var list11 = [for (int i = 0; oracle("foo"); i++) dynVar];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:127:16: Error: Unexpected token 'for'.
+//   var set11 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:128:16: Error: Unexpected token 'for'.
+//   var map11 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:129:17: Error: Unexpected token 'for'.
+//   var list12 = [for (int i = 0; oracle("foo"); i++) [42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:130:16: Error: Unexpected token 'for'.
+//   var set12 = {for (int i = 0; oracle("foo"); i++) [42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:131:16: Error: Unexpected token 'for'.
+//   var map12 = {for (int i = 0; oracle("foo"); i++) "bar": [42], "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:132:53: Error: Unexpected token '...'.
+//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:132:17: Error: Unexpected token 'for'.
+//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:133:52: Error: Unexpected token '...'.
+//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:133:16: Error: Unexpected token 'for'.
+//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:134:52: Error: Unexpected token '...'.
+//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:134:16: Error: Unexpected token 'for'.
+//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:135:53: Error: Unexpected token '...'.
+//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:135:17: Error: Unexpected token 'for'.
+//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:136:52: Error: Unexpected token '...'.
+//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:136:16: Error: Unexpected token 'for'.
+//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:137:52: Error: Unexpected token '...'.
+//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:137:16: Error: Unexpected token 'for'.
+//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:138:53: Error: Unexpected token '...'.
+//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:138:17: Error: Unexpected token 'for'.
+//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:139:52: Error: Unexpected token '...'.
+//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:139:16: Error: Unexpected token 'for'.
+//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:140:52: Error: Unexpected token '...'.
+//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:140:16: Error: Unexpected token 'for'.
+//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:141:67: Error: Unexpected token '...'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:141:53: Error: Unexpected token 'if'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:141:17: Error: Unexpected token 'for'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:142:66: Error: Unexpected token '...'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:142:52: Error: Unexpected token 'if'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:142:16: Error: Unexpected token 'for'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:143:66: Error: Unexpected token '...'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:143:52: Error: Unexpected token 'if'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:143:16: Error: Unexpected token 'for'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:144:67: Error: Unexpected token '...'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:144:53: Error: Unexpected token 'if'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:144:17: Error: Unexpected token 'for'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:145:66: Error: Unexpected token '...'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:145:52: Error: Unexpected token 'if'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:145:16: Error: Unexpected token 'for'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:146:66: Error: Unexpected token '...'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:146:52: Error: Unexpected token 'if'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:146:16: Error: Unexpected token 'for'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:147:67: Error: Unexpected token '...'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:147:53: Error: Unexpected token 'if'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:147:17: Error: Unexpected token 'for'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:148:66: Error: Unexpected token '...'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:148:52: Error: Unexpected token 'if'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:148:16: Error: Unexpected token 'for'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:149:66: Error: Unexpected token '...'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:149:52: Error: Unexpected token 'if'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:149:16: Error: Unexpected token 'for'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:150:65: Error: Unexpected token '...'.
+//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:150:29: Error: Unexpected token 'for'.
+//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:151:63: Error: Unexpected token '...'.
+//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:151:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:152:71: Error: Unexpected token '...'.
+//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:152:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:153:65: Error: Unexpected token '...'.
+//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:153:29: Error: Unexpected token 'for'.
+//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:154:63: Error: Unexpected token '...'.
+//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:154:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:155:79: Error: Unexpected token '...'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:155:65: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:155:29: Error: Unexpected token 'for'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:156:77: Error: Unexpected token '...'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:156:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:156:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:157:85: Error: Unexpected token '...'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:157:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:157:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:158:59: Error: Unexpected token '...'.
+//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:158:23: Error: Unexpected token 'for'.
+//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:159:57: Error: Unexpected token '...'.
+//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:159:21: Error: Unexpected token 'for'.
+//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
+//                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:160:65: Error: Unexpected token '...'.
+//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:160:29: Error: Unexpected token 'for'.
+//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:161:59: Error: Unexpected token '...'.
+//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:161:23: Error: Unexpected token 'for'.
+//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:162:57: Error: Unexpected token '...'.
+//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:162:21: Error: Unexpected token 'for'.
+//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:163:73: Error: Unexpected token '...'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                                                                         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:163:59: Error: Unexpected token 'if'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                                                           ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:163:23: Error: Unexpected token 'for'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:164:71: Error: Unexpected token '...'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:164:57: Error: Unexpected token 'if'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                                                         ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:164:21: Error: Unexpected token 'for'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:165:65: Error: Unexpected token '...'.
+//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:165:29: Error: Unexpected token 'for'.
+//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:166:63: Error: Unexpected token '...'.
+//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:166:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:167:71: Error: Unexpected token '...'.
+//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:167:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:168:79: Error: Unexpected token '...'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:168:65: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:168:29: Error: Unexpected token 'for'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:169:77: Error: Unexpected token '...'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:169:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:169:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:170:85: Error: Unexpected token '...'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:170:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:170:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:171:29: Error: Unexpected token 'for'.
+//   List<List<int>> list70 = [for (int i = 0; oracle("foo"); i++) []];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:172:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set70 = {for (int i = 0; oracle("foo"); i++) [], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:173:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map70 = {for (int i = 0; oracle("foo"); i++) "bar": [], "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:174:65: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:174:29: Error: Unexpected token 'for'.
+//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:175:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:175:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:176:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:176:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:177:53: Error: Unexpected token 'if'.
+//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:177:17: Error: Unexpected token 'for'.
+//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:178:52: Error: Unexpected token 'if'.
+//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:178:16: Error: Unexpected token 'for'.
+//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:179:52: Error: Unexpected token 'if'.
+//   var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:179:16: Error: Unexpected token 'for'.
+//   var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:180:67: Error: Unexpected token '...'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:180:83: Error: Unexpected token '...'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:180:53: Error: Unexpected token 'if'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:180:17: Error: Unexpected token 'for'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:181:66: Error: Unexpected token '...'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:181:82: Error: Unexpected token '...'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:181:52: Error: Unexpected token 'if'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:181:16: Error: Unexpected token 'for'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:182:66: Error: Unexpected token '...'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:182:87: Error: Unexpected token '...'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                                                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:182:52: Error: Unexpected token 'if'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:182:16: Error: Unexpected token 'for'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:183:67: Error: Unexpected token '...'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:183:83: Error: Unexpected token '...'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:183:53: Error: Unexpected token 'if'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:183:17: Error: Unexpected token 'for'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:184:66: Error: Unexpected token '...'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:184:82: Error: Unexpected token '...'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:184:52: Error: Unexpected token 'if'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:184:16: Error: Unexpected token 'for'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:185:66: Error: Unexpected token '...'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:185:87: Error: Unexpected token '...'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                                                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:185:52: Error: Unexpected token 'if'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:185:16: Error: Unexpected token 'for'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:186:75: Error: Unexpected token '...'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:186:53: Error: Unexpected token 'if'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:186:17: Error: Unexpected token 'for'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:187:66: Error: Unexpected token '...'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:187:52: Error: Unexpected token 'if'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:187:16: Error: Unexpected token 'for'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:188:66: Error: Unexpected token '...'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:188:52: Error: Unexpected token 'if'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:188:16: Error: Unexpected token 'for'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:189:23: Error: Unexpected token 'for'.
+//   List<int> list90 = [for (int i = 0; oracle("foo"); i++) dynVar];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:190:21: Error: Unexpected token 'for'.
+//   Set<int> set90 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:191:29: Error: Unexpected token 'for'.
+//   Map<String, int> map90 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:192:59: Error: Unexpected token '...'.
+//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:192:23: Error: Unexpected token 'for'.
+//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:193:57: Error: Unexpected token '...'.
+//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:193:21: Error: Unexpected token 'for'.
+//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:194:65: Error: Unexpected token '...'.
+//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:194:29: Error: Unexpected token 'for'.
+//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:195:29: Error: Unexpected token 'for'.
+//   List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
+//                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:196:27: Error: Unexpected token 'for'.
+//   Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:197:43: Error: Unexpected token 'for'.
+//   Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
+//                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:198:18: Error: Unexpected token 'for'.
+//   var list110 = [for (var i in [1, 2, 3]) i];
+//                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:199:17: Error: Unexpected token 'for'.
+//   var set110 = {for (var i in [1, 2, 3]) i, null};
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:200:17: Error: Unexpected token 'for'.
+//   var map110 = {for (var i in [1, 2, 3]) "bar": i, "baz": null};
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:201:24: Error: Unexpected token 'for'.
+//   List<int> list120 = [for (var i in dynVar) i];
+//                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:202:22: Error: Unexpected token 'for'.
+//   Set<int> set120 = {for (var i in dynVar) i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:203:30: Error: Unexpected token 'for'.
+//   Map<String, int> map120 = {for (var i in dynVar) "bar": i, "baz": null};
+//                              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:204:24: Error: Unexpected token 'for'.
+//   List<int> list130 = [for (var i = 1; i < 2; i++) i];
+//                        ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:205:22: Error: Unexpected token 'for'.
+//   Set<int> set130 = {for (var i = 1; i < 2; i++) i};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:206:27: Error: Unexpected token 'for'.
+//   Map<int, int> map130 = {for (var i = 1; i < 2; i++) i: i};
+//                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:210:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) "bar"];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:211:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:212:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:213:45: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+//                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:213:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:214:45: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+//                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:214:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:215:50: Error: Unexpected token '...'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:215:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:216:45: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
+//                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:216:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:217:45: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+//                                             ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:217:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:218:50: Error: Unexpected token '...'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+//                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:218:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+//              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:219:48: Error: Unexpected token 'if'.
+//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:219:12: Error: Unexpected token 'for'.
+//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:220:48: Error: Unexpected token 'if'.
+//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:220:12: Error: Unexpected token 'for'.
+//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//            ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:221:56: Error: Unexpected token 'if'.
+//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                                                        ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:221:20: Error: Unexpected token 'for'.
+//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                    ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:222:59: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:222:45: Error: Unexpected token 'if'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//                                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:222:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:223:59: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//                                                           ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:223:45: Error: Unexpected token 'if'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//                                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:223:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:224:67: Error: Unexpected token '...'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:224:53: Error: Unexpected token 'if'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:224:17: Error: Unexpected token 'for'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:225:67: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:225:45: Error: Unexpected token 'if'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//                                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:225:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:226:67: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:226:45: Error: Unexpected token 'if'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//                                             ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:226:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:227:82: Error: Unexpected token '...'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
+//                                                                                  ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:227:53: Error: Unexpected token 'if'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
+//                                                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:227:17: Error: Unexpected token 'for'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:230:9: Error: Unexpected token 'for'.
+//   <int>[for (i in <int>[1]) i];
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:231:9: Error: Unexpected token 'for'.
+//   <int>{for (i in <int>[1]) i, null};
+//         ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:232:16: Error: Unexpected token 'for'.
+// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
+// 	              ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:234:17: Error: Unexpected token 'for'.
+//   var list10 = [for (var i in "not iterable") i];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:235:16: Error: Unexpected token 'for'.
+//   var set10 = {for (var i in "not iterable") i, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:236:16: Error: Unexpected token 'for'.
+//   var map10 = {for (var i in "not iterable") "bar": i, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:237:17: Error: Unexpected token 'for'.
+//   var list20 = [for (int i in ["not", "int"]) i];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:238:16: Error: Unexpected token 'for'.
+//   var set20 = {for (int i in ["not", "int"]) i, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:239:16: Error: Unexpected token 'for'.
+//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:240:23: Error: Unexpected token 'for'.
+//   var list30 = [await for (var i in "not stream") i];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:241:22: Error: Unexpected token 'for'.
+//   var set30 = {await for (var i in "not stream") i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:242:22: Error: Unexpected token 'for'.
+//   var map30 = {await for (var i in "not stream") "bar": i, "baz": null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:243:23: Error: Unexpected token 'for'.
+//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:244:22: Error: Unexpected token 'for'.
+//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:245:22: Error: Unexpected token 'for'.
+//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:246:17: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var list50 = [await for (;;) 42];
+//                 ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:246:23: Error: Unexpected token 'for'.
+//   var list50 = [await for (;;) 42];
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:247:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var set50 = {await for (;;) 42, null};
+//                ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:247:22: Error: Unexpected token 'for'.
+//   var set50 = {await for (;;) 42, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:248:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var map50 = {await for (;;) "bar": 42, "baz": null};
+//                ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:248:22: Error: Unexpected token 'for'.
+//   var map50 = {await for (;;) "bar": 42, "baz": null};
+//                      ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:249:17: Error: Unexpected token 'for'.
+//   var list60 = [for (; "not bool";) 42];
+//                 ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:250:16: Error: Unexpected token 'for'.
+//   var set60 = {for (; "not bool";) 42, null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:251:16: Error: Unexpected token 'for'.
+//   var map60 = {for (; "not bool";) "bar": 42, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:255:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <int>[await for (int i in stream) i];
+//                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:255:15: Error: Unexpected token 'for'.
+//   <int>[await for (int i in stream) i];
+//               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:256:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <int>{await for (int i in stream) i};
+//                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:256:15: Error: Unexpected token 'for'.
+//   <int>{await for (int i in stream) i};
+//               ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:257:34: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <String, int>{await for (int i in stream) "bar": i};
+//                                  ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:257:23: Error: Unexpected token 'for'.
+//   <String, int>{await for (int i in stream) "bar": i};
+//                       ^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:267:23: Error: Unexpected token 'if'.
+//   List<int> list10 = [if (a is B) a.foo];
+//                       ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:268:21: Error: Unexpected token 'if'.
+//   Set<int> set10 = {if (a is B) a.foo};
+//                     ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:269:26: Error: Unexpected token 'if'.
+//   Map<int, int> map10 = {if (a is B) a.foo: a.foo};
+//                          ^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  get foo() → core::int
+    return 42;
+}
+static method oracle<T extends core::Object = dynamic>([self::oracle::T t = null]) → dynamic
+  return true;
+static method testIfElement(dynamic dynVar, core::List<core::int> listInt, core::List<core::double> listDouble, core::Map<core::String, core::int> mapToInt, core::Map<core::String, core::double> mapToDouble) → dynamic {
+  dynamic list10 = <dynamic>[];
+  dynamic set10 = <dynamic>{null};
+  dynamic map10 = <dynamic, dynamic>{"baz": null};
+  dynamic list11 = <dynamic>[];
+  dynamic set11 = <dynamic>{null};
+  dynamic map11 = <dynamic, dynamic>{"baz": null};
+  dynamic list12 = <dynamic>[];
+  dynamic set12 = <dynamic>{null};
+  dynamic map12 = <dynamic, dynamic>{"baz": null};
+  dynamic list20 = <dynamic>[];
+  dynamic set20 = <dynamic>{null};
+  dynamic map20 = <dynamic, dynamic>{"baz": null};
+  dynamic list21 = <dynamic>[];
+  dynamic set21 = <dynamic>{null};
+  dynamic map21 = <dynamic, dynamic>{"baz": null};
+  dynamic list22 = <dynamic>[];
+  dynamic set22 = <dynamic>{null};
+  dynamic map22 = <dynamic, dynamic>{"baz": null};
+  dynamic list30 = <dynamic>[];
+  dynamic set30 = <dynamic>{null};
+  dynamic map30 = <dynamic, dynamic>{"baz": null};
+  dynamic list31 = <dynamic>[];
+  dynamic set31 = <dynamic>{null};
+  dynamic map31 = <dynamic, dynamic>{"baz": null};
+  dynamic list33 = <dynamic>[];
+  dynamic set33 = <dynamic>{null};
+  dynamic map33 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list40 = <dynamic>[];
+  core::Set<core::List<core::int>> set40 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map40 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list41 = <dynamic>[];
+  core::Set<core::List<core::int>> set41 = <dynamic>{null};
+  core::List<core::List<core::int>> list42 = <dynamic>[];
+  core::Set<core::List<core::int>> set42 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map42 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list50 = <dynamic>[];
+  core::Set<core::int> set50 = <dynamic>{null};
+  core::Map<core::String, core::int> map50 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list51 = <dynamic>[];
+  core::Set<core::int> set51 = <dynamic>{null};
+  core::List<core::int> list52 = <dynamic>[];
+  core::Set<core::int> set52 = <dynamic>{null};
+  core::Map<core::String, core::int> map52 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list60 = <dynamic>[];
+  core::Set<core::List<core::int>> set60 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map60 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list61 = <dynamic>[];
+  core::Set<core::List<core::int>> set61 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map61 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list70 = <dynamic>[];
+  core::Set<core::List<core::int>> set70 = <dynamic>{null};
+  core::List<core::List<core::int>> list71 = <dynamic>[];
+  core::Set<core::List<core::int>> set71 = <dynamic>{null};
+  dynamic list80 = <dynamic>[];
+  dynamic set80 = <dynamic>{null};
+  dynamic map80 = <dynamic, dynamic>{"baz": null};
+  dynamic list81 = <dynamic>[];
+  dynamic set81 = <dynamic>{null};
+  dynamic map81 = <dynamic, dynamic>{"baz": null};
+  dynamic list82 = <dynamic>[];
+  dynamic set82 = <dynamic>{null};
+  dynamic map82 = <dynamic>{null};
+  dynamic list83 = <dynamic>[];
+  dynamic set83 = <dynamic>{null};
+  dynamic map83 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list90 = <dynamic>[];
+  core::Set<core::int> set90 = <dynamic>{null};
+  core::Map<core::String, core::int> map90 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list91 = <dynamic>[];
+  core::Set<core::int> set91 = <dynamic>{null};
+  core::Map<core::String, core::int> map91 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list100 = <dynamic>[];
+  core::Set<core::int> set100 = <dynamic, dynamic>{};
+  core::Map<core::int, core::int> map100 = <dynamic, dynamic>{};
+}
+static method testIfElementErrors(core::Map<core::int, core::int> map) → dynamic {
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  <core::String>[];
+  <core::String>{null};
+  <core::String, core::String>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  <core::int>[];
+  <core::int>{null};
+  <core::String, core::int>{"baz": null};
+  core::Set<dynamic> set10 = <dynamic, dynamic>{};
+  core::Map<dynamic, dynamic> map10 = <dynamic, dynamic>{};
+  core::Set<dynamic> set11 = <dynamic, dynamic>{};
+  core::Map<dynamic, dynamic> map11 = <dynamic, dynamic>{};
+  dynamic map12 = <dynamic, dynamic>{};
+  dynamic map13 = <dynamic, dynamic>{};
+  core::List<core::int> list20 = <dynamic>[];
+  core::Set<core::int> set20 = <dynamic, dynamic>{};
+  core::Map<core::int, core::int> map30 = <dynamic, dynamic>{};
+  core::List<core::String> list40 = <core::String>[];
+  core::Set<core::String> set40 = <core::String>{};
+  core::Map<core::String, core::int> map40 = <core::String, core::int>{};
+  core::Map<core::int, core::String> map41 = <core::int, core::String>{};
+}
+static method testForElement(dynamic dynVar, core::List<core::int> listInt, core::List<core::double> listDouble, core::int index, core::Map<core::String, core::int> mapStringInt, core::Map<core::String, core::double> mapStringDouble) → dynamic {
+  dynamic list10 = <dynamic>[];
+  dynamic set10 = <dynamic>{null};
+  dynamic map10 = <dynamic, dynamic>{"baz": null};
+  dynamic list11 = <dynamic>[];
+  dynamic set11 = <dynamic>{null};
+  dynamic map11 = <dynamic, dynamic>{"baz": null};
+  dynamic list12 = <dynamic>[];
+  dynamic set12 = <dynamic>{null};
+  dynamic map12 = <dynamic, dynamic>{"baz": null};
+  dynamic list20 = <dynamic>[];
+  dynamic set20 = <dynamic>{null};
+  dynamic map20 = <dynamic, dynamic>{"baz": null};
+  dynamic list21 = <dynamic>[];
+  dynamic set21 = <dynamic>{null};
+  dynamic map21 = <dynamic, dynamic>{"baz": null};
+  dynamic list22 = <dynamic>[];
+  dynamic set22 = <dynamic>{null};
+  dynamic map22 = <dynamic, dynamic>{"baz": null};
+  dynamic list30 = <dynamic>[];
+  dynamic set30 = <dynamic>{null};
+  dynamic map30 = <dynamic, dynamic>{"baz": null};
+  dynamic list31 = <dynamic>[];
+  dynamic set31 = <dynamic>{null};
+  dynamic map31 = <dynamic, dynamic>{"baz": null};
+  dynamic list33 = <dynamic>[];
+  dynamic set33 = <dynamic>{null};
+  dynamic map33 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list40 = <dynamic>[];
+  core::Set<core::List<core::int>> set40 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map40 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list41 = <dynamic>[];
+  core::Set<core::List<core::int>> set41 = <dynamic>{null};
+  core::List<core::List<core::int>> list42 = <dynamic>[];
+  core::Set<core::List<core::int>> set42 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map42 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list50 = <dynamic>[];
+  core::Set<core::int> set50 = <dynamic>{null};
+  core::Map<core::String, core::int> map50 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list51 = <dynamic>[];
+  core::Set<core::int> set51 = <dynamic>{null};
+  core::List<core::int> list52 = <dynamic>[];
+  core::Set<core::int> set52 = <dynamic>{null};
+  core::List<core::List<core::int>> list60 = <dynamic>[];
+  core::Set<core::List<core::int>> set60 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map60 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list61 = <dynamic>[];
+  core::Set<core::List<core::int>> set61 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map61 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list70 = <dynamic>[];
+  core::Set<core::List<core::int>> set70 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map70 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int>> list71 = <dynamic>[];
+  core::Set<core::List<core::int>> set71 = <dynamic>{null};
+  core::Map<core::String, core::List<core::int>> map71 = <dynamic, dynamic>{"baz": null};
+  dynamic list80 = <dynamic>[];
+  dynamic set80 = <dynamic>{null};
+  dynamic map80 = <dynamic, dynamic>{"baz": null};
+  dynamic list81 = <dynamic>[];
+  dynamic set81 = <dynamic>{null};
+  dynamic map81 = <dynamic, dynamic>{"baz": null};
+  dynamic list82 = <dynamic>[];
+  dynamic set82 = <dynamic>{null};
+  dynamic map82 = <dynamic, dynamic>{"baz": null};
+  dynamic list83 = <dynamic>[];
+  dynamic set83 = <dynamic>{null};
+  dynamic map83 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list90 = <dynamic>[];
+  core::Set<core::int> set90 = <dynamic>{null};
+  core::Map<core::String, core::int> map90 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list91 = <dynamic>[];
+  core::Set<core::int> set91 = <dynamic>{null};
+  core::Map<core::String, core::int> map91 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list100 = <core::int>[];
+  core::Set<core::int> set100 = <core::int>{};
+  core::Map<core::String, core::int> map100 = <core::String, core::int>{};
+  dynamic list110 = <dynamic>[];
+  dynamic set110 = <dynamic>{null};
+  dynamic map110 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list120 = <dynamic>[];
+  core::Set<core::int> set120 = <dynamic>{null};
+  core::Map<core::String, core::int> map120 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int> list130 = <dynamic>[];
+  core::Set<core::int> set130 = <dynamic, dynamic>{};
+  core::Map<core::int, core::int> map130 = <dynamic, dynamic>{};
+}
+static method testForElementErrors(core::Map<core::int, core::int> map, core::List<core::int> list) → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        <core::int>[];
+        <core::int>{null};
+        <core::int, core::int>{"baz": null};
+        <core::int>[];
+        <core::int>{null};
+        <core::int, core::int>{"baz": null};
+        <core::int>[];
+        <core::int>{null};
+        <core::int, core::int>{42: null};
+        <core::String>[];
+        <core::String>{null};
+        <core::String, core::String>{"baz": null};
+        <core::int>[];
+        <core::int>{null};
+        <core::String, core::int>{"baz": null};
+        <core::int>[];
+        <core::int>{null};
+        <core::String, core::int>{"baz": null};
+        final dynamic i = 0;
+        <core::int>[];
+        <core::int>{null};
+        <core::String, core::int>{"baz": null};
+        dynamic list10 = <dynamic>[];
+        dynamic set10 = <dynamic>{null};
+        dynamic map10 = <dynamic, dynamic>{"baz": null};
+        dynamic list20 = <dynamic>[];
+        dynamic set20 = <dynamic>{null};
+        dynamic map20 = <dynamic, dynamic>{"baz": null};
+        dynamic list30 = <dynamic>[];
+        dynamic set30 = <dynamic>{null};
+        dynamic map30 = <dynamic, dynamic>{"baz": null};
+        dynamic list40 = <dynamic>[];
+        dynamic set40 = <dynamic>{null};
+        dynamic map40 = <dynamic, dynamic>{"baz": null};
+        dynamic list50 = <dynamic>[];
+        dynamic set50 = <dynamic>{null};
+        dynamic map50 = <dynamic, dynamic>{"baz": null};
+        dynamic list60 = <dynamic>[];
+        dynamic set60 = <dynamic>{null};
+        dynamic map60 = <dynamic, dynamic>{"baz": null};
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method testForElementErrorsNotAsync(asy::Stream<core::int> stream) → dynamic {
+  <core::int>[];
+  <core::int>{};
+  <core::String, core::int>{};
+}
+static method testPromotion(self::A a) → dynamic {
+  core::List<core::int> list10 = <dynamic>[];
+  core::Set<core::int> set10 = <dynamic, dynamic>{};
+  core::Map<core::int, core::int> map10 = <dynamic, dynamic>{};
+}
+static method main() → dynamic {}
diff --git a/front_end/testcases/control_flow_collection_inference.dart.outline.expect b/front_end/testcases/control_flow_collection_inference.dart.outline.expect
new file mode 100644
index 0000000..c40231f
--- /dev/null
+++ b/front_end/testcases/control_flow_collection_inference.dart.outline.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    ;
+  get foo() → core::int
+    ;
+}
+static method oracle<T extends core::Object = dynamic>([self::oracle::T t]) → dynamic
+  ;
+static method testIfElement(dynamic dynVar, core::List<core::int> listInt, core::List<core::double> listDouble, core::Map<core::String, core::int> mapToInt, core::Map<core::String, core::double> mapToDouble) → dynamic
+  ;
+static method testIfElementErrors(core::Map<core::int, core::int> map) → dynamic
+  ;
+static method testForElement(dynamic dynVar, core::List<core::int> listInt, core::List<core::double> listDouble, core::int index, core::Map<core::String, core::int> mapStringInt, core::Map<core::String, core::double> mapStringDouble) → dynamic
+  ;
+static method testForElementErrors(core::Map<core::int, core::int> map, core::List<core::int> list) → dynamic
+  ;
+static method testForElementErrorsNotAsync(asy::Stream<core::int> stream) → dynamic
+  ;
+static method testPromotion(self::A a) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/front_end/testcases/control_flow_collection_inference.dart.strong.expect b/front_end/testcases/control_flow_collection_inference.dart.strong.expect
new file mode 100644
index 0000000..c3b0f74
--- /dev/null
+++ b/front_end/testcases/control_flow_collection_inference.dart.strong.expect
@@ -0,0 +1,2313 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+//                                  ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:106:44: Error: Expected ':' after this.
+//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                            ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:107:53: Error: Expected ':' after this.
+//   Map<dynamic, dynamic> map10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:108:61: Error: Expected ':' after this.
+//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
+//   Map<dynamic, dynamic> map11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
+//   var map12 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                   ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
+//   var map13 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                                    ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>[if (oracle("foo")) "bar"];
+//                            ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>{if (oracle("foo")) "bar", null};
+//                            ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
+//                                           ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>[if (oracle("foo")) ...["bar"]];
+//                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>{if (oracle("foo")) ...["bar"], null};
+//                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+//                                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[if (oracle("foo")) ...map];
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{if (oracle("foo")) ...map, null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>[if (oracle("foo")) 42 else 3.14];
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>[if (oracle("foo")) 42 else 3.14];
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>{if (oracle("foo")) 42 else 3.14, null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>{if (oracle("foo")) 42 else 3.14, null};
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
+//                                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
+//                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[if (oracle("foo")) ...map else 42];
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[if (oracle("foo")) 42 else ...map];
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+//                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:106:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                        ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:108:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                        ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   List<int> list20 = [if (42) 42];
+//                           ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   Set<int> set20 = {if (42) 42};
+//                         ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   Map<int, int> map30 = {if (42) 42: 42};
+//                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
+//                                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
+//                                                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
+//                                                   ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
+//                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
+//                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
+//                                                                           ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
+//                                                                 ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
+//                                                                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
+//   <int>[for (i in <int>[1]) i];
+//              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
+//   <int>{for (i in <int>[1]) i, null};
+//              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
+// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
+// 	                   ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:246:17: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var list50 = [await for (;;) 42];
+//                 ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:247:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var set50 = {await for (;;) 42, null};
+//                ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:248:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var map50 = {await for (;;) "bar": 42, "baz": null};
+//                ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>[for (int i = 0; oracle("foo"); i++) "bar"];
+//                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
+//                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//                                                  ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//                                                         ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//                                                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+//                                                 ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+//                                                 ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
+//                                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+//                                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+//                                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                                                                                            ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//                                                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//                                                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
+//                                                                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   var list10 = [for (var i in "not iterable") i];
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   var set10 = {for (var i in "not iterable") i, null};
+//                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   var map10 = {for (var i in "not iterable") "bar": i, "baz": null};
+//                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var list20 = [for (int i in ["not", "int"]) i];
+//                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var list20 = [for (int i in ["not", "int"]) i];
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var set20 = {for (int i in ["not", "int"]) i, null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var set20 = {for (int i in ["not", "int"]) i, null};
+//                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
+//                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
+//   var list30 = [await for (var i in "not stream") i];
+//                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
+//   var set30 = {await for (var i in "not stream") i, null};
+//                                    ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
+//   var map30 = {await for (var i in "not stream") "bar": i, "baz": null};
+//                                    ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
+//                                                          ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
+//                                                                 ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
+//                                                         ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
+//                                                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
+//                                                         ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
+//                                                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   var list60 = [for (; "not bool";) 42];
+//                        ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   var set60 = {for (; "not bool";) 42, null};
+//                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   var map60 = {for (; "not bool";) "bar": 42, "baz": null};
+//                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:255:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <int>[await for (int i in stream) i];
+//                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:256:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <int>{await for (int i in stream) i};
+//                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:257:34: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <String, int>{await for (int i in stream) "bar": i};
+//                                  ^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  get foo() → core::int
+    return 42;
+}
+static method oracle<T extends core::Object = dynamic>([self::oracle::T t = null]) → dynamic
+  return true;
+static method testIfElement(dynamic dynVar, core::List<core::int> listInt, core::List<core::double> listDouble, core::Map<core::String, core::int> mapToInt, core::Map<core::String, core::double> mapToDouble) → dynamic {
+  core::List<core::int> list10 = block {
+    final core::List<core::int> #t1 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t1.{core::List::add}(42);
+  } =>#t1;
+  core::Set<core::int> set10 = block {
+    final core::Set<core::int> #t2 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t2.{core::Set::add}(42);
+    #t2.{core::Set::add}(null);
+  } =>#t2;
+  core::Map<core::String, core::int> map10 = block {
+    final core::Map<core::String, core::int> #t3 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t3.{core::Map::[]=}("bar", 42);
+    #t3.{core::Map::[]=}("baz", null);
+  } =>#t3;
+  core::List<dynamic> list11 = block {
+    final core::List<dynamic> #t4 = <dynamic>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t4.{core::List::add}(dynVar);
+  } =>#t4;
+  core::Set<dynamic> set11 = block {
+    final core::Set<dynamic> #t5 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t5.{core::Set::add}(dynVar);
+    #t5.{core::Set::add}(null);
+  } =>#t5;
+  core::Map<core::String, dynamic> map11 = block {
+    final core::Map<core::String, dynamic> #t6 = <core::String, dynamic>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t6.{core::Map::[]=}("bar", dynVar);
+    #t6.{core::Map::[]=}("baz", null);
+  } =>#t6;
+  core::List<core::List<core::int>> list12 = block {
+    final core::List<core::List<core::int>> #t7 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t7.{core::List::add}(<core::int>[42]);
+  } =>#t7;
+  core::Set<core::List<core::int>> set12 = block {
+    final core::Set<core::List<core::int>> #t8 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t8.{core::Set::add}(<core::int>[42]);
+    #t8.{core::Set::add}(null);
+  } =>#t8;
+  core::Map<core::String, core::List<core::int>> map12 = block {
+    final core::Map<core::String, core::List<core::int>> #t9 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t9.{core::Map::[]=}("bar", <core::int>[42]);
+    #t9.{core::Map::[]=}("baz", null);
+  } =>#t9;
+  core::List<core::int> list20 = block {
+    final core::List<core::int> #t10 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t11 in <core::int>[42])
+        #t10.{core::List::add}(#t11);
+  } =>#t10;
+  core::Set<core::int> set20 = block {
+    final core::Set<core::int> #t12 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t13 in <core::int>[42])
+        #t12.{core::Set::add}(#t13);
+    #t12.{core::Set::add}(null);
+  } =>#t12;
+  core::Map<core::String, core::int> map20 = block {
+    final core::Map<core::String, core::int> #t14 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::int> #t15 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
+        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
+    #t14.{core::Map::[]=}("baz", null);
+  } =>#t14;
+  core::List<dynamic> list21 = block {
+    final core::List<dynamic> #t16 = <dynamic>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t17 in <dynamic>[dynVar])
+        #t16.{core::List::add}(#t17);
+  } =>#t16;
+  core::Set<dynamic> set21 = block {
+    final core::Set<dynamic> #t18 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t19 in <dynamic>[dynVar])
+        #t18.{core::Set::add}(#t19);
+    #t18.{core::Set::add}(null);
+  } =>#t18;
+  core::Map<core::String, dynamic> map21 = block {
+    final core::Map<core::String, dynamic> #t20 = <core::String, dynamic>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, dynamic> #t21 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
+        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+    #t20.{core::Map::[]=}("baz", null);
+  } =>#t20;
+  core::List<core::List<core::int>> list22 = block {
+    final core::List<core::List<core::int>> #t22 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t23 in <core::List<core::int>>[<core::int>[42]])
+        #t22.{core::List::add}(#t23);
+  } =>#t22;
+  core::Set<core::List<core::int>> set22 = block {
+    final core::Set<core::List<core::int>> #t24 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t25 in <core::List<core::int>>[<core::int>[42]])
+        #t24.{core::Set::add}(#t25);
+    #t24.{core::Set::add}(null);
+  } =>#t24;
+  core::Map<core::String, core::List<core::int>> map22 = block {
+    final core::Map<core::String, core::List<core::int>> #t26 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::List<core::int>> #t27 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
+        #t26.{core::Map::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
+    #t26.{core::Map::[]=}("baz", null);
+  } =>#t26;
+  core::List<core::int> list30 = block {
+    final core::List<core::int> #t28 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t29 in <core::int>[42])
+          #t28.{core::List::add}(#t29);
+  } =>#t28;
+  core::Set<core::int> set30 = block {
+    final core::Set<core::int> #t30 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t31 in <core::int>[42])
+          #t30.{core::Set::add}(#t31);
+    #t30.{core::Set::add}(null);
+  } =>#t30;
+  core::Map<core::String, core::int> map30 = block {
+    final core::Map<core::String, core::int> #t32 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::int> #t33 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
+          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+    #t32.{core::Map::[]=}("baz", null);
+  } =>#t32;
+  core::List<dynamic> list31 = block {
+    final core::List<dynamic> #t34 = <dynamic>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t35 in <dynamic>[dynVar])
+          #t34.{core::List::add}(#t35);
+  } =>#t34;
+  core::Set<dynamic> set31 = block {
+    final core::Set<dynamic> #t36 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t37 in <dynamic>[dynVar])
+          #t36.{core::Set::add}(#t37);
+    #t36.{core::Set::add}(null);
+  } =>#t36;
+  core::Map<core::String, dynamic> map31 = block {
+    final core::Map<core::String, dynamic> #t38 = <core::String, dynamic>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, dynamic> #t39 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
+          #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+    #t38.{core::Map::[]=}("baz", null);
+  } =>#t38;
+  core::List<core::List<core::int>> list33 = block {
+    final core::List<core::List<core::int>> #t40 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t41 in <core::List<core::int>>[<core::int>[42]])
+          #t40.{core::List::add}(#t41);
+  } =>#t40;
+  core::Set<core::List<core::int>> set33 = block {
+    final core::Set<core::List<core::int>> #t42 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t43 in <core::List<core::int>>[<core::int>[42]])
+          #t42.{core::Set::add}(#t43);
+    #t42.{core::Set::add}(null);
+  } =>#t42;
+  core::Map<core::String, core::List<core::int>> map33 = block {
+    final core::Map<core::String, core::List<core::int>> #t44 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t45 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
+          #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
+    #t44.{core::Map::[]=}("baz", null);
+  } =>#t44;
+  core::List<core::List<core::int>> list40 = block {
+    final core::List<core::List<core::int>> #t46 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t47 in <core::List<core::int>>[<core::int>[]])
+        #t46.{core::List::add}(#t47);
+  } =>#t46;
+  core::Set<core::List<core::int>> set40 = block {
+    final core::Set<core::List<core::int>> #t48 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t49 in <core::List<core::int>>[<core::int>[]])
+        #t48.{core::Set::add}(#t49);
+    #t48.{core::Set::add}(null);
+  } =>#t48;
+  core::Map<core::String, core::List<core::int>> map40 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  Map<String, List<int>> map40 = {if (oracle(\"foo\")) ...{\"bar\", []}, \"baz\": null};
+                                 ^";
+  core::List<core::List<core::int>> list41 = block {
+    final core::List<core::List<core::int>> #t50 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t51 in let final core::Set<core::List<core::int>> #t52 = col::LinkedHashSet::•<core::List<core::int>>() in let final dynamic #t53 = #t52.{core::Set::add}(<core::int>[]) in #t52)
+        #t50.{core::List::add}(#t51);
+  } =>#t50;
+  core::Set<core::List<core::int>> set41 = block {
+    final core::Set<core::List<core::int>> #t54 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t55 in let final core::Set<core::List<core::int>> #t56 = col::LinkedHashSet::•<core::List<core::int>>() in let final dynamic #t57 = #t56.{core::Set::add}(<core::int>[]) in #t56)
+        #t54.{core::Set::add}(#t55);
+    #t54.{core::Set::add}(null);
+  } =>#t54;
+  core::List<core::List<core::int>> list42 = block {
+    final core::List<core::List<core::int>> #t58 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t59 in <core::List<core::int>>[<core::int>[]])
+          #t58.{core::List::add}(#t59);
+  } =>#t58;
+  core::Set<core::List<core::int>> set42 = block {
+    final core::Set<core::List<core::int>> #t60 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t61 in <core::List<core::int>>[<core::int>[]])
+          #t60.{core::Set::add}(#t61);
+    #t60.{core::Set::add}(null);
+  } =>#t60;
+  core::Map<core::String, core::List<core::int>> map42 = block {
+    final core::Map<core::String, core::List<core::int>> #t62 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t63 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
+    #t62.{core::Map::[]=}("baz", null);
+  } =>#t62;
+  core::List<core::int> list50 = block {
+    final core::List<core::int> #t64 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t65 in <core::int>[])
+        #t64.{core::List::add}(#t65);
+  } =>#t64;
+  core::Set<core::int> set50 = block {
+    final core::Set<core::int> #t66 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t67 in <core::int>[])
+        #t66.{core::Set::add}(#t67);
+    #t66.{core::Set::add}(null);
+  } =>#t66;
+  core::Map<core::String, core::int> map50 = block {
+    final core::Map<core::String, core::int> #t68 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::int> #t69 in <core::String, core::int>{}.{core::Map::entries})
+        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+    #t68.{core::Map::[]=}("baz", null);
+  } =>#t68;
+  core::List<core::int> list51 = block {
+    final core::List<core::int> #t70 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t71 in let final core::Set<core::int> #t72 = col::LinkedHashSet::•<core::int>() in #t72)
+        #t70.{core::List::add}(#t71);
+  } =>#t70;
+  core::Set<core::int> set51 = block {
+    final core::Set<core::int> #t73 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t74 in let final core::Set<core::int> #t75 = col::LinkedHashSet::•<core::int>() in #t75)
+        #t73.{core::Set::add}(#t74);
+    #t73.{core::Set::add}(null);
+  } =>#t73;
+  core::List<core::int> list52 = block {
+    final core::List<core::int> #t76 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t77 in <core::int>[])
+          #t76.{core::List::add}(#t77);
+  } =>#t76;
+  core::Set<core::int> set52 = block {
+    final core::Set<core::int> #t78 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t79 in <core::int>[])
+          #t78.{core::Set::add}(#t79);
+    #t78.{core::Set::add}(null);
+  } =>#t78;
+  core::Map<core::String, core::int> map52 = block {
+    final core::Map<core::String, core::int> #t80 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::int> #t81 in <core::String, core::int>{}.{core::Map::entries})
+          #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
+    #t80.{core::Map::[]=}("baz", null);
+  } =>#t80;
+  core::List<core::List<core::int>> list60 = block {
+    final core::List<core::List<core::int>> #t82 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t83 in <core::List<core::int>>[<core::int>[]])
+        #t82.{core::List::add}(#t83);
+  } =>#t82;
+  core::Set<core::List<core::int>> set60 = block {
+    final core::Set<core::List<core::int>> #t84 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t85 in <core::List<core::int>>[<core::int>[]])
+        #t84.{core::Set::add}(#t85);
+    #t84.{core::Set::add}(null);
+  } =>#t84;
+  core::Map<core::String, core::List<core::int>> map60 = block {
+    final core::Map<core::String, core::List<core::int>> #t86 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::List<core::int>> #t87 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+    #t86.{core::Map::[]=}("baz", null);
+  } =>#t86;
+  core::List<core::List<core::int>> list61 = block {
+    final core::List<core::List<core::int>> #t88 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t89 in <core::List<core::int>>[<core::int>[]])
+          #t88.{core::List::add}(#t89);
+  } =>#t88;
+  core::Set<core::List<core::int>> set61 = block {
+    final core::Set<core::List<core::int>> #t90 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t91 in <core::List<core::int>>[<core::int>[]])
+          #t90.{core::Set::add}(#t91);
+    #t90.{core::Set::add}(null);
+  } =>#t90;
+  core::Map<core::String, core::List<core::int>> map61 = block {
+    final core::Map<core::String, core::List<core::int>> #t92 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t93 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+          #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
+    #t92.{core::Map::[]=}("baz", null);
+  } =>#t92;
+  core::List<core::List<core::int>> list70 = block {
+    final core::List<core::List<core::int>> #t94 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t94.{core::List::add}(<core::int>[]);
+  } =>#t94;
+  core::Set<core::List<core::int>> set70 = block {
+    final core::Set<core::List<core::int>> #t95 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t95.{core::Set::add}(<core::int>[]);
+    #t95.{core::Set::add}(null);
+  } =>#t95;
+  core::List<core::List<core::int>> list71 = block {
+    final core::List<core::List<core::int>> #t96 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t96.{core::List::add}(<core::int>[]);
+  } =>#t96;
+  core::Set<core::List<core::int>> set71 = block {
+    final core::Set<core::List<core::int>> #t97 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t97.{core::Set::add}(<core::int>[]);
+    #t97.{core::Set::add}(null);
+  } =>#t97;
+  core::List<core::num> list80 = block {
+    final core::List<core::num> #t98 = <core::num>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t98.{core::List::add}(42);
+    else
+      #t98.{core::List::add}(3.14);
+  } =>#t98;
+  core::Set<core::num> set80 = block {
+    final core::Set<core::num> #t99 = col::LinkedHashSet::•<core::num>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t99.{core::Set::add}(42);
+    else
+      #t99.{core::Set::add}(3.14);
+    #t99.{core::Set::add}(null);
+  } =>#t99;
+  core::Map<core::String, core::num> map80 = block {
+    final core::Map<core::String, core::num> #t100 = <core::String, core::num>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t100.{core::Map::[]=}("bar", 42);
+    else
+      #t100.{core::Map::[]=}("bar", 3.14);
+    #t100.{core::Map::[]=}("baz", null);
+  } =>#t100;
+  core::List<core::num> list81 = block {
+    final core::List<core::num> #t101 = <core::num>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::num #t102 in listInt)
+        #t101.{core::List::add}(#t102);
+    else
+      for (final core::num #t103 in listDouble)
+        #t101.{core::List::add}(#t103);
+  } =>#t101;
+  core::Set<core::num> set81 = block {
+    final core::Set<core::num> #t104 = col::LinkedHashSet::•<core::num>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::num #t105 in listInt)
+        #t104.{core::Set::add}(#t105);
+    else
+      for (final core::num #t106 in listDouble)
+        #t104.{core::Set::add}(#t106);
+    #t104.{core::Set::add}(null);
+  } =>#t104;
+  core::Map<core::String, core::num> map81 = block {
+    final core::Map<core::String, core::num> #t107 = <core::String, core::num>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::num> #t108 in mapToInt.{core::Map::entries})
+        #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{core::MapEntry::value});
+    else
+      for (final core::MapEntry<core::String, core::num> #t109 in mapToDouble.{core::Map::entries})
+        #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
+    #t107.{core::Map::[]=}("baz", null);
+  } =>#t107;
+  core::List<dynamic> list82 = block {
+    final core::List<dynamic> #t110 = <dynamic>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t111 in listInt)
+        #t110.{core::List::add}(#t111);
+    else
+      for (final dynamic #t112 in dynVar as{TypeError} core::Iterable<dynamic>)
+        #t110.{core::List::add}(#t112);
+  } =>#t110;
+  core::Set<dynamic> set82 = block {
+    final core::Set<dynamic> #t113 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t114 in listInt)
+        #t113.{core::Set::add}(#t114);
+    else
+      for (final dynamic #t115 in dynVar as{TypeError} core::Iterable<dynamic>)
+        #t113.{core::Set::add}(#t115);
+    #t113.{core::Set::add}(null);
+  } =>#t113;
+  core::Set<dynamic> map82 = block {
+    final core::Set<dynamic> #t116 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  var map82 = {if (oracle(\"foo\")) ...mapToInt else ...dynVar, null};
+                                     ^");
+    else
+      for (final dynamic #t117 in dynVar as{TypeError} core::Iterable<dynamic>)
+        #t116.{core::Set::add}(#t117);
+    #t116.{core::Set::add}(null);
+  } =>#t116;
+  core::List<core::num> list83 = block {
+    final core::List<core::num> #t118 = <core::num>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t118.{core::List::add}(42);
+    else
+      for (final core::num #t119 in listDouble)
+        #t118.{core::List::add}(#t119);
+  } =>#t118;
+  core::Set<core::num> set83 = block {
+    final core::Set<core::num> #t120 = col::LinkedHashSet::•<core::num>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::num #t121 in listInt)
+        #t120.{core::Set::add}(#t121);
+    else
+      #t120.{core::Set::add}(3.14);
+    #t120.{core::Set::add}(null);
+  } =>#t120;
+  core::Map<core::String, core::num> map83 = block {
+    final core::Map<core::String, core::num> #t122 = <core::String, core::num>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::num> #t123 in mapToInt.{core::Map::entries})
+        #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
+    else
+      #t122.{core::Map::[]=}("bar", 3.14);
+    #t122.{core::Map::[]=}("baz", null);
+  } =>#t122;
+  core::List<core::int> list90 = block {
+    final core::List<core::int> #t124 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t124.{core::List::add}(dynVar as{TypeError} core::int);
+  } =>#t124;
+  core::Set<core::int> set90 = block {
+    final core::Set<core::int> #t125 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t125.{core::Set::add}(dynVar as{TypeError} core::int);
+    #t125.{core::Set::add}(null);
+  } =>#t125;
+  core::Map<core::String, core::int> map90 = block {
+    final core::Map<core::String, core::int> #t126 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t126.{core::Map::[]=}("bar", dynVar as{TypeError} core::int);
+    #t126.{core::Map::[]=}("baz", null);
+  } =>#t126;
+  core::List<core::int> list91 = block {
+    final core::List<core::int> #t127 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t128 in dynVar as{TypeError} core::Iterable<dynamic>) {
+        final core::int #t129 = #t128 as{TypeError} core::int;
+        #t127.{core::List::add}(#t129);
+      }
+  } =>#t127;
+  core::Set<core::int> set91 = block {
+    final core::Set<core::int> #t130 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t131 in dynVar as{TypeError} core::Iterable<dynamic>) {
+        final core::int #t132 = #t131 as{TypeError} core::int;
+        #t130.{core::Set::add}(#t132);
+      }
+    #t130.{core::Set::add}(null);
+  } =>#t130;
+  core::Map<core::String, core::int> map91 = block {
+    final core::Map<core::String, core::int> #t133 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<dynamic, dynamic> #t134 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
+        final core::String #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String;
+        final core::int #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int;
+        #t133.{core::Map::[]=}(#t135, #t136);
+      }
+    #t133.{core::Map::[]=}("baz", null);
+  } =>#t133;
+  core::List<core::int> list100 = block {
+    final core::List<core::int> #t137 = <core::int>[];
+    if(dynVar as{TypeError} core::bool)
+      #t137.{core::List::add}(42);
+  } =>#t137;
+  core::Set<core::int> set100 = block {
+    final core::Set<core::int> #t138 = col::LinkedHashSet::•<core::int>();
+    if(dynVar as{TypeError} core::bool)
+      #t138.{core::Set::add}(42);
+  } =>#t138;
+  core::Map<core::int, core::int> map100 = block {
+    final core::Map<core::int, core::int> #t139 = <core::int, core::int>{};
+    if(dynVar as{TypeError} core::bool)
+      #t139.{core::Map::[]=}(42, 42);
+  } =>#t139;
+}
+static method testIfElementErrors(core::Map<core::int, core::int> map) → dynamic {
+  block {
+    final core::List<core::int> #t140 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t140.{core::List::add}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[if (oracle(\"foo\")) \"bar\"];
+                           ^" in "bar" as{TypeError} core::int);
+  } =>#t140;
+  block {
+    final core::Set<core::int> #t142 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{if (oracle(\"foo\")) \"bar\", null};
+                           ^" in "bar" as{TypeError} core::int);
+    #t142.{core::Set::add}(null);
+  } =>#t142;
+  block {
+    final core::Map<core::String, core::int> #t144 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
+                                          ^" in "bar" as{TypeError} core::int);
+    #t144.{core::Map::[]=}("baz", null);
+  } =>#t144;
+  block {
+    final core::List<core::int> #t146 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t147 in <core::int>[let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[if (oracle(\"foo\")) ...[\"bar\"]];
+                               ^" in "bar" as{TypeError} core::int])
+        #t146.{core::List::add}(#t147);
+  } =>#t146;
+  block {
+    final core::Set<core::int> #t149 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t150 in <core::int>[let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
+                               ^" in "bar" as{TypeError} core::int])
+        #t149.{core::Set::add}(#t150);
+    #t149.{core::Set::add}(null);
+  } =>#t149;
+  block {
+    final core::Map<core::String, core::int> #t152 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::int> #t153 in <core::String, core::int>{"bar": let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                              ^" in "bar" as{TypeError} core::int}.{core::Map::entries})
+        #t152.{core::Map::[]=}(#t153.{core::MapEntry::key}, #t153.{core::MapEntry::value});
+    #t152.{core::Map::[]=}("baz", null);
+  } =>#t152;
+  block {
+    final core::List<core::int> #t155 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t155.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[if (oracle(\"foo\")) ...map];
+                              ^");
+  } =>#t155;
+  block {
+    final core::Set<core::int> #t156 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{if (oracle(\"foo\")) ...map, null};
+                              ^");
+    #t156.{core::Set::add}(null);
+  } =>#t156;
+  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
+                                      ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
+                                      ^": null};
+  block {
+    final core::List<core::String> #t157 = <core::String>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t157.{core::List::add}(let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[if (oracle(\"foo\")) 42 else 3.14];
+                              ^" in 42 as{TypeError} core::String);
+    else
+      #t157.{core::List::add}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[if (oracle(\"foo\")) 42 else 3.14];
+                                      ^" in 3.14 as{TypeError} core::String);
+  } =>#t157;
+  block {
+    final core::Set<core::String> #t160 = col::LinkedHashSet::•<core::String>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
+                              ^" in 42 as{TypeError} core::String);
+    else
+      #t160.{core::Set::add}(let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
+                                      ^" in 3.14 as{TypeError} core::String);
+    #t160.{core::Set::add}(null);
+  } =>#t160;
+  block {
+    final core::Map<core::String, core::String> #t163 = <core::String, core::String>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
+                                             ^" in 42 as{TypeError} core::String);
+    else
+      #t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
+                                                            ^" in 3.14 as{TypeError} core::String);
+    #t163.{core::Map::[]=}("baz", null);
+  } =>#t163;
+  block {
+    final core::List<core::int> #t166 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t166.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[if (oracle(\"foo\")) ...map else 42];
+                              ^");
+    else
+      #t166.{core::List::add}(42);
+  } =>#t166;
+  block {
+    final core::Set<core::int> #t167 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{if (oracle(\"foo\")) ...map else 42, null};
+                              ^");
+    else
+      #t167.{core::Set::add}(42);
+    #t167.{core::Set::add}(null);
+  } =>#t167;
+  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
+                                      ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
+                                      ^": null};
+  block {
+    final core::List<core::int> #t168 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t168.{core::List::add}(42);
+    else
+      #t168.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[if (oracle(\"foo\")) 42 else ...map];
+                                      ^");
+  } =>#t168;
+  block {
+    final core::Set<core::int> #t169 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{if (oracle(\"foo\")) ...map else 42, null};
+                              ^");
+    else
+      #t169.{core::Set::add}(42);
+    #t169.{core::Set::add}(null);
+  } =>#t169;
+  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
+                                                     ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
+                                                     ^": null};
+  core::Set<dynamic> set10 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:106:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  Set<dynamic> set10 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
+                       ^";
+  core::Map<dynamic, dynamic> map10 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:107:53: Error: Expected ':' after this.
+  Map<dynamic, dynamic> map10 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
+                                                    ^": null};
+  core::Set<dynamic> set11 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:108:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  Set<dynamic> set11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
+                       ^";
+  core::Map<dynamic, dynamic> map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
+  Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
+                                                                     ^": null};
+  core::Map<<BottomType>, core::Null> map12 = <<BottomType>, core::Null>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
+  var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
+                                  ^": null};
+  core::Map<<BottomType>, core::Null> map13 = <<BottomType>, core::Null>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
+  var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
+                                                   ^": null};
+  core::List<core::int> list20 = block {
+    final core::List<core::int> #t170 = <core::int>[];
+    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  List<int> list20 = [if (42) 42];
+                          ^" in 42 as{TypeError} core::bool)
+      #t170.{core::List::add}(42);
+  } =>#t170;
+  core::Set<core::int> set20 = block {
+    final core::Set<core::int> #t172 = col::LinkedHashSet::•<core::int>();
+    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  Set<int> set20 = {if (42) 42};
+                        ^" in 42 as{TypeError} core::bool)
+      #t172.{core::Set::add}(42);
+  } =>#t172;
+  core::Map<core::int, core::int> map30 = block {
+    final core::Map<core::int, core::int> #t174 = <core::int, core::int>{};
+    if(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  Map<int, int> map30 = {if (42) 42: 42};
+                             ^" in 42 as{TypeError} core::bool)
+      #t174.{core::Map::[]=}(42, 42);
+  } =>#t174;
+  core::List<core::String> list40 = block {
+    final core::List<core::String> #t176 = <core::String>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t176.{core::List::add}(let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
+                                                    ^" in true as{TypeError} core::String);
+    else
+      #t176.{core::List::add}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
+                                                              ^" in 42 as{TypeError} core::String);
+  } =>#t176;
+  core::Set<core::String> set40 = block {
+    final core::Set<core::String> #t179 = col::LinkedHashSet::•<core::String>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
+                                                  ^" in true as{TypeError} core::String);
+    else
+      #t179.{core::Set::add}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
+                                                            ^" in 42 as{TypeError} core::String);
+  } =>#t179;
+  core::Map<core::String, core::int> map40 = block {
+    final core::Map<core::String, core::int> #t182 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t182.{core::Map::[]=}(let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
+                                                            ^" in true as{TypeError} core::String, 42);
+    else
+      #t182.{core::Map::[]=}(let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
+                                                                          ^" in 42 as{TypeError} core::String, 42);
+  } =>#t182;
+  core::Map<core::int, core::String> map41 = block {
+    final core::Map<core::int, core::String> #t185 = <core::int, core::String>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t185.{core::Map::[]=}(42, let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
+                                                                ^" in true as{TypeError} core::String);
+    else
+      #t185.{core::Map::[]=}(42, let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
+                                                                              ^" in 42 as{TypeError} core::String);
+  } =>#t185;
+}
+static method testForElement(dynamic dynVar, core::List<core::int> listInt, core::List<core::double> listDouble, core::int index, core::Map<core::String, core::int> mapStringInt, core::Map<core::String, core::double> mapStringDouble) → dynamic {
+  core::List<core::int> list10 = block {
+    final core::List<core::int> #t188 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t188.{core::List::add}(42);
+  } =>#t188;
+  core::Set<core::int> set10 = block {
+    final core::Set<core::int> #t189 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t189.{core::Set::add}(42);
+    #t189.{core::Set::add}(null);
+  } =>#t189;
+  core::Map<core::String, core::int> map10 = block {
+    final core::Map<core::String, core::int> #t190 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t190.{core::Map::[]=}("bar", 42);
+    #t190.{core::Map::[]=}("baz", null);
+  } =>#t190;
+  core::List<dynamic> list11 = block {
+    final core::List<dynamic> #t191 = <dynamic>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t191.{core::List::add}(dynVar);
+  } =>#t191;
+  core::Set<dynamic> set11 = block {
+    final core::Set<dynamic> #t192 = col::LinkedHashSet::•<dynamic>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t192.{core::Set::add}(dynVar);
+    #t192.{core::Set::add}(null);
+  } =>#t192;
+  core::Map<core::String, dynamic> map11 = block {
+    final core::Map<core::String, dynamic> #t193 = <core::String, dynamic>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t193.{core::Map::[]=}("bar", dynVar);
+    #t193.{core::Map::[]=}("baz", null);
+  } =>#t193;
+  core::List<core::List<core::int>> list12 = block {
+    final core::List<core::List<core::int>> #t194 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t194.{core::List::add}(<core::int>[42]);
+  } =>#t194;
+  core::Set<core::List<core::int>> set12 = block {
+    final core::Set<core::List<core::int>> #t195 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t195.{core::Set::add}(<core::int>[42]);
+    #t195.{core::Set::add}(null);
+  } =>#t195;
+  core::Map<core::String, core::List<core::int>> map12 = block {
+    final core::Map<core::String, core::List<core::int>> #t196 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t196.{core::Map::[]=}("bar", <core::int>[42]);
+    #t196.{core::Map::[]=}("baz", null);
+  } =>#t196;
+  core::List<core::int> list20 = block {
+    final core::List<core::int> #t197 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t198 in <core::int>[42])
+        #t197.{core::List::add}(#t198);
+  } =>#t197;
+  core::Set<core::int> set20 = block {
+    final core::Set<core::int> #t199 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t200 in <core::int>[42])
+        #t199.{core::Set::add}(#t200);
+    #t199.{core::Set::add}(null);
+  } =>#t199;
+  core::Map<core::String, core::int> map20 = block {
+    final core::Map<core::String, core::int> #t201 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, core::int> #t202 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
+        #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
+    #t201.{core::Map::[]=}("baz", null);
+  } =>#t201;
+  core::List<dynamic> list21 = block {
+    final core::List<dynamic> #t203 = <dynamic>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final dynamic #t204 in <dynamic>[dynVar])
+        #t203.{core::List::add}(#t204);
+  } =>#t203;
+  core::Set<dynamic> set21 = block {
+    final core::Set<dynamic> #t205 = col::LinkedHashSet::•<dynamic>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final dynamic #t206 in <dynamic>[dynVar])
+        #t205.{core::Set::add}(#t206);
+    #t205.{core::Set::add}(null);
+  } =>#t205;
+  core::Map<core::String, dynamic> map21 = block {
+    final core::Map<core::String, dynamic> #t207 = <core::String, dynamic>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, dynamic> #t208 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
+        #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
+    #t207.{core::Map::[]=}("baz", null);
+  } =>#t207;
+  core::List<core::List<core::int>> list22 = block {
+    final core::List<core::List<core::int>> #t209 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t210 in <core::List<core::int>>[<core::int>[42]])
+        #t209.{core::List::add}(#t210);
+  } =>#t209;
+  core::Set<core::List<core::int>> set22 = block {
+    final core::Set<core::List<core::int>> #t211 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t212 in <core::List<core::int>>[<core::int>[42]])
+        #t211.{core::Set::add}(#t212);
+    #t211.{core::Set::add}(null);
+  } =>#t211;
+  core::Map<core::String, core::List<core::int>> map22 = block {
+    final core::Map<core::String, core::List<core::int>> #t213 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, core::List<core::int>> #t214 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
+        #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
+    #t213.{core::Map::[]=}("baz", null);
+  } =>#t213;
+  core::List<core::int> list30 = block {
+    final core::List<core::int> #t215 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t216 in <core::int>[42])
+          #t215.{core::List::add}(#t216);
+  } =>#t215;
+  core::Set<core::int> set30 = block {
+    final core::Set<core::int> #t217 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t218 in <core::int>[42])
+          #t217.{core::Set::add}(#t218);
+    #t217.{core::Set::add}(null);
+  } =>#t217;
+  core::Map<core::String, core::int> map30 = block {
+    final core::Map<core::String, core::int> #t219 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::int> #t220 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
+          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
+    #t219.{core::Map::[]=}("baz", null);
+  } =>#t219;
+  core::List<dynamic> list31 = block {
+    final core::List<dynamic> #t221 = <dynamic>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t222 in <dynamic>[dynVar])
+          #t221.{core::List::add}(#t222);
+  } =>#t221;
+  core::Set<dynamic> set31 = block {
+    final core::Set<dynamic> #t223 = col::LinkedHashSet::•<dynamic>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t224 in <dynamic>[dynVar])
+          #t223.{core::Set::add}(#t224);
+    #t223.{core::Set::add}(null);
+  } =>#t223;
+  core::Map<core::String, dynamic> map31 = block {
+    final core::Map<core::String, dynamic> #t225 = <core::String, dynamic>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, dynamic> #t226 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
+          #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
+    #t225.{core::Map::[]=}("baz", null);
+  } =>#t225;
+  core::List<core::List<core::int>> list33 = block {
+    final core::List<core::List<core::int>> #t227 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t228 in <core::List<core::int>>[<core::int>[42]])
+          #t227.{core::List::add}(#t228);
+  } =>#t227;
+  core::Set<core::List<core::int>> set33 = block {
+    final core::Set<core::List<core::int>> #t229 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t230 in <core::List<core::int>>[<core::int>[42]])
+          #t229.{core::Set::add}(#t230);
+    #t229.{core::Set::add}(null);
+  } =>#t229;
+  core::Map<core::String, core::List<core::int>> map33 = block {
+    final core::Map<core::String, core::List<core::int>> #t231 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t232 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
+          #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
+    #t231.{core::Map::[]=}("baz", null);
+  } =>#t231;
+  core::List<core::List<core::int>> list40 = block {
+    final core::List<core::List<core::int>> #t233 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t234 in <core::List<core::int>>[<core::int>[]])
+        #t233.{core::List::add}(#t234);
+  } =>#t233;
+  core::Set<core::List<core::int>> set40 = block {
+    final core::Set<core::List<core::int>> #t235 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t236 in <core::List<core::int>>[<core::int>[]])
+        #t235.{core::Set::add}(#t236);
+    #t235.{core::Set::add}(null);
+  } =>#t235;
+  core::Map<core::String, core::List<core::int>> map40 = block {
+    final core::Map<core::String, core::List<core::int>> #t237 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, core::List<core::int>> #t238 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+        #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
+    #t237.{core::Map::[]=}("baz", null);
+  } =>#t237;
+  core::List<core::List<core::int>> list41 = block {
+    final core::List<core::List<core::int>> #t239 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t240 in let final core::Set<core::List<core::int>> #t241 = col::LinkedHashSet::•<core::List<core::int>>() in let final dynamic #t242 = #t241.{core::Set::add}(<core::int>[]) in #t241)
+        #t239.{core::List::add}(#t240);
+  } =>#t239;
+  core::Set<core::List<core::int>> set41 = block {
+    final core::Set<core::List<core::int>> #t243 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t244 in let final core::Set<core::List<core::int>> #t245 = col::LinkedHashSet::•<core::List<core::int>>() in let final dynamic #t246 = #t245.{core::Set::add}(<core::int>[]) in #t245)
+        #t243.{core::Set::add}(#t244);
+    #t243.{core::Set::add}(null);
+  } =>#t243;
+  core::List<core::List<core::int>> list42 = block {
+    final core::List<core::List<core::int>> #t247 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t248 in <core::List<core::int>>[<core::int>[]])
+          #t247.{core::List::add}(#t248);
+  } =>#t247;
+  core::Set<core::List<core::int>> set42 = block {
+    final core::Set<core::List<core::int>> #t249 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t250 in <core::List<core::int>>[<core::int>[]])
+          #t249.{core::Set::add}(#t250);
+    #t249.{core::Set::add}(null);
+  } =>#t249;
+  core::Map<core::String, core::List<core::int>> map42 = block {
+    final core::Map<core::String, core::List<core::int>> #t251 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t252 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+          #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
+    #t251.{core::Map::[]=}("baz", null);
+  } =>#t251;
+  core::List<core::int> list50 = block {
+    final core::List<core::int> #t253 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t254 in <core::int>[])
+        #t253.{core::List::add}(#t254);
+  } =>#t253;
+  core::Set<core::int> set50 = block {
+    final core::Set<core::int> #t255 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t256 in <core::int>[])
+        #t255.{core::Set::add}(#t256);
+    #t255.{core::Set::add}(null);
+  } =>#t255;
+  core::Map<core::String, core::int> map50 = block {
+    final core::Map<core::String, core::int> #t257 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, core::int> #t258 in <core::String, core::int>{}.{core::Map::entries})
+        #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
+    #t257.{core::Map::[]=}("baz", null);
+  } =>#t257;
+  core::List<core::int> list51 = block {
+    final core::List<core::int> #t259 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t260 in let final core::Set<core::int> #t261 = col::LinkedHashSet::•<core::int>() in #t261)
+        #t259.{core::List::add}(#t260);
+  } =>#t259;
+  core::Set<core::int> set51 = block {
+    final core::Set<core::int> #t262 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t263 in let final core::Set<core::int> #t264 = col::LinkedHashSet::•<core::int>() in #t264)
+        #t262.{core::Set::add}(#t263);
+    #t262.{core::Set::add}(null);
+  } =>#t262;
+  core::List<core::int> list52 = block {
+    final core::List<core::int> #t265 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t266 in <core::int>[])
+          #t265.{core::List::add}(#t266);
+  } =>#t265;
+  core::Set<core::int> set52 = block {
+    final core::Set<core::int> #t267 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t268 in <core::int>[])
+          #t267.{core::Set::add}(#t268);
+    #t267.{core::Set::add}(null);
+  } =>#t267;
+  core::List<core::List<core::int>> list60 = block {
+    final core::List<core::List<core::int>> #t269 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t270 in <core::List<core::int>>[<core::int>[]])
+        #t269.{core::List::add}(#t270);
+  } =>#t269;
+  core::Set<core::List<core::int>> set60 = block {
+    final core::Set<core::List<core::int>> #t271 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t272 in <core::List<core::int>>[<core::int>[]])
+        #t271.{core::Set::add}(#t272);
+    #t271.{core::Set::add}(null);
+  } =>#t271;
+  core::Map<core::String, core::List<core::int>> map60 = block {
+    final core::Map<core::String, core::List<core::int>> #t273 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, core::List<core::int>> #t274 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+        #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
+    #t273.{core::Map::[]=}("baz", null);
+  } =>#t273;
+  core::List<core::List<core::int>> list61 = block {
+    final core::List<core::List<core::int>> #t275 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t276 in <core::List<core::int>>[<core::int>[]])
+          #t275.{core::List::add}(#t276);
+  } =>#t275;
+  core::Set<core::List<core::int>> set61 = block {
+    final core::Set<core::List<core::int>> #t277 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t278 in <core::List<core::int>>[<core::int>[]])
+          #t277.{core::Set::add}(#t278);
+    #t277.{core::Set::add}(null);
+  } =>#t277;
+  core::Map<core::String, core::List<core::int>> map61 = block {
+    final core::Map<core::String, core::List<core::int>> #t279 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t280 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+          #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
+    #t279.{core::Map::[]=}("baz", null);
+  } =>#t279;
+  core::List<core::List<core::int>> list70 = block {
+    final core::List<core::List<core::int>> #t281 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t281.{core::List::add}(<core::int>[]);
+  } =>#t281;
+  core::Set<core::List<core::int>> set70 = block {
+    final core::Set<core::List<core::int>> #t282 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t282.{core::Set::add}(<core::int>[]);
+    #t282.{core::Set::add}(null);
+  } =>#t282;
+  core::Map<core::String, core::List<core::int>> map70 = block {
+    final core::Map<core::String, core::List<core::int>> #t283 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t283.{core::Map::[]=}("bar", <core::int>[]);
+    #t283.{core::Map::[]=}("baz", null);
+  } =>#t283;
+  core::List<core::List<core::int>> list71 = block {
+    final core::List<core::List<core::int>> #t284 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t284.{core::List::add}(<core::int>[]);
+  } =>#t284;
+  core::Set<core::List<core::int>> set71 = block {
+    final core::Set<core::List<core::int>> #t285 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t285.{core::Set::add}(<core::int>[]);
+    #t285.{core::Set::add}(null);
+  } =>#t285;
+  core::Map<core::String, core::List<core::int>> map71 = block {
+    final core::Map<core::String, core::List<core::int>> #t286 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t286.{core::Map::[]=}("bar", <core::int>[]);
+    #t286.{core::Map::[]=}("baz", null);
+  } =>#t286;
+  core::List<core::num> list80 = block {
+    final core::List<core::num> #t287 = <core::num>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t287.{core::List::add}(42);
+      else
+        #t287.{core::List::add}(3.14);
+  } =>#t287;
+  core::Set<core::num> set80 = block {
+    final core::Set<core::num> #t288 = col::LinkedHashSet::•<core::num>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t288.{core::Set::add}(42);
+      else
+        #t288.{core::Set::add}(3.14);
+    #t288.{core::Set::add}(null);
+  } =>#t288;
+  core::Map<core::String, core::num> map80 = block {
+    final core::Map<core::String, core::num> #t289 = <core::String, core::num>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t289.{core::Map::[]=}("bar", 42);
+      else
+        #t289.{core::Map::[]=}("bar", 3.14);
+    #t289.{core::Map::[]=}("baz", null);
+  } =>#t289;
+  core::List<core::num> list81 = block {
+    final core::List<core::num> #t290 = <core::num>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::num #t291 in listInt)
+          #t290.{core::List::add}(#t291);
+      else
+        for (final core::num #t292 in listDouble)
+          #t290.{core::List::add}(#t292);
+  } =>#t290;
+  core::Set<core::num> set81 = block {
+    final core::Set<core::num> #t293 = col::LinkedHashSet::•<core::num>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::num #t294 in listInt)
+          #t293.{core::Set::add}(#t294);
+      else
+        for (final core::num #t295 in listDouble)
+          #t293.{core::Set::add}(#t295);
+    #t293.{core::Set::add}(null);
+  } =>#t293;
+  core::Map<core::String, core::num> map81 = block {
+    final core::Map<core::String, core::num> #t296 = <core::String, core::num>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::num> #t297 in mapStringInt.{core::Map::entries})
+          #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{core::MapEntry::value});
+      else
+        for (final core::MapEntry<core::String, core::num> #t298 in mapStringDouble.{core::Map::entries})
+          #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
+    #t296.{core::Map::[]=}("baz", null);
+  } =>#t296;
+  core::List<dynamic> list82 = block {
+    final core::List<dynamic> #t299 = <dynamic>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t300 in listInt)
+          #t299.{core::List::add}(#t300);
+      else
+        for (final dynamic #t301 in dynVar as{TypeError} core::Iterable<dynamic>)
+          #t299.{core::List::add}(#t301);
+  } =>#t299;
+  core::Set<dynamic> set82 = block {
+    final core::Set<dynamic> #t302 = col::LinkedHashSet::•<dynamic>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t303 in listInt)
+          #t302.{core::Set::add}(#t303);
+      else
+        for (final dynamic #t304 in dynVar as{TypeError} core::Iterable<dynamic>)
+          #t302.{core::Set::add}(#t304);
+    #t302.{core::Set::add}(null);
+  } =>#t302;
+  core::Map<dynamic, dynamic> map82 = block {
+    final core::Map<dynamic, dynamic> #t305 = <dynamic, dynamic>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<dynamic, dynamic> #t306 in mapStringInt.{core::Map::entries})
+          #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{core::MapEntry::value});
+      else
+        for (final core::MapEntry<dynamic, dynamic> #t307 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries})
+          #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
+    #t305.{core::Map::[]=}("baz", null);
+  } =>#t305;
+  core::List<core::num> list83 = block {
+    final core::List<core::num> #t308 = <core::num>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t308.{core::List::add}(42);
+      else
+        for (final core::num #t309 in listDouble)
+          #t308.{core::List::add}(#t309);
+  } =>#t308;
+  core::Set<core::num> set83 = block {
+    final core::Set<core::num> #t310 = col::LinkedHashSet::•<core::num>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::num #t311 in listInt)
+          #t310.{core::Set::add}(#t311);
+      else
+        #t310.{core::Set::add}(3.14);
+    #t310.{core::Set::add}(null);
+  } =>#t310;
+  core::Map<core::String, core::num> map83 = block {
+    final core::Map<core::String, core::num> #t312 = <core::String, core::num>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::num> #t313 in mapStringInt.{core::Map::entries})
+          #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
+      else
+        #t312.{core::Map::[]=}("bar", 3.14);
+    #t312.{core::Map::[]=}("baz", null);
+  } =>#t312;
+  core::List<core::int> list90 = block {
+    final core::List<core::int> #t314 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t314.{core::List::add}(dynVar as{TypeError} core::int);
+  } =>#t314;
+  core::Set<core::int> set90 = block {
+    final core::Set<core::int> #t315 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t315.{core::Set::add}(dynVar as{TypeError} core::int);
+    #t315.{core::Set::add}(null);
+  } =>#t315;
+  core::Map<core::String, core::int> map90 = block {
+    final core::Map<core::String, core::int> #t316 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t316.{core::Map::[]=}("bar", dynVar as{TypeError} core::int);
+    #t316.{core::Map::[]=}("baz", null);
+  } =>#t316;
+  core::List<core::int> list91 = block {
+    final core::List<core::int> #t317 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final dynamic #t318 in dynVar as{TypeError} core::Iterable<dynamic>) {
+        final core::int #t319 = #t318 as{TypeError} core::int;
+        #t317.{core::List::add}(#t319);
+      }
+  } =>#t317;
+  core::Set<core::int> set91 = block {
+    final core::Set<core::int> #t320 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final dynamic #t321 in dynVar as{TypeError} core::Iterable<dynamic>) {
+        final core::int #t322 = #t321 as{TypeError} core::int;
+        #t320.{core::Set::add}(#t322);
+      }
+    #t320.{core::Set::add}(null);
+  } =>#t320;
+  core::Map<core::String, core::int> map91 = block {
+    final core::Map<core::String, core::int> #t323 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<dynamic, dynamic> #t324 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
+        final core::String #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String;
+        final core::int #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int;
+        #t323.{core::Map::[]=}(#t325, #t326);
+      }
+    #t323.{core::Map::[]=}("baz", null);
+  } =>#t323;
+  core::List<core::int> list100 = block {
+    final core::List<core::int> #t327 = <core::int>[];
+    for (final core::int #t328 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
+      #t327.{core::List::add}(42);
+  } =>#t327;
+  core::Set<core::int> set100 = block {
+    final core::Set<core::int> #t329 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t330 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
+      #t329.{core::Set::add}(42);
+  } =>#t329;
+  core::Map<core::String, core::int> map100 = block {
+    final core::Map<core::String, core::int> #t331 = <core::String, core::int>{};
+    for (final core::int #t332 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
+      #t331.{core::Map::[]=}("bar", 42);
+  } =>#t331;
+  core::List<core::int> list110 = block {
+    final core::List<core::int> #t333 = <core::int>[];
+    for (core::int i in <core::int>[1, 2, 3])
+      #t333.{core::List::add}(i);
+  } =>#t333;
+  core::Set<core::int> set110 = block {
+    final core::Set<core::int> #t334 = col::LinkedHashSet::•<core::int>();
+    for (core::int i in <core::int>[1, 2, 3])
+      #t334.{core::Set::add}(i);
+    #t334.{core::Set::add}(null);
+  } =>#t334;
+  core::Map<core::String, core::int> map110 = block {
+    final core::Map<core::String, core::int> #t335 = <core::String, core::int>{};
+    for (core::int i in <core::int>[1, 2, 3])
+      #t335.{core::Map::[]=}("bar", i);
+    #t335.{core::Map::[]=}("baz", null);
+  } =>#t335;
+  core::List<core::int> list120 = block {
+    final core::List<core::int> #t336 = <core::int>[];
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
+      #t336.{core::List::add}(i as{TypeError} core::int);
+  } =>#t336;
+  core::Set<core::int> set120 = block {
+    final core::Set<core::int> #t337 = col::LinkedHashSet::•<core::int>();
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
+      #t337.{core::Set::add}(i as{TypeError} core::int);
+    #t337.{core::Set::add}(null);
+  } =>#t337;
+  core::Map<core::String, core::int> map120 = block {
+    final core::Map<core::String, core::int> #t338 = <core::String, core::int>{};
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
+      #t338.{core::Map::[]=}("bar", i as{TypeError} core::int);
+    #t338.{core::Map::[]=}("baz", null);
+  } =>#t338;
+  core::List<core::int> list130 = block {
+    final core::List<core::int> #t339 = <core::int>[];
+    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t339.{core::List::add}(i);
+  } =>#t339;
+  core::Set<core::int> set130 = block {
+    final core::Set<core::int> #t340 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t340.{core::Set::add}(i);
+  } =>#t340;
+  core::Map<core::int, core::int> map130 = block {
+    final core::Map<core::int, core::int> #t341 = <core::int, core::int>{};
+    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t341.{core::Map::[]=}(i, i);
+  } =>#t341;
+}
+static method testForElementErrors(core::Map<core::int, core::int> map, core::List<core::int> list) → dynamic async {
+  block {
+    final core::List<core::int> #t342 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t342.{core::List::add}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
+                                            ^" in "bar" as{TypeError} core::int);
+  } =>#t342;
+  block {
+    final core::Set<core::int> #t344 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
+                                            ^" in "bar" as{TypeError} core::int);
+    #t344.{core::Set::add}(null);
+  } =>#t344;
+  block {
+    final core::Map<core::int, core::int> #t346 = <core::int, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t346.{core::Map::[]=}(let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                 ^" in "bar" as{TypeError} core::int, let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                        ^" in "bar" as{TypeError} core::int);
+    #t346.{core::Map::[]=}(let final<BottomType> #t349 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                               ^" in "baz" as{TypeError} core::int, null);
+  } =>#t346;
+  block {
+    final core::List<core::int> #t350 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t351 in <core::int>[let final<BottomType> #t352 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
+                                                ^" in "bar" as{TypeError} core::int])
+        #t350.{core::List::add}(#t351);
+  } =>#t350;
+  block {
+    final core::Set<core::int> #t353 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t354 in <core::int>[let final<BottomType> #t355 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
+                                                ^" in "bar" as{TypeError} core::int])
+        #t353.{core::Set::add}(#t354);
+    #t353.{core::Set::add}(null);
+  } =>#t353;
+  block {
+    final core::Map<core::int, core::int> #t356 = <core::int, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::int, core::int> #t357 in <core::int, core::int>{let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                     ^" in "bar" as{TypeError} core::int: let final<BottomType> #t359 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                            ^" in "bar" as{TypeError} core::int}.{core::Map::entries})
+        #t356.{core::Map::[]=}(#t357.{core::MapEntry::key}, #t357.{core::MapEntry::value});
+    #t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                                    ^" in "baz" as{TypeError} core::int, null);
+  } =>#t356;
+  block {
+    final core::List<core::int> #t361 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t361.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) ...map];
+                                               ^");
+  } =>#t361;
+  block {
+    final core::Set<core::int> #t362 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) ...map, null};
+                                               ^");
+    #t362.{core::Set::add}(null);
+  } =>#t362;
+  <core::int, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
+                                                    ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
+                                                    ^": null};
+  block {
+    final core::List<core::String> #t363 = <core::String>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t363.{core::List::add}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
+                                                             ^" in 42 as{TypeError} core::String);
+      else
+        #t363.{core::List::add}(let final<BottomType> #t365 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
+                                                                     ^" in 3.14 as{TypeError} core::String);
+  } =>#t363;
+  block {
+    final core::Set<core::String> #t366 = col::LinkedHashSet::•<core::String>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
+                                                             ^" in 42 as{TypeError} core::String);
+      else
+        #t366.{core::Set::add}(let final<BottomType> #t368 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
+                                                                     ^" in 3.14 as{TypeError} core::String);
+    #t366.{core::Set::add}(null);
+  } =>#t366;
+  block {
+    final core::Map<core::String, core::String> #t369 = <core::String, core::String>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
+                                                                            ^" in 42 as{TypeError} core::String);
+      else
+        #t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
+                                                                                           ^" in 3.14 as{TypeError} core::String);
+    #t369.{core::Map::[]=}("baz", null);
+  } =>#t369;
+  block {
+    final core::List<core::int> #t372 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t372.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42];
+                                                             ^");
+      else
+        #t372.{core::List::add}(42);
+  } =>#t372;
+  block {
+    final core::Set<core::int> #t373 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42, null};
+                                                             ^");
+      else
+        #t373.{core::Set::add}(42);
+    #t373.{core::Set::add}(null);
+  } =>#t373;
+  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
+                                                                     ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
+                                                                     ^": null};
+  block {
+    final core::List<core::int> #t374 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t374.{core::List::add}(42);
+      else
+        #t374.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map];
+                                                                     ^");
+  } =>#t374;
+  block {
+    final core::Set<core::int> #t375 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t375.{core::Set::add}(42);
+      else
+        #t375.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map, null};
+                                                                     ^");
+    #t375.{core::Set::add}(null);
+  } =>#t375;
+  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
+                                                                                    ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
+                                                                                    ^": null};
+  final core::int i = 0;
+  block {
+    final core::List<core::int> #t376 = <core::int>[];
+    for (final core::int #t377 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
+  <int>[for (i in <int>[1]) i];
+             ^";
+      #t376.{core::List::add}(i);
+    }
+  } =>#t376;
+  block {
+    final core::Set<core::int> #t378 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t379 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
+  <int>{for (i in <int>[1]) i, null};
+             ^";
+      #t378.{core::Set::add}(i);
+    }
+    #t378.{core::Set::add}(null);
+  } =>#t378;
+  block {
+    final core::Map<core::String, core::int> #t380 = <core::String, core::int>{};
+    for (final core::int #t381 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
+\t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
+\t                   ^";
+      #t380.{core::Map::[]=}("bar", i);
+    }
+    #t380.{core::Map::[]=}("baz", null);
+  } =>#t380;
+  core::List<dynamic> list10 = block {
+    final core::List<dynamic> #t382 = <dynamic>[];
+    for (dynamic i in let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  var list10 = [for (var i in \"not iterable\") i];
+                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>)
+      #t382.{core::List::add}(i);
+  } =>#t382;
+  core::Set<dynamic> set10 = block {
+    final core::Set<dynamic> #t384 = col::LinkedHashSet::•<dynamic>();
+    for (dynamic i in let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  var set10 = {for (var i in \"not iterable\") i, null};
+                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>)
+      #t384.{core::Set::add}(i);
+    #t384.{core::Set::add}(null);
+  } =>#t384;
+  core::Map<core::String, dynamic> map10 = block {
+    final core::Map<core::String, dynamic> #t386 = <core::String, dynamic>{};
+    for (dynamic i in let final<BottomType> #t387 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  var map10 = {for (var i in \"not iterable\") \"bar\": i, \"baz\": null};
+                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>)
+      #t386.{core::Map::[]=}("bar", i);
+    #t386.{core::Map::[]=}("baz", null);
+  } =>#t386;
+  core::List<core::int> list20 = block {
+    final core::List<core::int> #t388 = <core::int>[];
+    for (core::int i in <core::int>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list20 = [for (int i in [\"not\", \"int\"]) i];
+                               ^" in "not" as{TypeError} core::int, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list20 = [for (int i in [\"not\", \"int\"]) i];
+                                      ^" in "int" as{TypeError} core::int])
+      #t388.{core::List::add}(i);
+  } =>#t388;
+  core::Set<core::int> set20 = block {
+    final core::Set<core::int> #t391 = col::LinkedHashSet::•<core::int>();
+    for (core::int i in <core::int>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
+                              ^" in "not" as{TypeError} core::int, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
+                                     ^" in "int" as{TypeError} core::int])
+      #t391.{core::Set::add}(i);
+    #t391.{core::Set::add}(null);
+  } =>#t391;
+  core::Map<core::String, core::int> map20 = block {
+    final core::Map<core::String, core::int> #t394 = <core::String, core::int>{};
+    for (core::int i in <core::int>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
+                              ^" in "not" as{TypeError} core::int, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
+                                     ^" in "int" as{TypeError} core::int])
+      #t394.{core::Map::[]=}("bar", i);
+    #t394.{core::Map::[]=}("baz", null);
+  } =>#t394;
+  core::List<dynamic> list30 = block {
+    final core::List<dynamic> #t397 = <dynamic>[];
+    await for (dynamic i in let final<BottomType> #t398 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
+  var list30 = [await for (var i in \"not stream\") i];
+                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>)
+      #t397.{core::List::add}(i);
+  } =>#t397;
+  core::Set<dynamic> set30 = block {
+    final core::Set<dynamic> #t399 = col::LinkedHashSet::•<dynamic>();
+    await for (dynamic i in let final<BottomType> #t400 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
+  var set30 = {await for (var i in \"not stream\") i, null};
+                                   ^" in "not stream" as{TypeError} asy::Stream<dynamic>)
+      #t399.{core::Set::add}(i);
+    #t399.{core::Set::add}(null);
+  } =>#t399;
+  core::Map<core::String, dynamic> map30 = block {
+    final core::Map<core::String, dynamic> #t401 = <core::String, dynamic>{};
+    await for (dynamic i in let final<BottomType> #t402 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
+  var map30 = {await for (var i in \"not stream\") \"bar\": i, \"baz\": null};
+                                   ^" in "not stream" as{TypeError} asy::Stream<dynamic>)
+      #t401.{core::Map::[]=}("bar", i);
+    #t401.{core::Map::[]=}("baz", null);
+  } =>#t401;
+  core::List<core::int> list40 = block {
+    final core::List<core::int> #t403 = <core::int>[];
+    await for (core::int i in asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t404 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
+                                                         ^" in "not" as{TypeError} core::int, let final<BottomType> #t405 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
+                                                                ^" in "int" as{TypeError} core::int]))
+      #t403.{core::List::add}(i);
+  } =>#t403;
+  core::Set<core::int> set40 = block {
+    final core::Set<core::int> #t406 = col::LinkedHashSet::•<core::int>();
+    await for (core::int i in asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t407 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
+                                                        ^" in "not" as{TypeError} core::int, let final<BottomType> #t408 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
+                                                               ^" in "int" as{TypeError} core::int]))
+      #t406.{core::Set::add}(i);
+    #t406.{core::Set::add}(null);
+  } =>#t406;
+  core::Map<core::String, core::int> map40 = block {
+    final core::Map<core::String, core::int> #t409 = <core::String, core::int>{};
+    await for (core::int i in asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t410 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
+                                                        ^" in "not" as{TypeError} core::int, let final<BottomType> #t411 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
+                                                               ^" in "int" as{TypeError} core::int]))
+      #t409.{core::Map::[]=}("bar", i);
+    #t409.{core::Map::[]=}("baz", null);
+  } =>#t409;
+  core::List<core::int> list50 = block {
+    final core::List<core::int> #t412 = <core::int>[];
+    for (; ; )
+      #t412.{core::List::add}(42);
+  } =>#t412;
+  core::Set<core::int> set50 = block {
+    final core::Set<core::int> #t413 = col::LinkedHashSet::•<core::int>();
+    for (; ; )
+      #t413.{core::Set::add}(42);
+    #t413.{core::Set::add}(null);
+  } =>#t413;
+  core::Map<core::String, core::int> map50 = block {
+    final core::Map<core::String, core::int> #t414 = <core::String, core::int>{};
+    for (; ; )
+      #t414.{core::Map::[]=}("bar", 42);
+    #t414.{core::Map::[]=}("baz", null);
+  } =>#t414;
+  core::List<core::int> list60 = block {
+    final core::List<core::int> #t415 = <core::int>[];
+    for (; let final<BottomType> #t416 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var list60 = [for (; \"not bool\";) 42];
+                       ^" in "not bool" as{TypeError} core::bool; )
+      #t415.{core::List::add}(42);
+  } =>#t415;
+  core::Set<core::int> set60 = block {
+    final core::Set<core::int> #t417 = col::LinkedHashSet::•<core::int>();
+    for (; let final<BottomType> #t418 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var set60 = {for (; \"not bool\";) 42, null};
+                      ^" in "not bool" as{TypeError} core::bool; )
+      #t417.{core::Set::add}(42);
+    #t417.{core::Set::add}(null);
+  } =>#t417;
+  core::Map<core::String, core::int> map60 = block {
+    final core::Map<core::String, core::int> #t419 = <core::String, core::int>{};
+    for (; let final<BottomType> #t420 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
+                      ^" in "not bool" as{TypeError} core::bool; )
+      #t419.{core::Map::[]=}("bar", 42);
+    #t419.{core::Map::[]=}("baz", null);
+  } =>#t419;
+}
+static method testForElementErrorsNotAsync(asy::Stream<core::int> stream) → dynamic {
+  block {
+    final core::List<core::int> #t421 = <core::int>[];
+    await for (core::int i in stream)
+      #t421.{core::List::add}(i);
+  } =>#t421;
+  block {
+    final core::Set<core::int> #t422 = col::LinkedHashSet::•<core::int>();
+    await for (core::int i in stream)
+      #t422.{core::Set::add}(i);
+  } =>#t422;
+  block {
+    final core::Map<core::String, core::int> #t423 = <core::String, core::int>{};
+    await for (core::int i in stream)
+      #t423.{core::Map::[]=}("bar", i);
+  } =>#t423;
+}
+static method testPromotion(self::A a) → dynamic {
+  core::List<core::int> list10 = block {
+    final core::List<core::int> #t424 = <core::int>[];
+    if(a is self::B)
+      #t424.{core::List::add}(a{self::B}.{self::B::foo});
+  } =>#t424;
+  core::Set<core::int> set10 = block {
+    final core::Set<core::int> #t425 = col::LinkedHashSet::•<core::int>();
+    if(a is self::B)
+      #t425.{core::Set::add}(a{self::B}.{self::B::foo});
+  } =>#t425;
+  core::Map<core::int, core::int> map10 = block {
+    final core::Map<core::int, core::int> #t426 = <core::int, core::int>{};
+    if(a is self::B)
+      #t426.{core::Map::[]=}(a{self::B}.{self::B::foo}, a{self::B}.{self::B::foo});
+  } =>#t426;
+}
+static method main() → dynamic {}
diff --git a/front_end/testcases/control_flow_collection_inference.dart.strong.transformed.expect b/front_end/testcases/control_flow_collection_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..3c4ea93
--- /dev/null
+++ b/front_end/testcases/control_flow_collection_inference.dart.strong.transformed.expect
@@ -0,0 +1,2464 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+//                                  ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:106:44: Error: Expected ':' after this.
+//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                            ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:107:53: Error: Expected ':' after this.
+//   Map<dynamic, dynamic> map10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:108:61: Error: Expected ':' after this.
+//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
+//   Map<dynamic, dynamic> map11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
+//   var map12 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                   ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
+//   var map13 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                                    ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>[if (oracle("foo")) "bar"];
+//                            ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>{if (oracle("foo")) "bar", null};
+//                            ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
+//                                           ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>[if (oracle("foo")) ...["bar"]];
+//                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>{if (oracle("foo")) ...["bar"], null};
+//                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+//                                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[if (oracle("foo")) ...map];
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{if (oracle("foo")) ...map, null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>[if (oracle("foo")) 42 else 3.14];
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>[if (oracle("foo")) 42 else 3.14];
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>{if (oracle("foo")) 42 else 3.14, null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>{if (oracle("foo")) 42 else 3.14, null};
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
+//                                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
+//                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[if (oracle("foo")) ...map else 42];
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[if (oracle("foo")) 42 else ...map];
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+//                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:106:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                        ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:108:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                        ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   List<int> list20 = [if (42) 42];
+//                           ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   Set<int> set20 = {if (42) 42};
+//                         ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   Map<int, int> map30 = {if (42) 42: 42};
+//                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
+//                                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
+//                                                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
+//                                                   ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
+//                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
+//                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
+//                                                                           ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
+//                                                                 ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
+//                                                                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
+//   <int>[for (i in <int>[1]) i];
+//              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
+//   <int>{for (i in <int>[1]) i, null};
+//              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
+// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
+// 	                   ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:246:17: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var list50 = [await for (;;) 42];
+//                 ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:247:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var set50 = {await for (;;) 42, null};
+//                ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:248:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var map50 = {await for (;;) "bar": 42, "baz": null};
+//                ^^^^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>[for (int i = 0; oracle("foo"); i++) "bar"];
+//                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
+//                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//                                                  ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//                                                         ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//                                                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+//                                                 ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+//                                                 ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
+//                                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+//                                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+//                                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                                                                             ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                                                                                            ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//                                                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//                                                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//                                                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
+//                                                                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   var list10 = [for (var i in "not iterable") i];
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   var set10 = {for (var i in "not iterable") i, null};
+//                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   var map10 = {for (var i in "not iterable") "bar": i, "baz": null};
+//                              ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var list20 = [for (int i in ["not", "int"]) i];
+//                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var list20 = [for (int i in ["not", "int"]) i];
+//                                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var set20 = {for (int i in ["not", "int"]) i, null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var set20 = {for (int i in ["not", "int"]) i, null};
+//                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
+//                               ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
+//                                      ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
+//   var list30 = [await for (var i in "not stream") i];
+//                                     ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
+//   var set30 = {await for (var i in "not stream") i, null};
+//                                    ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
+//   var map30 = {await for (var i in "not stream") "bar": i, "baz": null};
+//                                    ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
+//                                                          ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
+//                                                                 ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
+//                                                         ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
+//                                                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
+//                                                         ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
+//                                                                ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   var list60 = [for (; "not bool";) 42];
+//                        ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   var set60 = {for (; "not bool";) 42, null};
+//                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+//   var map60 = {for (; "not bool";) "bar": 42, "baz": null};
+//                       ^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:255:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <int>[await for (int i in stream) i];
+//                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:256:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <int>{await for (int i in stream) i};
+//                          ^^
+//
+// pkg/front_end/testcases/control_flow_collection_inference.dart:257:34: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <String, int>{await for (int i in stream) "bar": i};
+//                                  ^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  get foo() → core::int
+    return 42;
+}
+static method oracle<T extends core::Object = dynamic>([self::oracle::T t = null]) → dynamic
+  return true;
+static method testIfElement(dynamic dynVar, core::List<core::int> listInt, core::List<core::double> listDouble, core::Map<core::String, core::int> mapToInt, core::Map<core::String, core::double> mapToDouble) → dynamic {
+  core::List<core::int> list10 = block {
+    final core::List<core::int> #t1 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t1.{core::List::add}(42);
+  } =>#t1;
+  core::Set<core::int> set10 = block {
+    final core::Set<core::int> #t2 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t2.{core::Set::add}(42);
+    #t2.{core::Set::add}(null);
+  } =>#t2;
+  core::Map<core::String, core::int> map10 = block {
+    final core::Map<core::String, core::int> #t3 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t3.{core::Map::[]=}("bar", 42);
+    #t3.{core::Map::[]=}("baz", null);
+  } =>#t3;
+  core::List<dynamic> list11 = block {
+    final core::List<dynamic> #t4 = <dynamic>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t4.{core::List::add}(dynVar);
+  } =>#t4;
+  core::Set<dynamic> set11 = block {
+    final core::Set<dynamic> #t5 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t5.{core::Set::add}(dynVar);
+    #t5.{core::Set::add}(null);
+  } =>#t5;
+  core::Map<core::String, dynamic> map11 = block {
+    final core::Map<core::String, dynamic> #t6 = <core::String, dynamic>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t6.{core::Map::[]=}("bar", dynVar);
+    #t6.{core::Map::[]=}("baz", null);
+  } =>#t6;
+  core::List<core::List<core::int>> list12 = block {
+    final core::List<core::List<core::int>> #t7 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t7.{core::List::add}(<core::int>[42]);
+  } =>#t7;
+  core::Set<core::List<core::int>> set12 = block {
+    final core::Set<core::List<core::int>> #t8 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t8.{core::Set::add}(<core::int>[42]);
+    #t8.{core::Set::add}(null);
+  } =>#t8;
+  core::Map<core::String, core::List<core::int>> map12 = block {
+    final core::Map<core::String, core::List<core::int>> #t9 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t9.{core::Map::[]=}("bar", <core::int>[42]);
+    #t9.{core::Map::[]=}("baz", null);
+  } =>#t9;
+  core::List<core::int> list20 = block {
+    final core::List<core::int> #t10 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t11 in <core::int>[42])
+        #t10.{core::List::add}(#t11);
+  } =>#t10;
+  core::Set<core::int> set20 = block {
+    final core::Set<core::int> #t12 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t13 in <core::int>[42])
+        #t12.{core::Set::add}(#t13);
+    #t12.{core::Set::add}(null);
+  } =>#t12;
+  core::Map<core::String, core::int> map20 = block {
+    final core::Map<core::String, core::int> #t14 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::int> #t15 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
+        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
+    #t14.{core::Map::[]=}("baz", null);
+  } =>#t14;
+  core::List<dynamic> list21 = block {
+    final core::List<dynamic> #t16 = <dynamic>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t17 in <dynamic>[dynVar])
+        #t16.{core::List::add}(#t17);
+  } =>#t16;
+  core::Set<dynamic> set21 = block {
+    final core::Set<dynamic> #t18 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t19 in <dynamic>[dynVar])
+        #t18.{core::Set::add}(#t19);
+    #t18.{core::Set::add}(null);
+  } =>#t18;
+  core::Map<core::String, dynamic> map21 = block {
+    final core::Map<core::String, dynamic> #t20 = <core::String, dynamic>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, dynamic> #t21 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
+        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+    #t20.{core::Map::[]=}("baz", null);
+  } =>#t20;
+  core::List<core::List<core::int>> list22 = block {
+    final core::List<core::List<core::int>> #t22 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t23 in <core::List<core::int>>[<core::int>[42]])
+        #t22.{core::List::add}(#t23);
+  } =>#t22;
+  core::Set<core::List<core::int>> set22 = block {
+    final core::Set<core::List<core::int>> #t24 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t25 in <core::List<core::int>>[<core::int>[42]])
+        #t24.{core::Set::add}(#t25);
+    #t24.{core::Set::add}(null);
+  } =>#t24;
+  core::Map<core::String, core::List<core::int>> map22 = block {
+    final core::Map<core::String, core::List<core::int>> #t26 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::List<core::int>> #t27 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
+        #t26.{core::Map::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
+    #t26.{core::Map::[]=}("baz", null);
+  } =>#t26;
+  core::List<core::int> list30 = block {
+    final core::List<core::int> #t28 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t29 in <core::int>[42])
+          #t28.{core::List::add}(#t29);
+  } =>#t28;
+  core::Set<core::int> set30 = block {
+    final core::Set<core::int> #t30 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t31 in <core::int>[42])
+          #t30.{core::Set::add}(#t31);
+    #t30.{core::Set::add}(null);
+  } =>#t30;
+  core::Map<core::String, core::int> map30 = block {
+    final core::Map<core::String, core::int> #t32 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::int> #t33 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
+          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+    #t32.{core::Map::[]=}("baz", null);
+  } =>#t32;
+  core::List<dynamic> list31 = block {
+    final core::List<dynamic> #t34 = <dynamic>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t35 in <dynamic>[dynVar])
+          #t34.{core::List::add}(#t35);
+  } =>#t34;
+  core::Set<dynamic> set31 = block {
+    final core::Set<dynamic> #t36 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t37 in <dynamic>[dynVar])
+          #t36.{core::Set::add}(#t37);
+    #t36.{core::Set::add}(null);
+  } =>#t36;
+  core::Map<core::String, dynamic> map31 = block {
+    final core::Map<core::String, dynamic> #t38 = <core::String, dynamic>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, dynamic> #t39 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
+          #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+    #t38.{core::Map::[]=}("baz", null);
+  } =>#t38;
+  core::List<core::List<core::int>> list33 = block {
+    final core::List<core::List<core::int>> #t40 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t41 in <core::List<core::int>>[<core::int>[42]])
+          #t40.{core::List::add}(#t41);
+  } =>#t40;
+  core::Set<core::List<core::int>> set33 = block {
+    final core::Set<core::List<core::int>> #t42 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t43 in <core::List<core::int>>[<core::int>[42]])
+          #t42.{core::Set::add}(#t43);
+    #t42.{core::Set::add}(null);
+  } =>#t42;
+  core::Map<core::String, core::List<core::int>> map33 = block {
+    final core::Map<core::String, core::List<core::int>> #t44 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t45 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
+          #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
+    #t44.{core::Map::[]=}("baz", null);
+  } =>#t44;
+  core::List<core::List<core::int>> list40 = block {
+    final core::List<core::List<core::int>> #t46 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t47 in <core::List<core::int>>[<core::int>[]])
+        #t46.{core::List::add}(#t47);
+  } =>#t46;
+  core::Set<core::List<core::int>> set40 = block {
+    final core::Set<core::List<core::int>> #t48 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t49 in <core::List<core::int>>[<core::int>[]])
+        #t48.{core::Set::add}(#t49);
+    #t48.{core::Set::add}(null);
+  } =>#t48;
+  core::Map<core::String, core::List<core::int>> map40 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  Map<String, List<int>> map40 = {if (oracle(\"foo\")) ...{\"bar\", []}, \"baz\": null};
+                                 ^";
+  core::List<core::List<core::int>> list41 = block {
+    final core::List<core::List<core::int>> #t50 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t51 in let final core::Set<core::List<core::int>> #t52 = col::LinkedHashSet::•<core::List<core::int>>() in let final core::bool #t53 = #t52.{core::Set::add}(<core::int>[]) in #t52)
+        #t50.{core::List::add}(#t51);
+  } =>#t50;
+  core::Set<core::List<core::int>> set41 = block {
+    final core::Set<core::List<core::int>> #t54 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t55 in let final core::Set<core::List<core::int>> #t56 = col::LinkedHashSet::•<core::List<core::int>>() in let final core::bool #t57 = #t56.{core::Set::add}(<core::int>[]) in #t56)
+        #t54.{core::Set::add}(#t55);
+    #t54.{core::Set::add}(null);
+  } =>#t54;
+  core::List<core::List<core::int>> list42 = block {
+    final core::List<core::List<core::int>> #t58 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t59 in <core::List<core::int>>[<core::int>[]])
+          #t58.{core::List::add}(#t59);
+  } =>#t58;
+  core::Set<core::List<core::int>> set42 = block {
+    final core::Set<core::List<core::int>> #t60 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t61 in <core::List<core::int>>[<core::int>[]])
+          #t60.{core::Set::add}(#t61);
+    #t60.{core::Set::add}(null);
+  } =>#t60;
+  core::Map<core::String, core::List<core::int>> map42 = block {
+    final core::Map<core::String, core::List<core::int>> #t62 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t63 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
+    #t62.{core::Map::[]=}("baz", null);
+  } =>#t62;
+  core::List<core::int> list50 = block {
+    final core::List<core::int> #t64 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t65 in <core::int>[])
+        #t64.{core::List::add}(#t65);
+  } =>#t64;
+  core::Set<core::int> set50 = block {
+    final core::Set<core::int> #t66 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t67 in <core::int>[])
+        #t66.{core::Set::add}(#t67);
+    #t66.{core::Set::add}(null);
+  } =>#t66;
+  core::Map<core::String, core::int> map50 = block {
+    final core::Map<core::String, core::int> #t68 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::int> #t69 in <core::String, core::int>{}.{core::Map::entries})
+        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+    #t68.{core::Map::[]=}("baz", null);
+  } =>#t68;
+  core::List<core::int> list51 = block {
+    final core::List<core::int> #t70 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t71 in let final core::Set<core::int> #t72 = col::LinkedHashSet::•<core::int>() in #t72)
+        #t70.{core::List::add}(#t71);
+  } =>#t70;
+  core::Set<core::int> set51 = block {
+    final core::Set<core::int> #t73 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t74 in let final core::Set<core::int> #t75 = col::LinkedHashSet::•<core::int>() in #t75)
+        #t73.{core::Set::add}(#t74);
+    #t73.{core::Set::add}(null);
+  } =>#t73;
+  core::List<core::int> list52 = block {
+    final core::List<core::int> #t76 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t77 in <core::int>[])
+          #t76.{core::List::add}(#t77);
+  } =>#t76;
+  core::Set<core::int> set52 = block {
+    final core::Set<core::int> #t78 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t79 in <core::int>[])
+          #t78.{core::Set::add}(#t79);
+    #t78.{core::Set::add}(null);
+  } =>#t78;
+  core::Map<core::String, core::int> map52 = block {
+    final core::Map<core::String, core::int> #t80 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::int> #t81 in <core::String, core::int>{}.{core::Map::entries})
+          #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
+    #t80.{core::Map::[]=}("baz", null);
+  } =>#t80;
+  core::List<core::List<core::int>> list60 = block {
+    final core::List<core::List<core::int>> #t82 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t83 in <core::List<core::int>>[<core::int>[]])
+        #t82.{core::List::add}(#t83);
+  } =>#t82;
+  core::Set<core::List<core::int>> set60 = block {
+    final core::Set<core::List<core::int>> #t84 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::List<core::int> #t85 in <core::List<core::int>>[<core::int>[]])
+        #t84.{core::Set::add}(#t85);
+    #t84.{core::Set::add}(null);
+  } =>#t84;
+  core::Map<core::String, core::List<core::int>> map60 = block {
+    final core::Map<core::String, core::List<core::int>> #t86 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::List<core::int>> #t87 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+    #t86.{core::Map::[]=}("baz", null);
+  } =>#t86;
+  core::List<core::List<core::int>> list61 = block {
+    final core::List<core::List<core::int>> #t88 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t89 in <core::List<core::int>>[<core::int>[]])
+          #t88.{core::List::add}(#t89);
+  } =>#t88;
+  core::Set<core::List<core::int>> set61 = block {
+    final core::Set<core::List<core::int>> #t90 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t91 in <core::List<core::int>>[<core::int>[]])
+          #t90.{core::Set::add}(#t91);
+    #t90.{core::Set::add}(null);
+  } =>#t90;
+  core::Map<core::String, core::List<core::int>> map61 = block {
+    final core::Map<core::String, core::List<core::int>> #t92 = <core::String, core::List<core::int>>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t93 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+          #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
+    #t92.{core::Map::[]=}("baz", null);
+  } =>#t92;
+  core::List<core::List<core::int>> list70 = block {
+    final core::List<core::List<core::int>> #t94 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t94.{core::List::add}(<core::int>[]);
+  } =>#t94;
+  core::Set<core::List<core::int>> set70 = block {
+    final core::Set<core::List<core::int>> #t95 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t95.{core::Set::add}(<core::int>[]);
+    #t95.{core::Set::add}(null);
+  } =>#t95;
+  core::List<core::List<core::int>> list71 = block {
+    final core::List<core::List<core::int>> #t96 = <core::List<core::int>>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t96.{core::List::add}(<core::int>[]);
+  } =>#t96;
+  core::Set<core::List<core::int>> set71 = block {
+    final core::Set<core::List<core::int>> #t97 = col::LinkedHashSet::•<core::List<core::int>>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t97.{core::Set::add}(<core::int>[]);
+    #t97.{core::Set::add}(null);
+  } =>#t97;
+  core::List<core::num> list80 = block {
+    final core::List<core::num> #t98 = <core::num>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t98.{core::List::add}(42);
+    else
+      #t98.{core::List::add}(3.14);
+  } =>#t98;
+  core::Set<core::num> set80 = block {
+    final core::Set<core::num> #t99 = col::LinkedHashSet::•<core::num>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t99.{core::Set::add}(42);
+    else
+      #t99.{core::Set::add}(3.14);
+    #t99.{core::Set::add}(null);
+  } =>#t99;
+  core::Map<core::String, core::num> map80 = block {
+    final core::Map<core::String, core::num> #t100 = <core::String, core::num>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t100.{core::Map::[]=}("bar", 42);
+    else
+      #t100.{core::Map::[]=}("bar", 3.14);
+    #t100.{core::Map::[]=}("baz", null);
+  } =>#t100;
+  core::List<core::num> list81 = block {
+    final core::List<core::num> #t101 = <core::num>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::num #t102 in listInt)
+        #t101.{core::List::add}(#t102);
+    else
+      for (final core::num #t103 in listDouble)
+        #t101.{core::List::add}(#t103);
+  } =>#t101;
+  core::Set<core::num> set81 = block {
+    final core::Set<core::num> #t104 = col::LinkedHashSet::•<core::num>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::num #t105 in listInt)
+        #t104.{core::Set::add}(#t105);
+    else
+      for (final core::num #t106 in listDouble)
+        #t104.{core::Set::add}(#t106);
+    #t104.{core::Set::add}(null);
+  } =>#t104;
+  core::Map<core::String, core::num> map81 = block {
+    final core::Map<core::String, core::num> #t107 = <core::String, core::num>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::num> #t108 in mapToInt.{core::Map::entries})
+        #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{core::MapEntry::value});
+    else
+      for (final core::MapEntry<core::String, core::num> #t109 in mapToDouble.{core::Map::entries})
+        #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
+    #t107.{core::Map::[]=}("baz", null);
+  } =>#t107;
+  core::List<dynamic> list82 = block {
+    final core::List<dynamic> #t110 = <dynamic>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t111 in listInt)
+        #t110.{core::List::add}(#t111);
+    else
+      for (final dynamic #t112 in dynVar as{TypeError} core::Iterable<dynamic>)
+        #t110.{core::List::add}(#t112);
+  } =>#t110;
+  core::Set<dynamic> set82 = block {
+    final core::Set<dynamic> #t113 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t114 in listInt)
+        #t113.{core::Set::add}(#t114);
+    else
+      for (final dynamic #t115 in dynVar as{TypeError} core::Iterable<dynamic>)
+        #t113.{core::Set::add}(#t115);
+    #t113.{core::Set::add}(null);
+  } =>#t113;
+  core::Set<dynamic> map82 = block {
+    final core::Set<dynamic> #t116 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  var map82 = {if (oracle(\"foo\")) ...mapToInt else ...dynVar, null};
+                                     ^");
+    else
+      for (final dynamic #t117 in dynVar as{TypeError} core::Iterable<dynamic>)
+        #t116.{core::Set::add}(#t117);
+    #t116.{core::Set::add}(null);
+  } =>#t116;
+  core::List<core::num> list83 = block {
+    final core::List<core::num> #t118 = <core::num>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t118.{core::List::add}(42);
+    else
+      for (final core::num #t119 in listDouble)
+        #t118.{core::List::add}(#t119);
+  } =>#t118;
+  core::Set<core::num> set83 = block {
+    final core::Set<core::num> #t120 = col::LinkedHashSet::•<core::num>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::num #t121 in listInt)
+        #t120.{core::Set::add}(#t121);
+    else
+      #t120.{core::Set::add}(3.14);
+    #t120.{core::Set::add}(null);
+  } =>#t120;
+  core::Map<core::String, core::num> map83 = block {
+    final core::Map<core::String, core::num> #t122 = <core::String, core::num>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::num> #t123 in mapToInt.{core::Map::entries})
+        #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
+    else
+      #t122.{core::Map::[]=}("bar", 3.14);
+    #t122.{core::Map::[]=}("baz", null);
+  } =>#t122;
+  core::List<core::int> list90 = block {
+    final core::List<core::int> #t124 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t124.{core::List::add}(dynVar as{TypeError} core::int);
+  } =>#t124;
+  core::Set<core::int> set90 = block {
+    final core::Set<core::int> #t125 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t125.{core::Set::add}(dynVar as{TypeError} core::int);
+    #t125.{core::Set::add}(null);
+  } =>#t125;
+  core::Map<core::String, core::int> map90 = block {
+    final core::Map<core::String, core::int> #t126 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t126.{core::Map::[]=}("bar", dynVar as{TypeError} core::int);
+    #t126.{core::Map::[]=}("baz", null);
+  } =>#t126;
+  core::List<core::int> list91 = block {
+    final core::List<core::int> #t127 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t128 in dynVar as{TypeError} core::Iterable<dynamic>) {
+        final core::int #t129 = #t128 as{TypeError} core::int;
+        #t127.{core::List::add}(#t129);
+      }
+  } =>#t127;
+  core::Set<core::int> set91 = block {
+    final core::Set<core::int> #t130 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final dynamic #t131 in dynVar as{TypeError} core::Iterable<dynamic>) {
+        final core::int #t132 = #t131 as{TypeError} core::int;
+        #t130.{core::Set::add}(#t132);
+      }
+    #t130.{core::Set::add}(null);
+  } =>#t130;
+  core::Map<core::String, core::int> map91 = block {
+    final core::Map<core::String, core::int> #t133 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<dynamic, dynamic> #t134 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
+        final core::String #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String;
+        final core::int #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int;
+        #t133.{core::Map::[]=}(#t135, #t136);
+      }
+    #t133.{core::Map::[]=}("baz", null);
+  } =>#t133;
+  core::List<core::int> list100 = block {
+    final core::List<core::int> #t137 = <core::int>[];
+    if(dynVar as{TypeError} core::bool)
+      #t137.{core::List::add}(42);
+  } =>#t137;
+  core::Set<core::int> set100 = block {
+    final core::Set<core::int> #t138 = col::LinkedHashSet::•<core::int>();
+    if(dynVar as{TypeError} core::bool)
+      #t138.{core::Set::add}(42);
+  } =>#t138;
+  core::Map<core::int, core::int> map100 = block {
+    final core::Map<core::int, core::int> #t139 = <core::int, core::int>{};
+    if(dynVar as{TypeError} core::bool)
+      #t139.{core::Map::[]=}(42, 42);
+  } =>#t139;
+}
+static method testIfElementErrors(core::Map<core::int, core::int> map) → dynamic {
+  block {
+    final core::List<core::int> #t140 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t140.{core::List::add}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[if (oracle(\"foo\")) \"bar\"];
+                           ^" in "bar" as{TypeError} core::int);
+  } =>#t140;
+  block {
+    final core::Set<core::int> #t142 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{if (oracle(\"foo\")) \"bar\", null};
+                           ^" in "bar" as{TypeError} core::int);
+    #t142.{core::Set::add}(null);
+  } =>#t142;
+  block {
+    final core::Map<core::String, core::int> #t144 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
+                                          ^" in "bar" as{TypeError} core::int);
+    #t144.{core::Map::[]=}("baz", null);
+  } =>#t144;
+  block {
+    final core::List<core::int> #t146 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t147 in <core::int>[let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[if (oracle(\"foo\")) ...[\"bar\"]];
+                               ^" in "bar" as{TypeError} core::int])
+        #t146.{core::List::add}(#t147);
+  } =>#t146;
+  block {
+    final core::Set<core::int> #t149 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::int #t150 in <core::int>[let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
+                               ^" in "bar" as{TypeError} core::int])
+        #t149.{core::Set::add}(#t150);
+    #t149.{core::Set::add}(null);
+  } =>#t149;
+  block {
+    final core::Map<core::String, core::int> #t152 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      for (final core::MapEntry<core::String, core::int> #t153 in <core::String, core::int>{"bar": let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                              ^" in "bar" as{TypeError} core::int}.{core::Map::entries})
+        #t152.{core::Map::[]=}(#t153.{core::MapEntry::key}, #t153.{core::MapEntry::value});
+    #t152.{core::Map::[]=}("baz", null);
+  } =>#t152;
+  block {
+    final core::List<core::int> #t155 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t155.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[if (oracle(\"foo\")) ...map];
+                              ^");
+  } =>#t155;
+  block {
+    final core::Set<core::int> #t156 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{if (oracle(\"foo\")) ...map, null};
+                              ^");
+    #t156.{core::Set::add}(null);
+  } =>#t156;
+  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
+                                      ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
+                                      ^": null};
+  block {
+    final core::List<core::String> #t157 = <core::String>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t157.{core::List::add}(let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[if (oracle(\"foo\")) 42 else 3.14];
+                              ^" in 42 as{TypeError} core::String);
+    else
+      #t157.{core::List::add}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[if (oracle(\"foo\")) 42 else 3.14];
+                                      ^" in 3.14 as{TypeError} core::String);
+  } =>#t157;
+  block {
+    final core::Set<core::String> #t160 = col::LinkedHashSet::•<core::String>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
+                              ^" in 42 as{TypeError} core::String);
+    else
+      #t160.{core::Set::add}(let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
+                                      ^" in 3.14 as{TypeError} core::String);
+    #t160.{core::Set::add}(null);
+  } =>#t160;
+  block {
+    final core::Map<core::String, core::String> #t163 = <core::String, core::String>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
+                                             ^" in 42 as{TypeError} core::String);
+    else
+      #t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
+                                                            ^" in 3.14 as{TypeError} core::String);
+    #t163.{core::Map::[]=}("baz", null);
+  } =>#t163;
+  block {
+    final core::List<core::int> #t166 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t166.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[if (oracle(\"foo\")) ...map else 42];
+                              ^");
+    else
+      #t166.{core::List::add}(42);
+  } =>#t166;
+  block {
+    final core::Set<core::int> #t167 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{if (oracle(\"foo\")) ...map else 42, null};
+                              ^");
+    else
+      #t167.{core::Set::add}(42);
+    #t167.{core::Set::add}(null);
+  } =>#t167;
+  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
+                                      ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
+                                      ^": null};
+  block {
+    final core::List<core::int> #t168 = <core::int>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t168.{core::List::add}(42);
+    else
+      #t168.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[if (oracle(\"foo\")) 42 else ...map];
+                                      ^");
+  } =>#t168;
+  block {
+    final core::Set<core::int> #t169 = col::LinkedHashSet::•<core::int>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{if (oracle(\"foo\")) ...map else 42, null};
+                              ^");
+    else
+      #t169.{core::Set::add}(42);
+    #t169.{core::Set::add}(null);
+  } =>#t169;
+  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
+                                                     ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
+                                                     ^": null};
+  core::Set<dynamic> set10 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:106:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  Set<dynamic> set10 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
+                       ^";
+  core::Map<dynamic, dynamic> map10 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:107:53: Error: Expected ':' after this.
+  Map<dynamic, dynamic> map10 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
+                                                    ^": null};
+  core::Set<dynamic> set11 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:108:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  Set<dynamic> set11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
+                       ^";
+  core::Map<dynamic, dynamic> map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
+  Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
+                                                                     ^": null};
+  core::Map<<BottomType>, core::Null> map12 = <<BottomType>, core::Null>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
+  var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
+                                  ^": null};
+  core::Map<<BottomType>, core::Null> map13 = <<BottomType>, core::Null>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
+  var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
+                                                   ^": null};
+  core::List<core::int> list20 = block {
+    final core::List<core::int> #t170 = <core::int>[];
+    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  List<int> list20 = [if (42) 42];
+                          ^" in 42 as{TypeError} core::bool)
+      #t170.{core::List::add}(42);
+  } =>#t170;
+  core::Set<core::int> set20 = block {
+    final core::Set<core::int> #t172 = col::LinkedHashSet::•<core::int>();
+    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  Set<int> set20 = {if (42) 42};
+                        ^" in 42 as{TypeError} core::bool)
+      #t172.{core::Set::add}(42);
+  } =>#t172;
+  core::Map<core::int, core::int> map30 = block {
+    final core::Map<core::int, core::int> #t174 = <core::int, core::int>{};
+    if(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  Map<int, int> map30 = {if (42) 42: 42};
+                             ^" in 42 as{TypeError} core::bool)
+      #t174.{core::Map::[]=}(42, 42);
+  } =>#t174;
+  core::List<core::String> list40 = block {
+    final core::List<core::String> #t176 = <core::String>[];
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t176.{core::List::add}(let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
+                                                    ^" in true as{TypeError} core::String);
+    else
+      #t176.{core::List::add}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
+                                                              ^" in 42 as{TypeError} core::String);
+  } =>#t176;
+  core::Set<core::String> set40 = block {
+    final core::Set<core::String> #t179 = col::LinkedHashSet::•<core::String>();
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
+                                                  ^" in true as{TypeError} core::String);
+    else
+      #t179.{core::Set::add}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
+                                                            ^" in 42 as{TypeError} core::String);
+  } =>#t179;
+  core::Map<core::String, core::int> map40 = block {
+    final core::Map<core::String, core::int> #t182 = <core::String, core::int>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t182.{core::Map::[]=}(let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
+                                                            ^" in true as{TypeError} core::String, 42);
+    else
+      #t182.{core::Map::[]=}(let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
+                                                                          ^" in 42 as{TypeError} core::String, 42);
+  } =>#t182;
+  core::Map<core::int, core::String> map41 = block {
+    final core::Map<core::int, core::String> #t185 = <core::int, core::String>{};
+    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
+      #t185.{core::Map::[]=}(42, let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
+                                                                ^" in true as{TypeError} core::String);
+    else
+      #t185.{core::Map::[]=}(42, let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
+                                                                              ^" in 42 as{TypeError} core::String);
+  } =>#t185;
+}
+static method testForElement(dynamic dynVar, core::List<core::int> listInt, core::List<core::double> listDouble, core::int index, core::Map<core::String, core::int> mapStringInt, core::Map<core::String, core::double> mapStringDouble) → dynamic {
+  core::List<core::int> list10 = block {
+    final core::List<core::int> #t188 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t188.{core::List::add}(42);
+  } =>#t188;
+  core::Set<core::int> set10 = block {
+    final core::Set<core::int> #t189 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t189.{core::Set::add}(42);
+    #t189.{core::Set::add}(null);
+  } =>#t189;
+  core::Map<core::String, core::int> map10 = block {
+    final core::Map<core::String, core::int> #t190 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t190.{core::Map::[]=}("bar", 42);
+    #t190.{core::Map::[]=}("baz", null);
+  } =>#t190;
+  core::List<dynamic> list11 = block {
+    final core::List<dynamic> #t191 = <dynamic>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t191.{core::List::add}(dynVar);
+  } =>#t191;
+  core::Set<dynamic> set11 = block {
+    final core::Set<dynamic> #t192 = col::LinkedHashSet::•<dynamic>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t192.{core::Set::add}(dynVar);
+    #t192.{core::Set::add}(null);
+  } =>#t192;
+  core::Map<core::String, dynamic> map11 = block {
+    final core::Map<core::String, dynamic> #t193 = <core::String, dynamic>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t193.{core::Map::[]=}("bar", dynVar);
+    #t193.{core::Map::[]=}("baz", null);
+  } =>#t193;
+  core::List<core::List<core::int>> list12 = block {
+    final core::List<core::List<core::int>> #t194 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t194.{core::List::add}(<core::int>[42]);
+  } =>#t194;
+  core::Set<core::List<core::int>> set12 = block {
+    final core::Set<core::List<core::int>> #t195 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t195.{core::Set::add}(<core::int>[42]);
+    #t195.{core::Set::add}(null);
+  } =>#t195;
+  core::Map<core::String, core::List<core::int>> map12 = block {
+    final core::Map<core::String, core::List<core::int>> #t196 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t196.{core::Map::[]=}("bar", <core::int>[42]);
+    #t196.{core::Map::[]=}("baz", null);
+  } =>#t196;
+  core::List<core::int> list20 = block {
+    final core::List<core::int> #t197 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t198 in <core::int>[42])
+        #t197.{core::List::add}(#t198);
+  } =>#t197;
+  core::Set<core::int> set20 = block {
+    final core::Set<core::int> #t199 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t200 in <core::int>[42])
+        #t199.{core::Set::add}(#t200);
+    #t199.{core::Set::add}(null);
+  } =>#t199;
+  core::Map<core::String, core::int> map20 = block {
+    final core::Map<core::String, core::int> #t201 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, core::int> #t202 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
+        #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
+    #t201.{core::Map::[]=}("baz", null);
+  } =>#t201;
+  core::List<dynamic> list21 = block {
+    final core::List<dynamic> #t203 = <dynamic>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final dynamic #t204 in <dynamic>[dynVar])
+        #t203.{core::List::add}(#t204);
+  } =>#t203;
+  core::Set<dynamic> set21 = block {
+    final core::Set<dynamic> #t205 = col::LinkedHashSet::•<dynamic>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final dynamic #t206 in <dynamic>[dynVar])
+        #t205.{core::Set::add}(#t206);
+    #t205.{core::Set::add}(null);
+  } =>#t205;
+  core::Map<core::String, dynamic> map21 = block {
+    final core::Map<core::String, dynamic> #t207 = <core::String, dynamic>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, dynamic> #t208 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
+        #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
+    #t207.{core::Map::[]=}("baz", null);
+  } =>#t207;
+  core::List<core::List<core::int>> list22 = block {
+    final core::List<core::List<core::int>> #t209 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t210 in <core::List<core::int>>[<core::int>[42]])
+        #t209.{core::List::add}(#t210);
+  } =>#t209;
+  core::Set<core::List<core::int>> set22 = block {
+    final core::Set<core::List<core::int>> #t211 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t212 in <core::List<core::int>>[<core::int>[42]])
+        #t211.{core::Set::add}(#t212);
+    #t211.{core::Set::add}(null);
+  } =>#t211;
+  core::Map<core::String, core::List<core::int>> map22 = block {
+    final core::Map<core::String, core::List<core::int>> #t213 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, core::List<core::int>> #t214 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
+        #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
+    #t213.{core::Map::[]=}("baz", null);
+  } =>#t213;
+  core::List<core::int> list30 = block {
+    final core::List<core::int> #t215 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t216 in <core::int>[42])
+          #t215.{core::List::add}(#t216);
+  } =>#t215;
+  core::Set<core::int> set30 = block {
+    final core::Set<core::int> #t217 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t218 in <core::int>[42])
+          #t217.{core::Set::add}(#t218);
+    #t217.{core::Set::add}(null);
+  } =>#t217;
+  core::Map<core::String, core::int> map30 = block {
+    final core::Map<core::String, core::int> #t219 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::int> #t220 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
+          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
+    #t219.{core::Map::[]=}("baz", null);
+  } =>#t219;
+  core::List<dynamic> list31 = block {
+    final core::List<dynamic> #t221 = <dynamic>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t222 in <dynamic>[dynVar])
+          #t221.{core::List::add}(#t222);
+  } =>#t221;
+  core::Set<dynamic> set31 = block {
+    final core::Set<dynamic> #t223 = col::LinkedHashSet::•<dynamic>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t224 in <dynamic>[dynVar])
+          #t223.{core::Set::add}(#t224);
+    #t223.{core::Set::add}(null);
+  } =>#t223;
+  core::Map<core::String, dynamic> map31 = block {
+    final core::Map<core::String, dynamic> #t225 = <core::String, dynamic>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, dynamic> #t226 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
+          #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
+    #t225.{core::Map::[]=}("baz", null);
+  } =>#t225;
+  core::List<core::List<core::int>> list33 = block {
+    final core::List<core::List<core::int>> #t227 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t228 in <core::List<core::int>>[<core::int>[42]])
+          #t227.{core::List::add}(#t228);
+  } =>#t227;
+  core::Set<core::List<core::int>> set33 = block {
+    final core::Set<core::List<core::int>> #t229 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t230 in <core::List<core::int>>[<core::int>[42]])
+          #t229.{core::Set::add}(#t230);
+    #t229.{core::Set::add}(null);
+  } =>#t229;
+  core::Map<core::String, core::List<core::int>> map33 = block {
+    final core::Map<core::String, core::List<core::int>> #t231 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t232 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
+          #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
+    #t231.{core::Map::[]=}("baz", null);
+  } =>#t231;
+  core::List<core::List<core::int>> list40 = block {
+    final core::List<core::List<core::int>> #t233 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t234 in <core::List<core::int>>[<core::int>[]])
+        #t233.{core::List::add}(#t234);
+  } =>#t233;
+  core::Set<core::List<core::int>> set40 = block {
+    final core::Set<core::List<core::int>> #t235 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t236 in <core::List<core::int>>[<core::int>[]])
+        #t235.{core::Set::add}(#t236);
+    #t235.{core::Set::add}(null);
+  } =>#t235;
+  core::Map<core::String, core::List<core::int>> map40 = block {
+    final core::Map<core::String, core::List<core::int>> #t237 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, core::List<core::int>> #t238 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+        #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
+    #t237.{core::Map::[]=}("baz", null);
+  } =>#t237;
+  core::List<core::List<core::int>> list41 = block {
+    final core::List<core::List<core::int>> #t239 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t240 in let final core::Set<core::List<core::int>> #t241 = col::LinkedHashSet::•<core::List<core::int>>() in let final core::bool #t242 = #t241.{core::Set::add}(<core::int>[]) in #t241)
+        #t239.{core::List::add}(#t240);
+  } =>#t239;
+  core::Set<core::List<core::int>> set41 = block {
+    final core::Set<core::List<core::int>> #t243 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t244 in let final core::Set<core::List<core::int>> #t245 = col::LinkedHashSet::•<core::List<core::int>>() in let final core::bool #t246 = #t245.{core::Set::add}(<core::int>[]) in #t245)
+        #t243.{core::Set::add}(#t244);
+    #t243.{core::Set::add}(null);
+  } =>#t243;
+  core::List<core::List<core::int>> list42 = block {
+    final core::List<core::List<core::int>> #t247 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t248 in <core::List<core::int>>[<core::int>[]])
+          #t247.{core::List::add}(#t248);
+  } =>#t247;
+  core::Set<core::List<core::int>> set42 = block {
+    final core::Set<core::List<core::int>> #t249 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t250 in <core::List<core::int>>[<core::int>[]])
+          #t249.{core::Set::add}(#t250);
+    #t249.{core::Set::add}(null);
+  } =>#t249;
+  core::Map<core::String, core::List<core::int>> map42 = block {
+    final core::Map<core::String, core::List<core::int>> #t251 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t252 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+          #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
+    #t251.{core::Map::[]=}("baz", null);
+  } =>#t251;
+  core::List<core::int> list50 = block {
+    final core::List<core::int> #t253 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t254 in <core::int>[])
+        #t253.{core::List::add}(#t254);
+  } =>#t253;
+  core::Set<core::int> set50 = block {
+    final core::Set<core::int> #t255 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t256 in <core::int>[])
+        #t255.{core::Set::add}(#t256);
+    #t255.{core::Set::add}(null);
+  } =>#t255;
+  core::Map<core::String, core::int> map50 = block {
+    final core::Map<core::String, core::int> #t257 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, core::int> #t258 in <core::String, core::int>{}.{core::Map::entries})
+        #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
+    #t257.{core::Map::[]=}("baz", null);
+  } =>#t257;
+  core::List<core::int> list51 = block {
+    final core::List<core::int> #t259 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t260 in let final core::Set<core::int> #t261 = col::LinkedHashSet::•<core::int>() in #t261)
+        #t259.{core::List::add}(#t260);
+  } =>#t259;
+  core::Set<core::int> set51 = block {
+    final core::Set<core::int> #t262 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::int #t263 in let final core::Set<core::int> #t264 = col::LinkedHashSet::•<core::int>() in #t264)
+        #t262.{core::Set::add}(#t263);
+    #t262.{core::Set::add}(null);
+  } =>#t262;
+  core::List<core::int> list52 = block {
+    final core::List<core::int> #t265 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t266 in <core::int>[])
+          #t265.{core::List::add}(#t266);
+  } =>#t265;
+  core::Set<core::int> set52 = block {
+    final core::Set<core::int> #t267 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::int #t268 in <core::int>[])
+          #t267.{core::Set::add}(#t268);
+    #t267.{core::Set::add}(null);
+  } =>#t267;
+  core::List<core::List<core::int>> list60 = block {
+    final core::List<core::List<core::int>> #t269 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t270 in <core::List<core::int>>[<core::int>[]])
+        #t269.{core::List::add}(#t270);
+  } =>#t269;
+  core::Set<core::List<core::int>> set60 = block {
+    final core::Set<core::List<core::int>> #t271 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::List<core::int> #t272 in <core::List<core::int>>[<core::int>[]])
+        #t271.{core::Set::add}(#t272);
+    #t271.{core::Set::add}(null);
+  } =>#t271;
+  core::Map<core::String, core::List<core::int>> map60 = block {
+    final core::Map<core::String, core::List<core::int>> #t273 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String, core::List<core::int>> #t274 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+        #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
+    #t273.{core::Map::[]=}("baz", null);
+  } =>#t273;
+  core::List<core::List<core::int>> list61 = block {
+    final core::List<core::List<core::int>> #t275 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t276 in <core::List<core::int>>[<core::int>[]])
+          #t275.{core::List::add}(#t276);
+  } =>#t275;
+  core::Set<core::List<core::int>> set61 = block {
+    final core::Set<core::List<core::int>> #t277 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::List<core::int> #t278 in <core::List<core::int>>[<core::int>[]])
+          #t277.{core::Set::add}(#t278);
+    #t277.{core::Set::add}(null);
+  } =>#t277;
+  core::Map<core::String, core::List<core::int>> map61 = block {
+    final core::Map<core::String, core::List<core::int>> #t279 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::List<core::int>> #t280 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
+          #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
+    #t279.{core::Map::[]=}("baz", null);
+  } =>#t279;
+  core::List<core::List<core::int>> list70 = block {
+    final core::List<core::List<core::int>> #t281 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t281.{core::List::add}(<core::int>[]);
+  } =>#t281;
+  core::Set<core::List<core::int>> set70 = block {
+    final core::Set<core::List<core::int>> #t282 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t282.{core::Set::add}(<core::int>[]);
+    #t282.{core::Set::add}(null);
+  } =>#t282;
+  core::Map<core::String, core::List<core::int>> map70 = block {
+    final core::Map<core::String, core::List<core::int>> #t283 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t283.{core::Map::[]=}("bar", <core::int>[]);
+    #t283.{core::Map::[]=}("baz", null);
+  } =>#t283;
+  core::List<core::List<core::int>> list71 = block {
+    final core::List<core::List<core::int>> #t284 = <core::List<core::int>>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t284.{core::List::add}(<core::int>[]);
+  } =>#t284;
+  core::Set<core::List<core::int>> set71 = block {
+    final core::Set<core::List<core::int>> #t285 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t285.{core::Set::add}(<core::int>[]);
+    #t285.{core::Set::add}(null);
+  } =>#t285;
+  core::Map<core::String, core::List<core::int>> map71 = block {
+    final core::Map<core::String, core::List<core::int>> #t286 = <core::String, core::List<core::int>>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t286.{core::Map::[]=}("bar", <core::int>[]);
+    #t286.{core::Map::[]=}("baz", null);
+  } =>#t286;
+  core::List<core::num> list80 = block {
+    final core::List<core::num> #t287 = <core::num>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t287.{core::List::add}(42);
+      else
+        #t287.{core::List::add}(3.14);
+  } =>#t287;
+  core::Set<core::num> set80 = block {
+    final core::Set<core::num> #t288 = col::LinkedHashSet::•<core::num>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t288.{core::Set::add}(42);
+      else
+        #t288.{core::Set::add}(3.14);
+    #t288.{core::Set::add}(null);
+  } =>#t288;
+  core::Map<core::String, core::num> map80 = block {
+    final core::Map<core::String, core::num> #t289 = <core::String, core::num>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t289.{core::Map::[]=}("bar", 42);
+      else
+        #t289.{core::Map::[]=}("bar", 3.14);
+    #t289.{core::Map::[]=}("baz", null);
+  } =>#t289;
+  core::List<core::num> list81 = block {
+    final core::List<core::num> #t290 = <core::num>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::num #t291 in listInt)
+          #t290.{core::List::add}(#t291);
+      else
+        for (final core::num #t292 in listDouble)
+          #t290.{core::List::add}(#t292);
+  } =>#t290;
+  core::Set<core::num> set81 = block {
+    final core::Set<core::num> #t293 = col::LinkedHashSet::•<core::num>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::num #t294 in listInt)
+          #t293.{core::Set::add}(#t294);
+      else
+        for (final core::num #t295 in listDouble)
+          #t293.{core::Set::add}(#t295);
+    #t293.{core::Set::add}(null);
+  } =>#t293;
+  core::Map<core::String, core::num> map81 = block {
+    final core::Map<core::String, core::num> #t296 = <core::String, core::num>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::num> #t297 in mapStringInt.{core::Map::entries})
+          #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{core::MapEntry::value});
+      else
+        for (final core::MapEntry<core::String, core::num> #t298 in mapStringDouble.{core::Map::entries})
+          #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
+    #t296.{core::Map::[]=}("baz", null);
+  } =>#t296;
+  core::List<dynamic> list82 = block {
+    final core::List<dynamic> #t299 = <dynamic>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t300 in listInt)
+          #t299.{core::List::add}(#t300);
+      else
+        for (final dynamic #t301 in dynVar as{TypeError} core::Iterable<dynamic>)
+          #t299.{core::List::add}(#t301);
+  } =>#t299;
+  core::Set<dynamic> set82 = block {
+    final core::Set<dynamic> #t302 = col::LinkedHashSet::•<dynamic>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final dynamic #t303 in listInt)
+          #t302.{core::Set::add}(#t303);
+      else
+        for (final dynamic #t304 in dynVar as{TypeError} core::Iterable<dynamic>)
+          #t302.{core::Set::add}(#t304);
+    #t302.{core::Set::add}(null);
+  } =>#t302;
+  core::Map<dynamic, dynamic> map82 = block {
+    final core::Map<dynamic, dynamic> #t305 = <dynamic, dynamic>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<dynamic, dynamic> #t306 in mapStringInt.{core::Map::entries})
+          #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{core::MapEntry::value});
+      else
+        for (final core::MapEntry<dynamic, dynamic> #t307 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries})
+          #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
+    #t305.{core::Map::[]=}("baz", null);
+  } =>#t305;
+  core::List<core::num> list83 = block {
+    final core::List<core::num> #t308 = <core::num>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        #t308.{core::List::add}(42);
+      else
+        for (final core::num #t309 in listDouble)
+          #t308.{core::List::add}(#t309);
+  } =>#t308;
+  core::Set<core::num> set83 = block {
+    final core::Set<core::num> #t310 = col::LinkedHashSet::•<core::num>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::num #t311 in listInt)
+          #t310.{core::Set::add}(#t311);
+      else
+        #t310.{core::Set::add}(3.14);
+    #t310.{core::Set::add}(null);
+  } =>#t310;
+  core::Map<core::String, core::num> map83 = block {
+    final core::Map<core::String, core::num> #t312 = <core::String, core::num>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool)
+        for (final core::MapEntry<core::String, core::num> #t313 in mapStringInt.{core::Map::entries})
+          #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
+      else
+        #t312.{core::Map::[]=}("bar", 3.14);
+    #t312.{core::Map::[]=}("baz", null);
+  } =>#t312;
+  core::List<core::int> list90 = block {
+    final core::List<core::int> #t314 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t314.{core::List::add}(dynVar as{TypeError} core::int);
+  } =>#t314;
+  core::Set<core::int> set90 = block {
+    final core::Set<core::int> #t315 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t315.{core::Set::add}(dynVar as{TypeError} core::int);
+    #t315.{core::Set::add}(null);
+  } =>#t315;
+  core::Map<core::String, core::int> map90 = block {
+    final core::Map<core::String, core::int> #t316 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      #t316.{core::Map::[]=}("bar", dynVar as{TypeError} core::int);
+    #t316.{core::Map::[]=}("baz", null);
+  } =>#t316;
+  core::List<core::int> list91 = block {
+    final core::List<core::int> #t317 = <core::int>[];
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final dynamic #t318 in dynVar as{TypeError} core::Iterable<dynamic>) {
+        final core::int #t319 = #t318 as{TypeError} core::int;
+        #t317.{core::List::add}(#t319);
+      }
+  } =>#t317;
+  core::Set<core::int> set91 = block {
+    final core::Set<core::int> #t320 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final dynamic #t321 in dynVar as{TypeError} core::Iterable<dynamic>) {
+        final core::int #t322 = #t321 as{TypeError} core::int;
+        #t320.{core::Set::add}(#t322);
+      }
+    #t320.{core::Set::add}(null);
+  } =>#t320;
+  core::Map<core::String, core::int> map91 = block {
+    final core::Map<core::String, core::int> #t323 = <core::String, core::int>{};
+    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+      for (final core::MapEntry<dynamic, dynamic> #t324 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
+        final core::String #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String;
+        final core::int #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int;
+        #t323.{core::Map::[]=}(#t325, #t326);
+      }
+    #t323.{core::Map::[]=}("baz", null);
+  } =>#t323;
+  core::List<core::int> list100 = block {
+    final core::List<core::int> #t327 = <core::int>[];
+    for (final core::int #t328 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
+      #t327.{core::List::add}(42);
+  } =>#t327;
+  core::Set<core::int> set100 = block {
+    final core::Set<core::int> #t329 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t330 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
+      #t329.{core::Set::add}(42);
+  } =>#t329;
+  core::Map<core::String, core::int> map100 = block {
+    final core::Map<core::String, core::int> #t331 = <core::String, core::int>{};
+    for (final core::int #t332 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
+      #t331.{core::Map::[]=}("bar", 42);
+  } =>#t331;
+  core::List<core::int> list110 = block {
+    final core::List<core::int> #t333 = <core::int>[];
+    for (core::int i in <core::int>[1, 2, 3])
+      #t333.{core::List::add}(i);
+  } =>#t333;
+  core::Set<core::int> set110 = block {
+    final core::Set<core::int> #t334 = col::LinkedHashSet::•<core::int>();
+    for (core::int i in <core::int>[1, 2, 3])
+      #t334.{core::Set::add}(i);
+    #t334.{core::Set::add}(null);
+  } =>#t334;
+  core::Map<core::String, core::int> map110 = block {
+    final core::Map<core::String, core::int> #t335 = <core::String, core::int>{};
+    for (core::int i in <core::int>[1, 2, 3])
+      #t335.{core::Map::[]=}("bar", i);
+    #t335.{core::Map::[]=}("baz", null);
+  } =>#t335;
+  core::List<core::int> list120 = block {
+    final core::List<core::int> #t336 = <core::int>[];
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
+      #t336.{core::List::add}(i as{TypeError} core::int);
+  } =>#t336;
+  core::Set<core::int> set120 = block {
+    final core::Set<core::int> #t337 = col::LinkedHashSet::•<core::int>();
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
+      #t337.{core::Set::add}(i as{TypeError} core::int);
+    #t337.{core::Set::add}(null);
+  } =>#t337;
+  core::Map<core::String, core::int> map120 = block {
+    final core::Map<core::String, core::int> #t338 = <core::String, core::int>{};
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
+      #t338.{core::Map::[]=}("bar", i as{TypeError} core::int);
+    #t338.{core::Map::[]=}("baz", null);
+  } =>#t338;
+  core::List<core::int> list130 = block {
+    final core::List<core::int> #t339 = <core::int>[];
+    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t339.{core::List::add}(i);
+  } =>#t339;
+  core::Set<core::int> set130 = block {
+    final core::Set<core::int> #t340 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t340.{core::Set::add}(i);
+  } =>#t340;
+  core::Map<core::int, core::int> map130 = block {
+    final core::Map<core::int, core::int> #t341 = <core::int, core::int>{};
+    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t341.{core::Map::[]=}(i, i);
+  } =>#t341;
+}
+static method testForElementErrors(core::Map<core::int, core::int> map, core::List<core::int> list) → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  dynamic :exception0;
+  dynamic :stack_trace0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        block {
+          final core::List<core::int> #t342 = <core::int>[];
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            #t342.{core::List::add}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
+                                            ^" in "bar" as{TypeError} core::int);
+        } =>#t342;
+        block {
+          final core::Set<core::int> #t344 = col::LinkedHashSet::•<core::int>();
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            #t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
+                                            ^" in "bar" as{TypeError} core::int);
+          #t344.{core::Set::add}(null);
+        } =>#t344;
+        block {
+          final core::Map<core::int, core::int> #t346 = <core::int, core::int>{};
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            #t346.{core::Map::[]=}(let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                 ^" in "bar" as{TypeError} core::int, let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                        ^" in "bar" as{TypeError} core::int);
+          #t346.{core::Map::[]=}(let final<BottomType> #t349 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                               ^" in "baz" as{TypeError} core::int, null);
+        } =>#t346;
+        block {
+          final core::List<core::int> #t350 = <core::int>[];
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            for (final core::int #t351 in <core::int>[let final<BottomType> #t352 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
+                                                ^" in "bar" as{TypeError} core::int])
+              #t350.{core::List::add}(#t351);
+        } =>#t350;
+        block {
+          final core::Set<core::int> #t353 = col::LinkedHashSet::•<core::int>();
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            for (final core::int #t354 in <core::int>[let final<BottomType> #t355 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
+                                                ^" in "bar" as{TypeError} core::int])
+              #t353.{core::Set::add}(#t354);
+          #t353.{core::Set::add}(null);
+        } =>#t353;
+        block {
+          final core::Map<core::int, core::int> #t356 = <core::int, core::int>{};
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            for (final core::MapEntry<core::int, core::int> #t357 in <core::int, core::int>{let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                     ^" in "bar" as{TypeError} core::int: let final<BottomType> #t359 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                            ^" in "bar" as{TypeError} core::int}.{core::Map::entries})
+              #t356.{core::Map::[]=}(#t357.{core::MapEntry::key}, #t357.{core::MapEntry::value});
+          #t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                                    ^" in "baz" as{TypeError} core::int, null);
+        } =>#t356;
+        block {
+          final core::List<core::int> #t361 = <core::int>[];
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            #t361.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) ...map];
+                                               ^");
+        } =>#t361;
+        block {
+          final core::Set<core::int> #t362 = col::LinkedHashSet::•<core::int>();
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            #t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) ...map, null};
+                                               ^");
+          #t362.{core::Set::add}(null);
+        } =>#t362;
+        <core::int, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
+                                                    ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
+                                                    ^": null};
+        block {
+          final core::List<core::String> #t363 = <core::String>[];
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool)
+              #t363.{core::List::add}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
+                                                             ^" in 42 as{TypeError} core::String);
+            else
+              #t363.{core::List::add}(let final<BottomType> #t365 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
+                                                                     ^" in 3.14 as{TypeError} core::String);
+        } =>#t363;
+        block {
+          final core::Set<core::String> #t366 = col::LinkedHashSet::•<core::String>();
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool)
+              #t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
+                                                             ^" in 42 as{TypeError} core::String);
+            else
+              #t366.{core::Set::add}(let final<BottomType> #t368 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
+                                                                     ^" in 3.14 as{TypeError} core::String);
+          #t366.{core::Set::add}(null);
+        } =>#t366;
+        block {
+          final core::Map<core::String, core::String> #t369 = <core::String, core::String>{};
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool)
+              #t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
+                                                                            ^" in 42 as{TypeError} core::String);
+            else
+              #t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
+                                                                                           ^" in 3.14 as{TypeError} core::String);
+          #t369.{core::Map::[]=}("baz", null);
+        } =>#t369;
+        block {
+          final core::List<core::int> #t372 = <core::int>[];
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool)
+              #t372.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42];
+                                                             ^");
+            else
+              #t372.{core::List::add}(42);
+        } =>#t372;
+        block {
+          final core::Set<core::int> #t373 = col::LinkedHashSet::•<core::int>();
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool)
+              #t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42, null};
+                                                             ^");
+            else
+              #t373.{core::Set::add}(42);
+          #t373.{core::Set::add}(null);
+        } =>#t373;
+        <core::String, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
+                                                                     ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
+                                                                     ^": null};
+        block {
+          final core::List<core::int> #t374 = <core::int>[];
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool)
+              #t374.{core::List::add}(42);
+            else
+              #t374.{core::List::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map];
+                                                                     ^");
+        } =>#t374;
+        block {
+          final core::Set<core::int> #t375 = col::LinkedHashSet::•<core::int>();
+          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool)
+              #t375.{core::Set::add}(42);
+            else
+              #t375.{core::Set::add}(invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map, null};
+                                                                     ^");
+          #t375.{core::Set::add}(null);
+        } =>#t375;
+        <core::String, core::int>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
+                                                                                    ^": null, invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
+                                                                                    ^": null};
+        final core::int i = 0;
+        block {
+          final core::List<core::int> #t376 = <core::int>[];
+          for (final core::int #t377 in <core::int>[1]) {
+            invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
+  <int>[for (i in <int>[1]) i];
+             ^";
+            #t376.{core::List::add}(i);
+          }
+        } =>#t376;
+        block {
+          final core::Set<core::int> #t378 = col::LinkedHashSet::•<core::int>();
+          for (final core::int #t379 in <core::int>[1]) {
+            invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
+  <int>{for (i in <int>[1]) i, null};
+             ^";
+            #t378.{core::Set::add}(i);
+          }
+          #t378.{core::Set::add}(null);
+        } =>#t378;
+        block {
+          final core::Map<core::String, core::int> #t380 = <core::String, core::int>{};
+          for (final core::int #t381 in <core::int>[1]) {
+            invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
+\t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
+\t                   ^";
+            #t380.{core::Map::[]=}("bar", i);
+          }
+          #t380.{core::Map::[]=}("baz", null);
+        } =>#t380;
+        core::List<dynamic> list10 = block {
+          final core::List<dynamic> #t382 = <dynamic>[];
+          for (dynamic i in let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  var list10 = [for (var i in \"not iterable\") i];
+                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>)
+            #t382.{core::List::add}(i);
+        } =>#t382;
+        core::Set<dynamic> set10 = block {
+          final core::Set<dynamic> #t384 = col::LinkedHashSet::•<dynamic>();
+          for (dynamic i in let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  var set10 = {for (var i in \"not iterable\") i, null};
+                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>)
+            #t384.{core::Set::add}(i);
+          #t384.{core::Set::add}(null);
+        } =>#t384;
+        core::Map<core::String, dynamic> map10 = block {
+          final core::Map<core::String, dynamic> #t386 = <core::String, dynamic>{};
+          for (dynamic i in let final<BottomType> #t387 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  var map10 = {for (var i in \"not iterable\") \"bar\": i, \"baz\": null};
+                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>)
+            #t386.{core::Map::[]=}("bar", i);
+          #t386.{core::Map::[]=}("baz", null);
+        } =>#t386;
+        core::List<core::int> list20 = block {
+          final core::List<core::int> #t388 = <core::int>[];
+          for (core::int i in <core::int>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list20 = [for (int i in [\"not\", \"int\"]) i];
+                               ^" in "not" as{TypeError} core::int, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list20 = [for (int i in [\"not\", \"int\"]) i];
+                                      ^" in "int" as{TypeError} core::int])
+            #t388.{core::List::add}(i);
+        } =>#t388;
+        core::Set<core::int> set20 = block {
+          final core::Set<core::int> #t391 = col::LinkedHashSet::•<core::int>();
+          for (core::int i in <core::int>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
+                              ^" in "not" as{TypeError} core::int, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
+                                     ^" in "int" as{TypeError} core::int])
+            #t391.{core::Set::add}(i);
+          #t391.{core::Set::add}(null);
+        } =>#t391;
+        core::Map<core::String, core::int> map20 = block {
+          final core::Map<core::String, core::int> #t394 = <core::String, core::int>{};
+          for (core::int i in <core::int>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
+                              ^" in "not" as{TypeError} core::int, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
+                                     ^" in "int" as{TypeError} core::int])
+            #t394.{core::Map::[]=}("bar", i);
+          #t394.{core::Map::[]=}("baz", null);
+        } =>#t394;
+        final core::List<dynamic> #t397 = <dynamic>[];
+        {
+          dynamic :stream = let final<BottomType> #t398 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
+  var list30 = [await for (var i in \"not stream\") i];
+                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L2:
+            while (true) {
+              dynamic #t399 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t400 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic i = :for-iterator.{asy::_StreamIterator::current};
+                #t397.{core::List::add}(i);
+              }
+              else
+                break #L2;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t401 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::List<dynamic> list30 = block {} =>#t397;
+        final core::Set<dynamic> #t402 = col::LinkedHashSet::•<dynamic>();
+        {
+          dynamic :stream = let final<BottomType> #t403 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
+  var set30 = {await for (var i in \"not stream\") i, null};
+                                   ^" in "not stream" as{TypeError} asy::Stream<dynamic>;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L3:
+            while (true) {
+              dynamic #t404 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t405 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic i = :for-iterator.{asy::_StreamIterator::current};
+                #t402.{core::Set::add}(i);
+              }
+              else
+                break #L3;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t406 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::Set<dynamic> set30 = block {
+          #t402.{core::Set::add}(null);
+        } =>#t402;
+        final core::Map<core::String, dynamic> #t407 = <core::String, dynamic>{};
+        {
+          dynamic :stream = let final<BottomType> #t408 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
+  var map30 = {await for (var i in \"not stream\") \"bar\": i, \"baz\": null};
+                                   ^" in "not stream" as{TypeError} asy::Stream<dynamic>;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L4:
+            while (true) {
+              dynamic #t409 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t410 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic i = :for-iterator.{asy::_StreamIterator::current};
+                #t407.{core::Map::[]=}("bar", i);
+              }
+              else
+                break #L4;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t411 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::Map<core::String, dynamic> map30 = block {
+          #t407.{core::Map::[]=}("baz", null);
+        } =>#t407;
+        final core::List<core::int> #t412 = <core::int>[];
+        {
+          dynamic :stream = asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t413 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
+                                                         ^" in "not" as{TypeError} core::int, let final<BottomType> #t414 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
+                                                                ^" in "int" as{TypeError} core::int]);
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L5:
+            while (true) {
+              dynamic #t415 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t416 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                core::int i = :for-iterator.{asy::_StreamIterator::current};
+                #t412.{core::List::add}(i);
+              }
+              else
+                break #L5;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t417 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::List<core::int> list40 = block {} =>#t412;
+        final core::Set<core::int> #t418 = col::LinkedHashSet::•<core::int>();
+        {
+          dynamic :stream = asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t419 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
+                                                        ^" in "not" as{TypeError} core::int, let final<BottomType> #t420 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
+                                                               ^" in "int" as{TypeError} core::int]);
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L6:
+            while (true) {
+              dynamic #t421 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t422 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                core::int i = :for-iterator.{asy::_StreamIterator::current};
+                #t418.{core::Set::add}(i);
+              }
+              else
+                break #L6;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t423 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::Set<core::int> set40 = block {
+          #t418.{core::Set::add}(null);
+        } =>#t418;
+        final core::Map<core::String, core::int> #t424 = <core::String, core::int>{};
+        {
+          dynamic :stream = asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t425 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
+                                                        ^" in "not" as{TypeError} core::int, let final<BottomType> #t426 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
+                                                               ^" in "int" as{TypeError} core::int]);
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L7:
+            while (true) {
+              dynamic #t427 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t428 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                core::int i = :for-iterator.{asy::_StreamIterator::current};
+                #t424.{core::Map::[]=}("bar", i);
+              }
+              else
+                break #L7;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t429 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::Map<core::String, core::int> map40 = block {
+          #t424.{core::Map::[]=}("baz", null);
+        } =>#t424;
+        core::List<core::int> list50 = block {
+          final core::List<core::int> #t430 = <core::int>[];
+          for (; ; )
+            #t430.{core::List::add}(42);
+        } =>#t430;
+        core::Set<core::int> set50 = block {
+          final core::Set<core::int> #t431 = col::LinkedHashSet::•<core::int>();
+          for (; ; )
+            #t431.{core::Set::add}(42);
+          #t431.{core::Set::add}(null);
+        } =>#t431;
+        core::Map<core::String, core::int> map50 = block {
+          final core::Map<core::String, core::int> #t432 = <core::String, core::int>{};
+          for (; ; )
+            #t432.{core::Map::[]=}("bar", 42);
+          #t432.{core::Map::[]=}("baz", null);
+        } =>#t432;
+        core::List<core::int> list60 = block {
+          final core::List<core::int> #t433 = <core::int>[];
+          for (; let final<BottomType> #t434 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var list60 = [for (; \"not bool\";) 42];
+                       ^" in "not bool" as{TypeError} core::bool; )
+            #t433.{core::List::add}(42);
+        } =>#t433;
+        core::Set<core::int> set60 = block {
+          final core::Set<core::int> #t435 = col::LinkedHashSet::•<core::int>();
+          for (; let final<BottomType> #t436 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var set60 = {for (; \"not bool\";) 42, null};
+                      ^" in "not bool" as{TypeError} core::bool; )
+            #t435.{core::Set::add}(42);
+          #t435.{core::Set::add}(null);
+        } =>#t435;
+        core::Map<core::String, core::int> map60 = block {
+          final core::Map<core::String, core::int> #t437 = <core::String, core::int>{};
+          for (; let final<BottomType> #t438 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
+                      ^" in "not bool" as{TypeError} core::bool; )
+            #t437.{core::Map::[]=}("bar", 42);
+          #t437.{core::Map::[]=}("baz", null);
+        } =>#t437;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method testForElementErrorsNotAsync(asy::Stream<core::int> stream) → dynamic {
+  block {
+    final core::List<core::int> #t439 = <core::int>[];
+    await for (core::int i in stream)
+      #t439.{core::List::add}(i);
+  } =>#t439;
+  block {
+    final core::Set<core::int> #t440 = col::LinkedHashSet::•<core::int>();
+    await for (core::int i in stream)
+      #t440.{core::Set::add}(i);
+  } =>#t440;
+  block {
+    final core::Map<core::String, core::int> #t441 = <core::String, core::int>{};
+    await for (core::int i in stream)
+      #t441.{core::Map::[]=}("bar", i);
+  } =>#t441;
+}
+static method testPromotion(self::A a) → dynamic {
+  core::List<core::int> list10 = block {
+    final core::List<core::int> #t442 = <core::int>[];
+    if(a is self::B)
+      #t442.{core::List::add}(a{self::B}.{self::B::foo});
+  } =>#t442;
+  core::Set<core::int> set10 = block {
+    final core::Set<core::int> #t443 = col::LinkedHashSet::•<core::int>();
+    if(a is self::B)
+      #t443.{core::Set::add}(a{self::B}.{self::B::foo});
+  } =>#t443;
+  core::Map<core::int, core::int> map10 = block {
+    final core::Map<core::int, core::int> #t444 = <core::int, core::int>{};
+    if(a is self::B)
+      #t444.{core::Map::[]=}(a{self::B}.{self::B::foo}, a{self::B}.{self::B::foo});
+  } =>#t444;
+}
+static method main() → dynamic {}
diff --git a/front_end/testcases/control_flow_collection_inference.dart.type_promotion.expect b/front_end/testcases/control_flow_collection_inference.dart.type_promotion.expect
new file mode 100644
index 0000000..648acdc
--- /dev/null
+++ b/front_end/testcases/control_flow_collection_inference.dart.type_promotion.expect
@@ -0,0 +1,306 @@
+pkg/front_end/testcases/control_flow_collection_inference.dart:123:49: Context: Write to i@7018
+  var list10 = [for (int i = 0; oracle("foo"); i++) 42];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:124:48: Context: Write to i@7018
+  var set10 = {for (int i = 0; oracle("foo"); i++) 42, null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:125:48: Context: Write to i@7018
+  var map10 = {for (int i = 0; oracle("foo"); i++) "bar": 42, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:126:49: Context: Write to i@7018
+  var list11 = [for (int i = 0; oracle("foo"); i++) dynVar];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:127:48: Context: Write to i@7018
+  var set11 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:128:48: Context: Write to i@7018
+  var map11 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:129:49: Context: Write to i@7018
+  var list12 = [for (int i = 0; oracle("foo"); i++) [42]];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:130:48: Context: Write to i@7018
+  var set12 = {for (int i = 0; oracle("foo"); i++) [42], null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:131:48: Context: Write to i@7018
+  var map12 = {for (int i = 0; oracle("foo"); i++) "bar": [42], "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:132:49: Context: Write to i@7018
+  var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:133:48: Context: Write to i@7018
+  var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:134:48: Context: Write to i@7018
+  var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:135:49: Context: Write to i@7018
+  var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:136:48: Context: Write to i@7018
+  var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:137:48: Context: Write to i@7018
+  var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:138:49: Context: Write to i@7018
+  var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:139:48: Context: Write to i@7018
+  var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:140:48: Context: Write to i@7018
+  var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:141:49: Context: Write to i@7018
+  var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:142:48: Context: Write to i@7018
+  var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:143:48: Context: Write to i@7018
+  var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:144:49: Context: Write to i@7018
+  var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:145:48: Context: Write to i@7018
+  var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:146:48: Context: Write to i@7018
+  var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:147:49: Context: Write to i@7018
+  var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:148:48: Context: Write to i@7018
+  var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:149:48: Context: Write to i@7018
+  var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:150:61: Context: Write to i@7018
+  List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+                                                            ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:151:59: Context: Write to i@7018
+  Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+                                                          ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:152:67: Context: Write to i@7018
+  Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:153:61: Context: Write to i@7018
+  List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
+                                                            ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:154:59: Context: Write to i@7018
+  Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
+                                                          ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:155:61: Context: Write to i@7018
+  List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+                                                            ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:156:59: Context: Write to i@7018
+  Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+                                                          ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:157:67: Context: Write to i@7018
+  Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:158:55: Context: Write to i@7018
+  List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
+                                                      ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:159:53: Context: Write to i@7018
+  Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
+                                                    ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:160:61: Context: Write to i@7018
+  Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
+                                                            ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:161:55: Context: Write to i@7018
+  List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
+                                                      ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:162:53: Context: Write to i@7018
+  Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
+                                                    ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:163:55: Context: Write to i@7018
+  List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+                                                      ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:164:53: Context: Write to i@7018
+  Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+                                                    ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:165:61: Context: Write to i@7018
+  List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+                                                            ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:166:59: Context: Write to i@7018
+  Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+                                                          ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:167:67: Context: Write to i@7018
+  Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:168:61: Context: Write to i@7018
+  List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+                                                            ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:169:59: Context: Write to i@7018
+  Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+                                                          ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:170:67: Context: Write to i@7018
+  Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:171:61: Context: Write to i@7018
+  List<List<int>> list70 = [for (int i = 0; oracle("foo"); i++) []];
+                                                            ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:172:59: Context: Write to i@7018
+  Set<List<int>> set70 = {for (int i = 0; oracle("foo"); i++) [], null};
+                                                          ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:173:67: Context: Write to i@7018
+  Map<String, List<int>> map70 = {for (int i = 0; oracle("foo"); i++) "bar": [], "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:174:61: Context: Write to i@7018
+  List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
+                                                            ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:175:59: Context: Write to i@7018
+  Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
+                                                          ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:176:67: Context: Write to i@7018
+  Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:177:49: Context: Write to i@7018
+  var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:178:48: Context: Write to i@7018
+  var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:179:48: Context: Write to i@7018
+  var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:180:49: Context: Write to i@7018
+  var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:181:48: Context: Write to i@7018
+  var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:182:48: Context: Write to i@7018
+  var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:183:49: Context: Write to i@7018
+  var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:184:48: Context: Write to i@7018
+  var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:185:48: Context: Write to i@7018
+  var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:186:49: Context: Write to i@7018
+  var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:187:48: Context: Write to i@7018
+  var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:188:48: Context: Write to i@7018
+  var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:189:55: Context: Write to i@7018
+  List<int> list90 = [for (int i = 0; oracle("foo"); i++) dynVar];
+                                                      ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:190:53: Context: Write to i@7018
+  Set<int> set90 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+                                                    ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:191:61: Context: Write to i@7018
+  Map<String, int> map90 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+                                                            ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:192:55: Context: Write to i@7018
+  List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
+                                                      ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:193:53: Context: Write to i@7018
+  Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
+                                                    ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:194:61: Context: Write to i@7018
+  Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
+                                                            ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:195:40: Context: Write to index@6916
+  List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
+                                       ^
+pkg/front_end/testcases/control_flow_collection_inference.dart:195:65: Context: Write to index@6916
+  List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
+                                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:196:38: Context: Write to index@6916
+  Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
+                                     ^
+pkg/front_end/testcases/control_flow_collection_inference.dart:196:63: Context: Write to index@6916
+  Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
+                                                              ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:197:54: Context: Write to index@6916
+  Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
+                                                     ^
+pkg/front_end/testcases/control_flow_collection_inference.dart:197:79: Context: Write to index@6916
+  Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
+                                                                              ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:204:48: Context: Write to i@7018
+  List<int> list130 = [for (var i = 1; i < 2; i++) i];
+                                               ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:205:46: Context: Write to i@7018
+  Set<int> set130 = {for (var i = 1; i < 2; i++) i};
+                                             ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:206:51: Context: Write to i@7018
+  Map<int, int> map130 = {for (var i = 1; i < 2; i++) i: i};
+                                                  ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:210:41: Context: Write to i@13789
+  <int>[for (int i = 0; oracle("foo"); i++) "bar"];
+                                        ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:211:41: Context: Write to i@13789
+  <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
+                                        ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:212:46: Context: Write to i@13789
+  <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+                                             ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:213:41: Context: Write to i@13789
+  <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+                                        ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:214:41: Context: Write to i@13789
+  <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+                                        ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:215:46: Context: Write to i@13789
+  <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+                                             ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:216:41: Context: Write to i@13789
+  <int>[for (int i = 0; oracle("foo"); i++) ...map];
+                                        ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:217:41: Context: Write to i@13789
+  <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+                                        ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:218:46: Context: Write to i@13789
+  <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+                                             ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:219:44: Context: Write to i@13789
+  <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+                                           ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:220:44: Context: Write to i@13789
+  <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+                                           ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:221:52: Context: Write to i@13789
+  <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+                                                   ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:222:41: Context: Write to i@13789
+  <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+                                        ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:223:41: Context: Write to i@13789
+  <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+                                        ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:224:49: Context: Write to i@13789
+  <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:225:41: Context: Write to i@13789
+  <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+                                        ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:226:41: Context: Write to i@13789
+  <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+                                        ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:227:49: Context: Write to i@13789
+  <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
+                                                ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:267:29: Context: Possible promotion of a@16609
+  List<int> list10 = [if (a is B) a.foo];
+                            ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:268:27: Context: Possible promotion of a@16609
+  Set<int> set10 = {if (a is B) a.foo};
+                          ^^
+pkg/front_end/testcases/control_flow_collection_inference.dart:269:32: Context: Possible promotion of a@16609
+  Map<int, int> map10 = {if (a is B) a.foo: a.foo};
+                               ^^
diff --git a/front_end/testcases/covariant_generic.dart.outline.expect b/front_end/testcases/covariant_generic.dart.outline.expect
index 0014cd5..4b44219 100644
--- a/front_end/testcases/covariant_generic.dart.outline.expect
+++ b/front_end/testcases/covariant_generic.dart.outline.expect
@@ -6,13 +6,13 @@
 class Foo<T extends core::Object = dynamic> extends core::Object {
   final field self::Foo::T finalField;
   final field (self::Foo::T) → void callbackField;
-  field self::Foo::T mutableField;
+  generic-covariant-impl field self::Foo::T mutableField;
   field (self::Foo::T) → void mutableCallbackField;
   constructor •(self::Foo::T finalField, (self::Foo::T) → void callbackField) → self::Foo<self::Foo::T>
     ;
-  method method(self::Foo::T x) → void
+  method method(generic-covariant-impl self::Foo::T x) → void
     ;
-  set setter(self::Foo::T x) → dynamic
+  set setter(generic-covariant-impl self::Foo::T x) → dynamic
     ;
   method withCallback((self::Foo::T) → void callback) → void
     ;
diff --git a/front_end/testcases/deferred_type_annotation.dart.legacy.expect b/front_end/testcases/deferred_type_annotation.dart.legacy.expect
index 423412d..982cf85 100644
--- a/front_end/testcases/deferred_type_annotation.dart.legacy.expect
+++ b/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/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect b/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect
index 423412d..982cf85 100644
--- a/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/deferred_type_annotation.dart.outline.expect b/front_end/testcases/deferred_type_annotation.dart.outline.expect
index 7693576..592059d 100644
--- a/front_end/testcases/deferred_type_annotation.dart.outline.expect
+++ b/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/front_end/testcases/deferred_type_annotation.dart.strong.expect b/front_end/testcases/deferred_type_annotation.dart.strong.expect
index 6be11a9..29b1b92 100644
--- a/front_end/testcases/deferred_type_annotation.dart.strong.expect
+++ b/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/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect b/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
index 6be11a9..29b1b92 100644
--- a/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
+++ b/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/front_end/testcases/duplicated_declarations.dart.legacy.expect b/front_end/testcases/duplicated_declarations.dart.legacy.expect
index f1e837f..86ec30f 100644
--- a/front_end/testcases/duplicated_declarations.dart.legacy.expect
+++ b/front_end/testcases/duplicated_declarations.dart.legacy.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must preceed part directives.
+// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must precede part directives.
 // Try moving the import directives before the part directives.
 // import 'duplicated_declarations_lib.dart' as Typedef;
 // ^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must preceed part directives.
+// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must precede part directives.
 // Try moving the import directives before the part directives.
 // import 'duplicated_declarations_lib.dart' as Typedef;
 // ^^^^^^
diff --git a/front_end/testcases/duplicated_declarations.dart.legacy.transformed.expect b/front_end/testcases/duplicated_declarations.dart.legacy.transformed.expect
index f1e837f..86ec30f 100644
--- a/front_end/testcases/duplicated_declarations.dart.legacy.transformed.expect
+++ b/front_end/testcases/duplicated_declarations.dart.legacy.transformed.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must preceed part directives.
+// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must precede part directives.
 // Try moving the import directives before the part directives.
 // import 'duplicated_declarations_lib.dart' as Typedef;
 // ^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must preceed part directives.
+// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must precede part directives.
 // Try moving the import directives before the part directives.
 // import 'duplicated_declarations_lib.dart' as Typedef;
 // ^^^^^^
diff --git a/front_end/testcases/duplicated_declarations.dart.outline.expect b/front_end/testcases/duplicated_declarations.dart.outline.expect
index 63f345e..1933ac0 100644
--- a/front_end/testcases/duplicated_declarations.dart.outline.expect
+++ b/front_end/testcases/duplicated_declarations.dart.outline.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must preceed part directives.
+// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must precede part directives.
 // Try moving the import directives before the part directives.
 // import 'duplicated_declarations_lib.dart' as Typedef;
 // ^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must preceed part directives.
+// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must precede part directives.
 // Try moving the import directives before the part directives.
 // import 'duplicated_declarations_lib.dart' as Typedef;
 // ^^^^^^
diff --git a/front_end/testcases/duplicated_declarations.dart.strong.expect b/front_end/testcases/duplicated_declarations.dart.strong.expect
index a51c4ba..6e8d2d8 100644
--- a/front_end/testcases/duplicated_declarations.dart.strong.expect
+++ b/front_end/testcases/duplicated_declarations.dart.strong.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must preceed part directives.
+// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must precede part directives.
 // Try moving the import directives before the part directives.
 // import 'duplicated_declarations_lib.dart' as Typedef;
 // ^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must preceed part directives.
+// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must precede part directives.
 // Try moving the import directives before the part directives.
 // import 'duplicated_declarations_lib.dart' as Typedef;
 // ^^^^^^
diff --git a/front_end/testcases/dynamic_and_void.dart b/front_end/testcases/dynamic_and_void.dart
index 21800bd..f6b345c 100644
--- a/front_end/testcases/dynamic_and_void.dart
+++ b/front_end/testcases/dynamic_and_void.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=warning*/
-
 // dynamic is treated as a name exported by dart:core.  void is not treated as a
 // name exported by dart:core.
 
diff --git a/front_end/testcases/dynamic_and_void.dart.legacy.expect b/front_end/testcases/dynamic_and_void.dart.legacy.expect
index 3760ddb..5606157 100644
--- a/front_end/testcases/dynamic_and_void.dart.legacy.expect
+++ b/front_end/testcases/dynamic_and_void.dart.legacy.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/dynamic_and_void.dart:12:27: Warning: Type 'dynamic' not found.
+// pkg/front_end/testcases/dynamic_and_void.dart:10:27: Warning: Type 'dynamic' not found.
 // /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
 //                           ^^^^^^^
 //
diff --git a/front_end/testcases/dynamic_and_void.dart.legacy.transformed.expect b/front_end/testcases/dynamic_and_void.dart.legacy.transformed.expect
index 3760ddb..5606157 100644
--- a/front_end/testcases/dynamic_and_void.dart.legacy.transformed.expect
+++ b/front_end/testcases/dynamic_and_void.dart.legacy.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/dynamic_and_void.dart:12:27: Warning: Type 'dynamic' not found.
+// pkg/front_end/testcases/dynamic_and_void.dart:10:27: Warning: Type 'dynamic' not found.
 // /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
 //                           ^^^^^^^
 //
diff --git a/front_end/testcases/dynamic_and_void.dart.outline.expect b/front_end/testcases/dynamic_and_void.dart.outline.expect
index f080c68..b659017 100644
--- a/front_end/testcases/dynamic_and_void.dart.outline.expect
+++ b/front_end/testcases/dynamic_and_void.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/dynamic_and_void.dart:12:27: Warning: Type 'dynamic' not found.
+// pkg/front_end/testcases/dynamic_and_void.dart:10:27: Warning: Type 'dynamic' not found.
 // /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
 //                           ^^^^^^^
 //
diff --git a/front_end/testcases/export_main.dart.legacy.expect b/front_end/testcases/export_main.dart.legacy.expect
index 1f4d73b..2ce3772 100644
--- a/front_end/testcases/export_main.dart.legacy.expect
+++ b/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/front_end/testcases/export_main.dart.legacy.transformed.expect b/front_end/testcases/export_main.dart.legacy.transformed.expect
index 1f4d73b..2ce3772 100644
--- a/front_end/testcases/export_main.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/export_main.dart.outline.expect b/front_end/testcases/export_main.dart.outline.expect
index 349482d..ce25789 100644
--- a/front_end/testcases/export_main.dart.outline.expect
+++ b/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/front_end/testcases/export_main.dart.strong.expect b/front_end/testcases/export_main.dart.strong.expect
index 1f4d73b..2ce3772 100644
--- a/front_end/testcases/export_main.dart.strong.expect
+++ b/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/front_end/testcases/export_main.dart.strong.transformed.expect b/front_end/testcases/export_main.dart.strong.transformed.expect
index 1f4d73b..2ce3772 100644
--- a/front_end/testcases/export_main.dart.strong.transformed.expect
+++ b/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/front_end/testcases/expression/from_vm_cc_linked_hash_map.expression.yaml b/front_end/testcases/expression/from_vm_cc_linked_hash_map.expression.yaml
new file mode 100644
index 0000000..9b5507b
--- /dev/null
+++ b/front_end/testcases/expression/from_vm_cc_linked_hash_map.expression.yaml
@@ -0,0 +1,30 @@
+# 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.
+
+entry_point: "main.dart"
+definitions: [a, b]
+position: "dart:collection"
+expression: |
+  (a, b) {
+    if (a._usedData != b._usedData ||
+        a._deletedKeys != b._deletedKeys ||
+        a._hashMask != b._hashMask ||
+        a._index.length != b._index.length ||
+        a._data.length != b._data.length) {
+      return false;
+    }
+    for (var i = 0; i < a._index.length; ++i) {
+      if (a._index[i] != b._index[i]) {
+        return false;
+      }
+    }
+    for (var i = 0; i < a._data.length; ++i) {
+      var ad = a._data[i];
+      var bd = b._data[i];
+      if (!identical(ad, bd) && !(ad == a && bd == b)) {
+        return false;
+      }
+    }
+    return true;
+  }(a, b)
\ No newline at end of file
diff --git a/front_end/testcases/expression/from_vm_cc_linked_hash_map.expression.yaml.expect b/front_end/testcases/expression/from_vm_cc_linked_hash_map.expression.yaml.expect
new file mode 100644
index 0000000..ad666aa
--- /dev/null
+++ b/front_end/testcases/expression/from_vm_cc_linked_hash_map.expression.yaml.expect
@@ -0,0 +1,21 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic a, dynamic b) → dynamic
+  return ((dynamic a, dynamic b) → dart.core::bool {
+    if(!a._usedData.{dart.core::Object::==}(b._usedData) || !a._deletedKeys.{dart.core::Object::==}(b._deletedKeys) || !a._hashMask.{dart.core::Object::==}(b._hashMask) || !a._index.length.{dart.core::Object::==}(b._index.length) || !a._data.length.{dart.core::Object::==}(b._data.length)) {
+      return false;
+    }
+    for (dart.core::int i = 0; i.{dart.core::num::<}(a._index.length as{TypeError} dart.core::num); i = i.{dart.core::num::+}(1)) {
+      if(!a._index.[](i).{dart.core::Object::==}(b._index.[](i))) {
+        return false;
+      }
+    }
+    for (dart.core::int i = 0; i.{dart.core::num::<}(a._data.length as{TypeError} dart.core::num); i = i.{dart.core::num::+}(1)) {
+      dynamic ad = a._data.[](i);
+      dynamic bd = b._data.[](i);
+      if(!dart.core::identical(ad, bd) && !(ad.{dart.core::Object::==}(a) && bd.{dart.core::Object::==}(b))) {
+        return false;
+      }
+    }
+    return true;
+  }).call(a, b);
diff --git a/front_end/testcases/for_in_without_declaration.dart.legacy.expect b/front_end/testcases/for_in_without_declaration.dart.legacy.expect
index 8e5c9f4..9cc7892 100644
--- a/front_end/testcases/for_in_without_declaration.dart.legacy.expect
+++ b/front_end/testcases/for_in_without_declaration.dart.legacy.expect
@@ -142,10 +142,8 @@
          ^^^";
         dynamic x;
         dynamic y;
-        {
-          core::print(x);
-          core::print(y);
-        }
+        core::print(x);
+        core::print(y);
       }
     }
     const core::int constant = 0;
diff --git a/front_end/testcases/for_in_without_declaration.dart.legacy.transformed.expect b/front_end/testcases/for_in_without_declaration.dart.legacy.transformed.expect
index 8e5c9f4..9cc7892 100644
--- a/front_end/testcases/for_in_without_declaration.dart.legacy.transformed.expect
+++ b/front_end/testcases/for_in_without_declaration.dart.legacy.transformed.expect
@@ -142,10 +142,8 @@
          ^^^";
         dynamic x;
         dynamic y;
-        {
-          core::print(x);
-          core::print(y);
-        }
+        core::print(x);
+        core::print(y);
       }
     }
     const core::int constant = 0;
diff --git a/front_end/testcases/for_in_without_declaration.dart.strong.expect b/front_end/testcases/for_in_without_declaration.dart.strong.expect
index cc7b291..9e758ec 100644
--- a/front_end/testcases/for_in_without_declaration.dart.strong.expect
+++ b/front_end/testcases/for_in_without_declaration.dart.strong.expect
@@ -172,10 +172,8 @@
          ^^^";
         dynamic x;
         dynamic y;
-        {
-          core::print(x);
-          core::print(y);
-        }
+        core::print(x);
+        core::print(y);
       }
     }
     const core::int constant = 0;
diff --git a/front_end/testcases/for_in_without_declaration.dart.strong.transformed.expect b/front_end/testcases/for_in_without_declaration.dart.strong.transformed.expect
index cc7b291..9e758ec 100644
--- a/front_end/testcases/for_in_without_declaration.dart.strong.transformed.expect
+++ b/front_end/testcases/for_in_without_declaration.dart.strong.transformed.expect
@@ -172,10 +172,8 @@
          ^^^";
         dynamic x;
         dynamic y;
-        {
-          core::print(x);
-          core::print(y);
-        }
+        core::print(x);
+        core::print(y);
       }
     }
     const core::int constant = 0;
diff --git a/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml b/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml
new file mode 100644
index 0000000..ba6a85f
--- /dev/null
+++ b/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml
@@ -0,0 +1,147 @@
+# 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 a number of modules.
+# Compile again with changing modules.
+
+type: newworld
+strong: true
+modules:
+  example_0.1.0:
+    example_0.1.0/a.dart: |
+      a() {
+        la1();
+      }
+      la1() {
+        print("Hello from v0.1.0");
+      }
+    example_0.1.0/b.dart: |
+      import "a.dart";
+      b() {
+        a();
+      }
+    example_0.1.0/.packages: |
+      example:.
+  example_0.1.1:
+    example_0.1.1/b.dart: |
+      b() {
+        print("Hello from v0.1.1");
+      }
+      bool example011 = true;
+    example_0.1.1/.packages: |
+      example:.
+  foo_1:
+    foo_1/foo.dart: |
+      import "package:example/b.dart";
+      foo() {
+        print("Hello from foo");
+        b();
+      }
+      bool foo1 = true;
+    foo_1/.packages: |
+      foo:.
+      example:../example_0.1.0
+  foo_2:
+    foo_2/foo.dart: |
+      import "package:example/b.dart";
+      import "bar.dart";
+      import "baz.dart";
+      foo() {
+        print("Hello from foo 2");
+        bar();
+        baz();
+        b();
+      }
+      bool foo2 = true;
+    foo_2/bar.dart: |
+      bar() {
+        print("hello from bar");
+      }
+    foo_2/baz.dart: |
+      baz() {
+        print("hello from baz");
+      }
+    foo_2/.packages: |
+      foo:.
+      example:../example_0.1.1
+worlds:
+  - entry: main.dart
+    fromComponent: true
+    sources:
+      main.dart: |
+        import "package:example/b.dart";
+        main() {
+          print("hello");
+          b();
+        }
+      .packages: example:example_0.1.0
+    modules:
+      - example_0.1.0
+    expectedLibraryCount: 3
+    expectedContent:
+      org-dartlang-test:///main.dart:
+        - Procedure main
+      package:example/b.dart:
+        - Procedure b
+      package:example/a.dart:
+        - Procedure a
+        - Procedure la1
+  - entry: main.dart
+    worldType: updated
+    expectInitializeFromDill: false
+    sources:
+      main.dart: |
+        import "package:foo/foo.dart";
+        main() {
+          print("hello");
+          foo();
+        }
+      .packages: |
+        example:example_0.1.0
+        foo:foo_1
+    modules:
+      - example_0.1.0
+      - foo_1
+    expectedLibraryCount: 4
+    expectedContent:
+      org-dartlang-test:///main.dart:
+        - Procedure main
+      package:example/b.dart:
+        - Procedure b
+      package:example/a.dart:
+        - Procedure a
+        - Procedure la1
+      package:foo/foo.dart:
+        - Procedure foo
+        - Field foo1
+  - entry: main.dart
+    worldType: updated
+    expectInitializeFromDill: false
+    sources:
+      main.dart: |
+        import "package:foo/foo.dart";
+        main() {
+          print("hello");
+          foo();
+        }
+      .packages: |
+        example:example_0.1.1
+        foo:foo_2
+    modules:
+      - example_0.1.1
+      - foo_2
+    expectedLibraryCount: 5
+    expectedContent:
+      org-dartlang-test:///main.dart:
+        - Procedure main
+      package:example/b.dart:
+        - Procedure b
+        - Field example011
+      package:foo/foo.dart:
+        - Procedure foo
+        - Field foo2
+      package:foo/bar.dart:
+        - Procedure bar
+      package:foo/baz.dart:
+        - Procedure baz
diff --git a/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml b/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml
new file mode 100644
index 0000000..4d0a193
--- /dev/null
+++ b/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml
@@ -0,0 +1,73 @@
+# 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 a number of modules.
+# Compile again with changing modules.
+
+type: newworld
+strong: true
+modules:
+  example_1:
+    example_1/a.dart: |
+      a() {}
+      var example = true;
+    example_1/.packages: |
+      example:.
+  example_2:
+    example_2/a.dart: |
+      a() {}
+      var example = true;
+    example_2/.packages: |
+      example:.
+  foo:
+    foo/foo.dart: |
+      export "package:example/a.dart";
+      var foo = true;
+    foo/.packages: |
+      foo:.
+      example:../example_1
+worlds:
+  - entry: main.dart
+    fromComponent: true
+    sources:
+      main.dart: |
+        import "package:foo/foo.dart";
+        main() {
+          print("hello");
+          a();
+        }
+      .packages: |
+        foo:foo
+        example:example_1
+    modules:
+      - foo
+      - example_1
+    expectedLibraryCount: 3
+    expectedContent:
+      org-dartlang-test:///main.dart:
+        - Procedure main
+      package:foo/foo.dart:
+        - Field foo
+      package:example/a.dart:
+        - Procedure a
+        - Field example
+  - entry: main.dart
+    worldType: updated
+    expectInitializeFromDill: false
+    sources:
+      .packages: |
+        foo:foo
+        example:example_2
+    modules:
+      - foo
+      - example_2
+    expectedLibraryCount: 3
+    expectedContent:
+      org-dartlang-test:///main.dart:
+        - Procedure main
+      package:foo/foo.dart:
+        - Field foo
+      package:example/a.dart:
+        - Procedure a
+        - Field example
diff --git a/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml b/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml
new file mode 100644
index 0000000..7e64c8c
--- /dev/null
+++ b/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml
@@ -0,0 +1,64 @@
+# 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 a number of modules.
+# Compile again with changing modules.
+
+type: newworld
+strong: true
+modules:
+  foo:
+    foo/foo.dart: |
+      var foo = true;
+    foo/.packages: |
+      foo:.
+  foo2:
+    foo2/foo.dart: |
+      var foo2 = true;
+    foo2/.packages: |
+      foo:.
+worlds:
+  - entry: main.dart
+    fromComponent: true
+    simulateTransformer: true
+    sources:
+      main.dart: |
+        import "package:foo/foo.dart";
+        main() {
+          print(foo);
+        }
+      .packages: |
+        foo:foo
+    modules:
+      - foo
+    expectedLibraryCount: 2
+    expectedContent:
+      org-dartlang-test:///main.dart:
+        - Procedure main
+        - Field lalala_SimulateTransformer
+      package:foo/foo.dart:
+        - Field foo
+        - Field lalala_SimulateTransformer
+  - entry: main.dart
+    worldType: updated
+    expectInitializeFromDill: false
+    simulateTransformer: true
+    sources:
+      main.dart: |
+        import "package:foo/foo.dart";
+        main() {
+          print(foo2);
+        }
+      .packages: |
+        foo:foo2
+    modules:
+      - foo2
+    expectedLibraryCount: 2
+    expectedContent:
+      org-dartlang-test:///main.dart:
+        - Procedure main
+        - Field lalala_SimulateTransformer
+      package:foo/foo.dart:
+        - Field foo2
+        - Field lalala_SimulateTransformer
diff --git a/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml b/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml
new file mode 100644
index 0000000..08f0a4c
--- /dev/null
+++ b/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_non_package_unreferenced_libraries.yaml
@@ -0,0 +1,41 @@
+# 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 no packages and two libraries. Update the world
+# to now only include one library. The now no longer referenced library should
+# also have been removed from the uri to sources.
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        import "b.dart";
+        main() { b(); }
+      b.dart: |
+        b() {}
+    expectedLibraryCount: 2
+  - entry: main.dart
+    worldType: updated
+    invalidate:
+      - main.dart
+    expectInitializeFromDill: false
+    sources:
+      main.dart: |
+        main() {}
+    expectedLibraryCount: 1
+    uriToSourcesDoesntInclude:
+      - b.dart
+  - entry: main.dart
+    worldType: updated
+    invalidate:
+      - main.dart
+    expectInitializeFromDill: false
+    sources:
+      main.dart: |
+        main() {}
+    expectedLibraryCount: 1
+    uriToSourcesDoesntInclude:
+      - b.dart
diff --git a/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml b/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml
new file mode 100644
index 0000000..ef7857f
--- /dev/null
+++ b/front_end/testcases/incremental_initialize_from_dill/cleans_up_uritosource_unreferenced_package_library.yaml
@@ -0,0 +1,34 @@
+# 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 a package. Update the world so that the .packages
+# no longer reference the package (and the source no longe ruse it) and
+# recompile. The now no longer referenced package library should also have been
+# removed from the uri to sources.
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      .packages: example:pkg/example
+      main.dart: |
+        import "package:example/b.dart";
+        main() { b(); }
+      pkg/example/b.dart: |
+        b() {}
+    expectedLibraryCount: 2
+  - entry: main.dart
+    worldType: updated
+    invalidate:
+      - main.dart
+      - .packages
+    expectInitializeFromDill: false
+    sources:
+      .packages: 
+      main.dart: |
+        main() {}
+    expectedLibraryCount: 1
+    uriToSourcesDoesntInclude:
+      - pkg/example/b.dart
diff --git a/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml b/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml
new file mode 100644
index 0000000..4b1c653
--- /dev/null
+++ b/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml
@@ -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.md file.
+
+# Test that constant set literals works as expected.
+
+type: newworld
+strong: true
+worlds:
+  - entry: "main.dart"
+    sources:
+      main.dart: |
+        import 'lib.dart';
+
+        const Set<String> foo = {};
+        main() {
+          print(foo);
+          print(bar);
+        }
+      lib.dart: |
+        const Set<String> bar = {"hello", "world"};
+    expectedLibraryCount: 2
+  - entry: "main.dart"
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib.dart
+    sources:
+      lib.dart: |
+        const Set<int> bar = {42};
+    expectedLibraryCount: 2
diff --git a/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml b/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml
new file mode 100644
index 0000000..b426a33
--- /dev/null
+++ b/front_end/testcases/incremental_initialize_from_dill/expression_calculation_with_error.yaml
@@ -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.md file.
+
+# Compile a application.
+# Perform an expression calculation on it, where the expression gives a compile
+# time error.
+# Ask to compile again, and make sure we don't see the expression compilation
+# error.
+
+type: newworld
+strong: false
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        main() {
+          print("hello");
+        }
+    expectedLibraryCount: 1
+    expressionCompilation:
+      uri: main.dart
+      expression: foo()
+  - entry: main.dart
+    expectInitializeFromDill: false
+    worldType: updated
+    expectedLibraryCount: 1
diff --git a/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml b/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml
new file mode 100644
index 0000000..1a79746
--- /dev/null
+++ b/front_end/testcases/incremental_initialize_from_dill/flutter_mixin_failure_1.yaml
@@ -0,0 +1,63 @@
+# 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.
+
+# Regression test from flutter.
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        import 'lib.dart';
+
+        class Test extends Test2 {
+          Quux world() => null;
+        }
+
+        abstract class Test2 {
+          Baz world();
+        }
+      lib.dart: |
+        class FooEntry {}
+
+        class BarEntry extends FooEntry {}
+
+        abstract class FooTarget {
+          void hello(FooEntry entry);
+        }
+
+        abstract class Baz implements FooTarget {
+          void hello(covariant FooEntry entry) {}
+        }
+
+        mixin MyMixin on Baz {}
+
+        abstract class Qux extends Baz {
+          void hello(BarEntry entry) {}
+        }
+
+        class Quux extends Qux with MyMixin {}
+    expectedLibraryCount: 2
+  - entry: main.dart
+    worldType: updated
+    invalidate:
+      - main.dart
+    expectInitializeFromDill: false
+    sources:
+      main.dart: |
+        import 'lib.dart';
+
+        class Test extends Test2 {
+          Quux world() => null;
+        }
+
+        abstract class Test2 {
+          Baz world();
+        }
+
+        main() {
+          print(new Test());
+        }
+    expectedLibraryCount: 2
diff --git a/front_end/testcases/incremental_initialize_from_dill/outline_only.yaml b/front_end/testcases/incremental_initialize_from_dill/outline_only.yaml
new file mode 100644
index 0000000..5bfb458
--- /dev/null
+++ b/front_end/testcases/incremental_initialize_from_dill/outline_only.yaml
@@ -0,0 +1,17 @@
+# 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.
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        main() {
+          print("hello");
+          b();
+        }
+    outlineOnly: true
\ No newline at end of file
diff --git a/front_end/testcases/incremental_initialize_from_dill/outline_only_2.yaml b/front_end/testcases/incremental_initialize_from_dill/outline_only_2.yaml
new file mode 100644
index 0000000..0105f44
--- /dev/null
+++ b/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/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml b/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml
new file mode 100644
index 0000000..c5164e2
--- /dev/null
+++ b/front_end/testcases/incremental_initialize_from_dill/reissue_errors_5.yaml
@@ -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.md file.
+
+# Compile an application with errors in it, then - without fixing the errors -
+# recompile. Make sure we still get errors. As long as we don't fix the error,
+# we keep getting errors. Once we fix it, we no longer get errors.
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      .packages: mypackage:mypackage
+      main.dart: |
+        import "package:mypackage/a.dart" as a;
+
+        main() {
+          a.main();
+        }
+      mypackage/a.dart: |
+        import "package:mypackage/b.dart";
+
+        main() {
+          foo();
+        }
+      mypackage/b.dart: |
+        foo() {
+          bar();
+        }
+    expectedLibraryCount: 3
+    errors: true
+  - entry: main.dart
+    errors: true
+    worldType: updated
+    expectInitializeFromDill: false
+    expectedLibraryCount: 3
+  - entry: main.dart
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - package:mypackage/a.dart
+    sources:
+      mypackage/a.dart: |
+        import "package:mypackage/b.dart";
+
+        main() {
+          foo();
+          foo();
+        }
+    expectedLibraryCount: 3
+    errors: true
+  - entry: main.dart
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - package:mypackage/a.dart
+    sources:
+      mypackage/a.dart: |
+        main() {
+          foo();
+          foo();
+        }
+
+        foo() {}
+    expectedLibraryCount: 2
+    errors: false
\ No newline at end of file
diff --git a/front_end/testcases/inference/async_closure_return_type_flatten.dart b/front_end/testcases/inference/async_closure_return_type_flatten.dart
index deab006..2f2fe1b 100644
--- a/front_end/testcases/inference/async_closure_return_type_flatten.dart
+++ b/front_end/testcases/inference/async_closure_return_type_flatten.dart
@@ -8,10 +8,8 @@
 import 'dart:async';
 
 Future<int> futureInt = null;
-var /*@topType=() -> Future<int>*/ f = /*@returnType=Future<int>*/ () =>
-    futureInt;
-var /*@topType=() -> Future<int>*/ g = /*@returnType=Future<int>*/ () async =>
-    futureInt;
+var f = /*@returnType=Future<int>*/ () => futureInt;
+var g = /*@returnType=Future<int>*/ () async => futureInt;
 
 main() {
   f;
diff --git a/front_end/testcases/inference/async_closure_return_type_future.dart b/front_end/testcases/inference/async_closure_return_type_future.dart
index 5fbc5aa..0abd1b3 100644
--- a/front_end/testcases/inference/async_closure_return_type_future.dart
+++ b/front_end/testcases/inference/async_closure_return_type_future.dart
@@ -5,8 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=() -> Future<int>*/ f = /*@returnType=Future<int>*/ () async =>
-    0;
+var f = /*@returnType=Future<int>*/ () async => 0;
 
 main() {
   f;
diff --git a/front_end/testcases/inference/async_closure_return_type_future_or.dart b/front_end/testcases/inference/async_closure_return_type_future_or.dart
index 3404437..086bedf 100644
--- a/front_end/testcases/inference/async_closure_return_type_future_or.dart
+++ b/front_end/testcases/inference/async_closure_return_type_future_or.dart
@@ -8,10 +8,8 @@
 import 'dart:async';
 
 FutureOr<int> futureOrInt = null;
-var /*@topType=() -> FutureOr<int>*/ f = /*@returnType=FutureOr<int>*/ () =>
-    futureOrInt;
-var /*@topType=() -> Future<int>*/ g = /*@returnType=Future<int>*/ () async =>
-    futureOrInt;
+var f = /*@returnType=FutureOr<int>*/ () => futureOrInt;
+var g = /*@returnType=Future<int>*/ () async => futureOrInt;
 
 main() {
   f;
diff --git a/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart b/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart
index 94e4661..9e190d1 100644
--- a/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart
+++ b/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart
@@ -6,7 +6,7 @@
 library test;
 
 String f() => null;
-var /*@topType=() -> String*/ g = f;
+var g = f;
 
 main() {
   f;
diff --git a/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart b/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
index f640d14..3901551 100644
--- a/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
+++ b/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=dynamic*/ h = null;
+var h = null;
 void foo(int f(Object _)) {}
 
 test() {
diff --git a/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect b/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect
index 2c4de0d..14d415b 100644
--- a/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect
+++ b/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart:17:5: Context: Write to f@369
+pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart:17:5: Context: Write to f@348
   f = /*error:INVALID_CAST_FUNCTION_EXPR*/ /*@returnType=Null*/ (/*@type=Object*/ x) =>
     ^
diff --git a/front_end/testcases/inference/block_bodied_lambdas_returns.dart b/front_end/testcases/inference/block_bodied_lambdas_returns.dart
index e385138..852fb3f 100644
--- a/front_end/testcases/inference/block_bodied_lambdas_returns.dart
+++ b/front_end/testcases/inference/block_bodied_lambdas_returns.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.
 
-/*@testedFeatures=warning,inference*/
+/*@testedFeatures=inference*/
 library test;
 
 main() {
@@ -32,7 +32,7 @@
   };
   var /*@type=(bool) -> int*/ g = /*@returnType=int*/ (bool b) {
     if (b) {
-      /*@warning=ReturnWithoutExpression*/ return;
+      return;
     } else {
       return 0;
     }
@@ -62,7 +62,7 @@
     if (b) {
       return 0;
     } else {
-      /*@warning=ReturnWithoutExpression*/ return;
+      return;
     }
   };
   var /*@type=(bool) -> int*/ l = /*@returnType=int*/ (bool b) {
diff --git a/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect b/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
index a4231bb..6d433ff 100644
--- a/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
+++ b/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:35:44: Warning: Must explicitly return a value from a non-void function.
-//       /*@warning=ReturnWithoutExpression*/ return;
-//                                            ^
+// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:35:7: Warning: Must explicitly return a value from a non-void function.
+//       return;
+//       ^
 //
-// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:65:44: Warning: Must explicitly return a value from a non-void function.
-//       /*@warning=ReturnWithoutExpression*/ return;
-//                                            ^
+// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:65:7: Warning: Must explicitly return a value from a non-void function.
+//       return;
+//       ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect b/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
index a4231bb..6d433ff 100644
--- a/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
+++ b/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:35:44: Warning: Must explicitly return a value from a non-void function.
-//       /*@warning=ReturnWithoutExpression*/ return;
-//                                            ^
+// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:35:7: Warning: Must explicitly return a value from a non-void function.
+//       return;
+//       ^
 //
-// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:65:44: Warning: Must explicitly return a value from a non-void function.
-//       /*@warning=ReturnWithoutExpression*/ return;
-//                                            ^
+// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:65:7: Warning: Must explicitly return a value from a non-void function.
+//       return;
+//       ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/front_end/testcases/inference/bottom.dart b/front_end/testcases/inference/bottom.dart
index 567246e..99a196f 100644
--- a/front_end/testcases/inference/bottom.dart
+++ b/front_end/testcases/inference/bottom.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=dynamic*/ v = null;
+var v = null;
 
 main() {
   v;
diff --git a/front_end/testcases/inference/bottom_in_closure.dart b/front_end/testcases/inference/bottom_in_closure.dart
index a1be850..d375da9 100644
--- a/front_end/testcases/inference/bottom_in_closure.dart
+++ b/front_end/testcases/inference/bottom_in_closure.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=() -> Null*/ v = /*@returnType=Null*/ () => null;
+var v = /*@returnType=Null*/ () => null;
 
 main() {
   v;
diff --git a/front_end/testcases/inference/bug30251.dart b/front_end/testcases/inference/bug30251.dart
index 63e0ffa..98c6b1e 100644
--- a/front_end/testcases/inference/bug30251.dart
+++ b/front_end/testcases/inference/bug30251.dart
@@ -8,7 +8,7 @@
 T f<T>(T t) => t;
 
 class C {
-  final /*@topType=dynamic*/ x;
+  final x;
   C(int p) : x = /*@typeArgs=int*/ f(1 /*@target=num::+*/ + p);
 }
 
diff --git a/front_end/testcases/inference/bug31132.dart b/front_end/testcases/inference/bug31132.dart
index 9e69bff..234be9a 100644
--- a/front_end/testcases/inference/bug31132.dart
+++ b/front_end/testcases/inference/bug31132.dart
@@ -8,7 +8,7 @@
 class B {}
 
 class C extends B {
-  var /*@topType=dynamic*/ z;
+  var z;
 }
 
 void test(B x) {
diff --git a/front_end/testcases/inference/bug31132.dart.type_promotion.expect b/front_end/testcases/inference/bug31132.dart.type_promotion.expect
index 101f24d..8387b10 100644
--- a/front_end/testcases/inference/bug31132.dart.type_promotion.expect
+++ b/front_end/testcases/inference/bug31132.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/bug31132.dart:15:25: Context: Possible promotion of x@339
+pkg/front_end/testcases/inference/bug31132.dart:15:25: Context: Possible promotion of x@318
   var /*@type=C*/ y = x is C ? /*@promotedType=C*/ x : new C();
                         ^^
diff --git a/front_end/testcases/inference/callable_generic_class.dart.legacy.expect b/front_end/testcases/inference/callable_generic_class.dart.legacy.expect
index 19abeae..0423f11 100644
--- a/front_end/testcases/inference/callable_generic_class.dart.legacy.expect
+++ b/front_end/testcases/inference/callable_generic_class.dart.legacy.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P>
     : super core::Object::•()
     ;
-  method call([self::ActionDispatcher::P value = null]) → void {}
+  method call([generic-covariant-impl self::ActionDispatcher::P value = null]) → void {}
 }
 class Bar extends core::Object {
   synthetic constructor •() → self::Bar
diff --git a/front_end/testcases/inference/callable_generic_class.dart.legacy.transformed.expect b/front_end/testcases/inference/callable_generic_class.dart.legacy.transformed.expect
index 19abeae..0423f11 100644
--- a/front_end/testcases/inference/callable_generic_class.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/callable_generic_class.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P>
     : super core::Object::•()
     ;
-  method call([self::ActionDispatcher::P value = null]) → void {}
+  method call([generic-covariant-impl self::ActionDispatcher::P value = null]) → void {}
 }
 class Bar extends core::Object {
   synthetic constructor •() → self::Bar
diff --git a/front_end/testcases/inference/callable_generic_class.dart.outline.expect b/front_end/testcases/inference/callable_generic_class.dart.outline.expect
index 186f5b0..013bfca 100644
--- a/front_end/testcases/inference/callable_generic_class.dart.outline.expect
+++ b/front_end/testcases/inference/callable_generic_class.dart.outline.expect
@@ -5,7 +5,7 @@
 class ActionDispatcher<P extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P>
     ;
-  method call([self::ActionDispatcher::P value]) → void
+  method call([generic-covariant-impl self::ActionDispatcher::P value]) → void
     ;
 }
 class Bar extends core::Object {
diff --git a/front_end/testcases/inference/circular_method_inference.dart b/front_end/testcases/inference/circular_method_inference.dart
index a5492c9..73ac166 100644
--- a/front_end/testcases/inference/circular_method_inference.dart
+++ b/front_end/testcases/inference/circular_method_inference.dart
@@ -10,11 +10,11 @@
 // that causes type inference for the method `f` to go into an infinite loop.
 
 abstract class A extends B {
-  /*@topType=dynamic*/ f(/*@topType=dynamic*/ x);
+  f(x);
 }
 
 abstract class B extends A {
-  /*@topType=dynamic*/ f(/*@topType=dynamic*/ x);
+  f(x);
 }
 
 main() {}
diff --git a/front_end/testcases/inference/circular_reference_via_closures.dart b/front_end/testcases/inference/circular_reference_via_closures.dart
index 2e499a1..b63fb9a 100644
--- a/front_end/testcases/inference/circular_reference_via_closures.dart
+++ b/front_end/testcases/inference/circular_reference_via_closures.dart
@@ -2,12 +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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-    y;
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-    x;
+var x = /*@returnType=invalid-type*/ () => y;
+var y = /*@returnType=invalid-type*/ () => x;
 
 main() {}
diff --git a/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect b/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
index 5b3b71c..73adfd1 100644
--- a/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
+++ b/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:9:5: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var y = /*@returnType=invalid-type*/ () => x;
+//     ^
 //
-// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:5: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var x = /*@returnType=invalid-type*/ () => y;
+//     ^
 //
 import self as self;
 
-static field dynamic x = () → dynamic => self::y;
-static field dynamic y = () → dynamic => self::x;
+static field invalid-type x = (() → invalid-type => self::y) as{TypeError} invalid-type;
+static field invalid-type y = (() → invalid-type => self::x) as{TypeError} invalid-type;
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect b/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
index 5b3b71c..73adfd1 100644
--- a/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
+++ b/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:9:5: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var y = /*@returnType=invalid-type*/ () => x;
+//     ^
 //
-// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:5: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var x = /*@returnType=invalid-type*/ () => y;
+//     ^
 //
 import self as self;
 
-static field dynamic x = () → dynamic => self::y;
-static field dynamic y = () → dynamic => self::x;
+static field invalid-type x = (() → invalid-type => self::y) as{TypeError} invalid-type;
+static field invalid-type y = (() → invalid-type => self::x) as{TypeError} invalid-type;
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart b/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart
index 2e499a1..b63fb9a 100644
--- a/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart
+++ b/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart
@@ -2,12 +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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-    y;
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-    x;
+var x = /*@returnType=invalid-type*/ () => y;
+var y = /*@returnType=invalid-type*/ () => x;
 
 main() {}
diff --git a/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect b/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
index a4e4a26..4f81f83 100644
--- a/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
+++ b/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:9:5: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var y = /*@returnType=invalid-type*/ () => x;
+//     ^
 //
-// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:5: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var x = /*@returnType=invalid-type*/ () => y;
+//     ^
 //
 import self as self;
 
-static field dynamic x = () → dynamic => self::y;
-static field dynamic y = () → dynamic => self::x;
+static field invalid-type x = (() → invalid-type => self::y) as{TypeError} invalid-type;
+static field invalid-type y = (() → invalid-type => self::x) as{TypeError} invalid-type;
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect b/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
index a4e4a26..4f81f83 100644
--- a/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
+++ b/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:10:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:9:5: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var y = /*@returnType=invalid-type*/ () => x;
+//     ^
 //
-// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:5: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var x = /*@returnType=invalid-type*/ () => y;
+//     ^
 //
 import self as self;
 
-static field dynamic x = () → dynamic => self::y;
-static field dynamic y = () → dynamic => self::x;
+static field invalid-type x = (() → invalid-type => self::y) as{TypeError} invalid-type;
+static field invalid-type y = (() → invalid-type => self::x) as{TypeError} invalid-type;
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference/conditional_lub.dart b/front_end/testcases/inference/conditional_lub.dart
index cab1316..a6b43a6 100644
--- a/front_end/testcases/inference/conditional_lub.dart
+++ b/front_end/testcases/inference/conditional_lub.dart
@@ -8,7 +8,7 @@
 bool b = true;
 int x = 0;
 double y = 0.0;
-var /*@topType=num*/ z = b ? x : y;
+var z = b ? x : y;
 
 main() {
   var /*@type=num*/ z = b ? x : y;
diff --git a/front_end/testcases/inference/conflicting_fields.dart b/front_end/testcases/inference/conflicting_fields.dart
index 0c53592..72edc67 100644
--- a/front_end/testcases/inference/conflicting_fields.dart
+++ b/front_end/testcases/inference/conflicting_fields.dart
@@ -15,8 +15,8 @@
 }
 
 class B extends A implements I {
-  get /*@topType=dynamic*/field1 => null;
-  get /*@topType=dynamic*/field2 => null;
+  get field1 => null;
+  get field2 => null;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/conflicting_fields.dart.strong.expect b/front_end/testcases/inference/conflicting_fields.dart.strong.expect
index be7339f..3f45ef6 100644
--- a/front_end/testcases/inference/conflicting_fields.dart.strong.expect
+++ b/front_end/testcases/inference/conflicting_fields.dart.strong.expect
@@ -2,28 +2,28 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:18:27: Error: Can't infer a type for 'field1' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a type for 'field1' as some of the inherited members have different types.
 // Try adding an explicit type.
-//   get /*@topType=dynamic*/field1 => null;
-//                           ^
+//   get field1 => null;
+//       ^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:19:27: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
 // Try adding an explicit type.
-//   get /*@topType=dynamic*/field2 => null;
-//                           ^
+//   get field2 => null;
+//       ^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:19:27: Error: The return type of the method 'B.field2' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'A.field2'.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: The return type of the method 'B.field2' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'A.field2'.
 // Change to a subtype of 'int'.
-//   get /*@topType=dynamic*/field2 => null;
-//                           ^
+//   get field2 => null;
+//       ^
 // pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is the overridden method ('field2').
 //   int field2;
 //       ^
 //
-// pkg/front_end/testcases/inference/conflicting_fields.dart:18:27: Error: The return type of the method 'B.field1' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'I.field1'.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: The return type of the method 'B.field1' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'I.field1'.
 // Change to a subtype of 'int'.
-//   get /*@topType=dynamic*/field1 => null;
-//                           ^
+//   get field1 => null;
+//       ^
 // pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is the overridden method ('field1').
 //   int field1;
 //       ^
diff --git a/front_end/testcases/inference/conflicts_can_happen.dart b/front_end/testcases/inference/conflicts_can_happen.dart
index ce73f69..6679d6e 100644
--- a/front_end/testcases/inference/conflicts_can_happen.dart
+++ b/front_end/testcases/inference/conflicts_can_happen.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 class I1 {
@@ -22,14 +22,12 @@
 }
 
 class C1 implements A, B {
-  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-      null;
+  get a => null;
 }
 
 // Still ambiguous
 class C2 implements B, A {
-  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-      null;
+  get a => null;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect b/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
index fd0caa9..6e8c47d 100644
--- a/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
+++ b/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
@@ -2,48 +2,48 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: Can't infer a type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a type for 'a' as some of the inherited members have different types.
 // Try adding an explicit type.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-//                                                                                                                                                                   ^
+//   get a => null;
+//       ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: Can't infer a type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a type for 'a' as some of the inherited members have different types.
 // Try adding an explicit type.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-//                                                                                                                                                                   ^
+//   get a => null;
+//       ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1.a' is 'dynamic', which does not match the return type, 'I1', of the overridden method, 'A.a'.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: The return type of the method 'C1.a' is 'dynamic', which does not match the return type, 'I1', of the overridden method, 'A.a'.
 //  - 'I1' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
 // Change to a subtype of 'I1'.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-//                                                                                                                                                                   ^
+//   get a => null;
+//       ^
 // pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is the overridden method ('a').
 //   final I1 a = null;
 //            ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1.a' is 'dynamic', which does not match the return type, 'I2', of the overridden method, 'B.a'.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: The return type of the method 'C1.a' is 'dynamic', which does not match the return type, 'I2', of the overridden method, 'B.a'.
 //  - 'I2' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
 // Change to a subtype of 'I2'.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-//                                                                                                                                                                   ^
+//   get a => null;
+//       ^
 // pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is the overridden method ('a').
 //   final I2 a = null;
 //            ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type, 'I2', of the overridden method, 'B.a'.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type, 'I2', of the overridden method, 'B.a'.
 //  - 'I2' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
 // Change to a subtype of 'I2'.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-//                                                                                                                                                                   ^
+//   get a => null;
+//       ^
 // pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is the overridden method ('a').
 //   final I2 a = null;
 //            ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type, 'I1', of the overridden method, 'A.a'.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type, 'I1', of the overridden method, 'A.a'.
 //  - 'I1' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
 // Change to a subtype of 'I1'.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-//                                                                                                                                                                   ^
+//   get a => null;
+//       ^
 // pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is the overridden method ('a').
 //   final I1 a = null;
 //            ^
diff --git a/front_end/testcases/inference/conflicts_can_happen2.dart b/front_end/testcases/inference/conflicts_can_happen2.dart
index 150baa5..65a929e 100644
--- a/front_end/testcases/inference/conflicts_can_happen2.dart
+++ b/front_end/testcases/inference/conflicts_can_happen2.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 class I1 {
@@ -31,8 +31,7 @@
 }
 
 class C2 implements A, B {
-  get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-      null;
+  get a => null;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect b/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
index 292f0b7..411506a 100644
--- a/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
+++ b/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: Can't infer a type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a type for 'a' as some of the inherited members have different types.
 // Try adding an explicit type.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-//                                                                                                                                                                   ^
+//   get a => null;
+//       ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type, 'I1', of the overridden method, 'A.a'.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type, 'I1', of the overridden method, 'A.a'.
 //  - 'I1' is from 'pkg/front_end/testcases/inference/conflicts_can_happen2.dart'.
 // Change to a subtype of 'I1'.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-//                                                                                                                                                                   ^
+//   get a => null;
+//       ^
 // pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is the overridden method ('a').
 //   final I1 a = null;
 //            ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type, 'I2', of the overridden method, 'B.a'.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type, 'I2', of the overridden method, 'B.a'.
 //  - 'I2' is from 'pkg/front_end/testcases/inference/conflicts_can_happen2.dart'.
 // Change to a subtype of 'I2'.
-//   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
-//                                                                                                                                                                   ^
+//   get a => null;
+//       ^
 // pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is the overridden method ('a').
 //   final I2 a = null;
 //            ^
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.expect b/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.expect
index 67e376b..afd777c 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t;
+  generic-covariant-impl field self::C::T t;
   constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.transformed.expect b/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.transformed.expect
index 67e376b..afd777c 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t;
+  generic-covariant-impl field self::C::T t;
   constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.expect b/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.expect
index e84c59d..3a5a56b 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t = null;
+  generic-covariant-impl field self::C::T t = null;
   constructor _() → self::C<self::C::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.transformed.expect b/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.transformed.expect
index e84c59d..3a5a56b 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t = null;
+  generic-covariant-impl field self::C::T t = null;
   constructor _() → self::C<self::C::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.expect b/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.expect
index 0e2824f..523f87e 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  field self::A<self::A::T> f = new self::A::•<dynamic>();
+  generic-covariant-impl field self::A<self::A::T> f = new self::A::•<dynamic>();
   constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.transformed.expect b/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.transformed.expect
index 0e2824f..523f87e 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  field self::A<self::A::T> f = new self::A::•<dynamic>();
+  generic-covariant-impl field self::A<self::A::T> f = new self::A::•<dynamic>();
   constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.expect b/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.expect
index 3aaa8b1..12938f7 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t = null;
+  generic-covariant-impl field self::C::T t = null;
   constructor named(core::List<self::C::T> t) → self::C<self::C::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.transformed.expect b/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.transformed.expect
index 3aaa8b1..12938f7 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t = null;
+  generic-covariant-impl field self::C::T t = null;
   constructor named(core::List<self::C::T> t) → self::C<self::C::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.expect b/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.expect
index 4761f0f..d35dcf3 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t = null;
+  generic-covariant-impl field self::C::T t = null;
   constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.transformed.expect b/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.transformed.expect
index 4761f0f..d35dcf3 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t = null;
+  generic-covariant-impl field self::C::T t = null;
   constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.expect b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.expect
index 0dd3c05..6ad8fb3 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t;
+  generic-covariant-impl field self::C::T t;
   constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.transformed.expect b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.transformed.expect
index 0dd3c05..6ad8fb3 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t;
+  generic-covariant-impl field self::C::T t;
   constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.expect b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.expect
index 8b7170d..a9f6850 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.expect
@@ -5,12 +5,12 @@
 abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
-  abstract set t(self::C::T x) → void;
+  abstract set t(generic-covariant-impl self::C::T x) → void;
   static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
 class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  field self::CImpl::T t;
+  generic-covariant-impl field self::CImpl::T t;
   constructor •(self::CImpl::T t) → self::CImpl<self::CImpl::T>
     : self::CImpl::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.transformed.expect b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.transformed.expect
index 8b7170d..a9f6850 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.transformed.expect
@@ -5,12 +5,12 @@
 abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
-  abstract set t(self::C::T x) → void;
+  abstract set t(generic-covariant-impl self::C::T x) → void;
   static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
 class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  field self::CImpl::T t;
+  generic-covariant-impl field self::CImpl::T t;
   constructor •(self::CImpl::T t) → self::CImpl<self::CImpl::T>
     : self::CImpl::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.expect b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.expect
index 2efa6f7..c8c111e 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.expect
@@ -5,12 +5,12 @@
 abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
-  abstract set t(self::C::T x) → void;
+  abstract set t(generic-covariant-impl self::C::T x) → void;
   static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
 class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  field self::CImpl::T t;
+  generic-covariant-impl field self::CImpl::T t;
   constructor _(self::CImpl::T t) → self::CImpl<self::CImpl::T>
     : self::CImpl::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.transformed.expect b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.transformed.expect
index 2efa6f7..c8c111e 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.transformed.expect
@@ -5,12 +5,12 @@
 abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
-  abstract set t(self::C::T x) → void;
+  abstract set t(generic-covariant-impl self::C::T x) → void;
   static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
 class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  field self::CImpl::T t;
+  generic-covariant-impl field self::CImpl::T t;
   constructor _(self::CImpl::T t) → self::CImpl<self::CImpl::T>
     : self::CImpl::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect
index 579d4cf..2385460 100644
--- a/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect
+++ b/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect
@@ -5,12 +5,12 @@
 abstract class C<T extends core::Object = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
   abstract get t() → self::C::T;
-  abstract set t(self::C::T x) → void;
+  abstract set t(generic-covariant-impl self::C::T x) → void;
   static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
     let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
 }
 class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  field self::CImpl::T t;
+  generic-covariant-impl field self::CImpl::T t;
   constructor _(self::CImpl::T t) → self::CImpl<self::CImpl::T>
     ;
   static factory •<T extends core::Object = dynamic>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
diff --git a/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.expect b/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.expect
index c5caad7..e3c5f4a 100644
--- a/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.expect
+++ b/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.expect
@@ -8,8 +8,8 @@
     ;
 }
 class Pair<T extends self::Clonable<self::Pair::T> = dynamic, U extends self::Clonable<self::Pair::U> = dynamic> extends core::Object {
-  field self::Pair::T t;
-  field self::Pair::U u;
+  generic-covariant-impl field self::Pair::T t;
+  generic-covariant-impl field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
     : self::Pair::t = t, self::Pair::u = u, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.transformed.expect b/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.transformed.expect
index c5caad7..e3c5f4a 100644
--- a/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.transformed.expect
@@ -8,8 +8,8 @@
     ;
 }
 class Pair<T extends self::Clonable<self::Pair::T> = dynamic, U extends self::Clonable<self::Pair::U> = dynamic> extends core::Object {
-  field self::Pair::T t;
-  field self::Pair::U u;
+  generic-covariant-impl field self::Pair::T t;
+  generic-covariant-impl field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
     : self::Pair::t = t, self::Pair::u = u, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect b/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
index 006b8a2..8337c9e 100644
--- a/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
+++ b/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
@@ -7,8 +7,8 @@
     ;
 }
 class Pair<T extends self::Clonable<self::Pair::T> = dynamic, U extends self::Clonable<self::Pair::U> = dynamic> extends core::Object {
-  field self::Pair::T t;
-  field self::Pair::U u;
+  generic-covariant-impl field self::Pair::T t;
+  generic-covariant-impl field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
     ;
   constructor _() → self::Pair<self::Pair::T, self::Pair::U>
diff --git a/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.expect b/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.expect
index 65cb4b4..0a86feb 100644
--- a/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.expect
+++ b/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  field self::Pair::T t;
-  field self::Pair::U u;
+  generic-covariant-impl field self::Pair::T t;
+  generic-covariant-impl field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
     : self::Pair::t = t, self::Pair::u = u, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.transformed.expect b/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.transformed.expect
index 65cb4b4..0a86feb 100644
--- a/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  field self::Pair::T t;
-  field self::Pair::U u;
+  generic-covariant-impl field self::Pair::T t;
+  generic-covariant-impl field self::Pair::U u;
   constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
     : self::Pair::t = t, self::Pair::u = u, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart b/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart
index ee8b2d1..3eacb18 100644
--- a/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart
+++ b/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart
@@ -5,15 +5,15 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=dynamic*/ x = null;
-var /*@topType=int*/ y = 3;
+var x = null;
+var y = 3;
 
 class A {
-  static var /*@topType=dynamic*/ x = null;
-  static var /*@topType=int*/ y = 3;
+  static var x = null;
+  static var y = 3;
 
-  var /*@topType=dynamic*/ x2 = null;
-  var /*@topType=int*/ y2 = 3;
+  var x2 = null;
+  var y2 = 3;
 }
 
 main() {
diff --git a/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart b/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart
index 3d735e5..a2a520c 100644
--- a/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart
+++ b/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart
@@ -10,7 +10,7 @@
 }
 
 class B implements A {
-  final /*@topType=Iterable<String>*/ foo = /*@typeArgs=String*/ const [];
+  final foo = /*@typeArgs=String*/ const [];
 }
 
 void main() {}
diff --git a/front_end/testcases/inference/downwards_inference_annotations_class_members.dart b/front_end/testcases/inference/downwards_inference_annotations_class_members.dart
index 37db38e..239edeb 100644
--- a/front_end/testcases/inference/downwards_inference_annotations_class_members.dart
+++ b/front_end/testcases/inference/downwards_inference_annotations_class_members.dart
@@ -14,7 +14,7 @@
   Bar();
 
   @Foo(/*@typeArgs=String*/ const [])
-  var /*@topType=dynamic*/ x;
+  var x;
 
   @Foo(/*@typeArgs=String*/ const [])
   void f();
diff --git a/front_end/testcases/inference/downwards_inference_annotations_parameter.dart b/front_end/testcases/inference/downwards_inference_annotations_parameter.dart
index e4a9dea..7b0ab28 100644
--- a/front_end/testcases/inference/downwards_inference_annotations_parameter.dart
+++ b/front_end/testcases/inference/downwards_inference_annotations_parameter.dart
@@ -12,7 +12,7 @@
 void f(@Foo(/*@typeArgs=String*/ const []) x) {}
 
 class C {
-  void m(@Foo(/*@typeArgs=String*/ const []) /*@topType=dynamic*/ x) {}
+  void m(@Foo(/*@typeArgs=String*/ const []) x) {}
 }
 
 main() {}
diff --git a/front_end/testcases/inference/downwards_inference_inside_top_level.dart b/front_end/testcases/inference/downwards_inference_inside_top_level.dart
index a3abe27..c50d687 100644
--- a/front_end/testcases/inference/downwards_inference_inside_top_level.dart
+++ b/front_end/testcases/inference/downwards_inference_inside_top_level.dart
@@ -13,8 +13,7 @@
   B(T x);
 }
 
-var /*@topType=A*/ t1 = new A()
-  .. /*@target=A::b*/ b = new /*@typeArgs=int*/ B(1);
-var /*@topType=List<B<int>>*/ t2 = <B<int>>[new /*@typeArgs=int*/ B(2)];
+var t1 = new A().. /*@target=A::b*/ b = new /*@typeArgs=int*/ B(1);
+var t2 = <B<int>>[new /*@typeArgs=int*/ B(2)];
 
 main() {}
diff --git a/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart b/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart
index 6d4662c..aec027f 100644
--- a/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart
+++ b/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart
@@ -9,6 +9,6 @@
   A(T x);
 }
 
-var /*@topType=List<A<int>>*/ t1 = <A<int>>[new /*@typeArgs=int*/ A(1)];
+var t1 = <A<int>>[new /*@typeArgs=int*/ A(1)];
 
 main() {}
diff --git a/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.expect b/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.expect
index c462d74..c641be2 100644
--- a/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.expect
+++ b/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
-  field self::A::S x;
-  field self::A::T y;
+  generic-covariant-impl field self::A::S x;
+  generic-covariant-impl field self::A::T y;
   constructor •(self::A::S x, self::A::T y) → self::A<self::A::S, self::A::T>
     : self::A::x = x, self::A::y = y, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.transformed.expect b/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.transformed.expect
index c462d74..c641be2 100644
--- a/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
-  field self::A::S x;
-  field self::A::T y;
+  generic-covariant-impl field self::A::S x;
+  generic-covariant-impl field self::A::T y;
   constructor •(self::A::S x, self::A::T y) → self::A<self::A::S, self::A::T>
     : self::A::x = x, self::A::y = y, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart b/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart
index ba11a16..3e0ba76 100644
--- a/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart
+++ b/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart
@@ -21,8 +21,7 @@
   AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf;
   AsserterBuilder<List<Asserter<DartType>>, DartType> get assertDOf;
 
-  /*@topType=dynamic*/ method(
-      AsserterBuilder<List<Asserter<DartType>>, DartType> assertEOf) {
+  method(AsserterBuilder<List<Asserter<DartType>>, DartType> assertEOf) {
     /*@target=C::assertAOf*/ assertAOf(
         /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
     assertBOf(
@@ -40,8 +39,7 @@
   AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf;
   AsserterBuilder<List<Asserter<DartType>>, DartType> get assertDOf;
 
-  /*@topType=dynamic*/ method(
-      AsserterBuilder<List<Asserter<DartType>>, DartType> assertEOf) {
+  method(AsserterBuilder<List<Asserter<DartType>>, DartType> assertEOf) {
     /*@target=G::assertAOf*/ assertAOf(
         /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
     this. /*@target=G::assertAOf*/ assertAOf(
diff --git a/front_end/testcases/inference/field_initializer_context_implicit.dart b/front_end/testcases/inference/field_initializer_context_implicit.dart
index e2e94bf..328482d 100644
--- a/front_end/testcases/inference/field_initializer_context_implicit.dart
+++ b/front_end/testcases/inference/field_initializer_context_implicit.dart
@@ -8,7 +8,7 @@
 T f<T>() => null;
 
 class C implements B {
-  final /*@topType=int*/ x;
+  final x;
   C() : x = /*@typeArgs=int*/ f();
 }
 
diff --git a/front_end/testcases/inference/field_initializer_parameter.dart b/front_end/testcases/inference/field_initializer_parameter.dart
index fc2a1fa..f8779f9 100644
--- a/front_end/testcases/inference/field_initializer_parameter.dart
+++ b/front_end/testcases/inference/field_initializer_parameter.dart
@@ -8,7 +8,7 @@
 T f<T>(T t) => t;
 
 class C {
-  final /*@topType=dynamic*/ x;
+  final x;
   C(int p) : x = /*@typeArgs=int*/ f(p);
 }
 
diff --git a/front_end/testcases/inference/field_refers_to_static_getter.dart b/front_end/testcases/inference/field_refers_to_static_getter.dart
index de4f471..9fa9e35 100644
--- a/front_end/testcases/inference/field_refers_to_static_getter.dart
+++ b/front_end/testcases/inference/field_refers_to_static_getter.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C {
-  final /*@topType=int*/ x = _x;
+  final x = _x;
   static int get _x => null;
 }
 
diff --git a/front_end/testcases/inference/field_refers_to_top_level_getter.dart b/front_end/testcases/inference/field_refers_to_top_level_getter.dart
index 5bcd783..1a2e6a6 100644
--- a/front_end/testcases/inference/field_refers_to_top_level_getter.dart
+++ b/front_end/testcases/inference/field_refers_to_top_level_getter.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C {
-  final /*@topType=int*/ x = y;
+  final x = y;
 }
 
 int get y => null;
diff --git a/front_end/testcases/inference/future_then.dart b/front_end/testcases/inference/future_then.dart
index 75782a4..ec52859 100644
--- a/front_end/testcases/inference/future_then.dart
+++ b/front_end/testcases/inference/future_then.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then.dart.legacy.expect b/front_end/testcases/inference/future_then.dart.legacy.expect
index 1d88ee8..88b6639 100644
--- a/front_end/testcases/inference/future_then.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then.dart.legacy.transformed.expect
index 4f27ec5..4f440e2 100644
--- a/front_end/testcases/inference/future_then.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then.dart.outline.expect b/front_end/testcases/inference/future_then.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then.dart.outline.expect
+++ b/front_end/testcases/inference/future_then.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_2.dart b/front_end/testcases/inference/future_then_2.dart
index f5f9def..7dd9d8f 100644
--- a/front_end/testcases/inference/future_then_2.dart
+++ b/front_end/testcases/inference/future_then_2.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_2.dart.legacy.expect b/front_end/testcases/inference/future_then_2.dart.legacy.expect
index 67aa4fb..a91d75e 100644
--- a/front_end/testcases/inference/future_then_2.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_2.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_2.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_2.dart.legacy.transformed.expect
index a9f33b6..6538f9e 100644
--- a/front_end/testcases/inference/future_then_2.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_2.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_2.dart.outline.expect b/front_end/testcases/inference/future_then_2.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_2.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_2.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_3.dart b/front_end/testcases/inference/future_then_3.dart
index 1b4bfac..59ef995 100644
--- a/front_end/testcases/inference/future_then_3.dart
+++ b/front_end/testcases/inference/future_then_3.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_3.dart.legacy.expect b/front_end/testcases/inference/future_then_3.dart.legacy.expect
index 0f44112..2a3484c 100644
--- a/front_end/testcases/inference/future_then_3.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_3.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_3.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_3.dart.legacy.transformed.expect
index 8bca318..346e77b 100644
--- a/front_end/testcases/inference/future_then_3.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_3.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_3.dart.outline.expect b/front_end/testcases/inference/future_then_3.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_3.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_3.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_4.dart b/front_end/testcases/inference/future_then_4.dart
index afc672d..81923b7 100644
--- a/front_end/testcases/inference/future_then_4.dart
+++ b/front_end/testcases/inference/future_then_4.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_4.dart.legacy.expect b/front_end/testcases/inference/future_then_4.dart.legacy.expect
index f659f1f..c7d577e 100644
--- a/front_end/testcases/inference/future_then_4.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_4.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_4.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_4.dart.legacy.transformed.expect
index 56334ca..c90b143 100644
--- a/front_end/testcases/inference/future_then_4.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_4.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_4.dart.outline.expect b/front_end/testcases/inference/future_then_4.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_4.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_4.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_5.dart b/front_end/testcases/inference/future_then_5.dart
index 2fa4ef8..fbbcd00 100644
--- a/front_end/testcases/inference/future_then_5.dart
+++ b/front_end/testcases/inference/future_then_5.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_5.dart.legacy.expect b/front_end/testcases/inference/future_then_5.dart.legacy.expect
index e9987cb..141e3e7 100644
--- a/front_end/testcases/inference/future_then_5.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_5.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_5.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_5.dart.legacy.transformed.expect
index 25dacbf..33b2911 100644
--- a/front_end/testcases/inference/future_then_5.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_5.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_5.dart.outline.expect b/front_end/testcases/inference/future_then_5.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_5.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_5.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_6.dart b/front_end/testcases/inference/future_then_6.dart
index 25cb27f..6731ae3 100644
--- a/front_end/testcases/inference/future_then_6.dart
+++ b/front_end/testcases/inference/future_then_6.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_6.dart.legacy.expect b/front_end/testcases/inference/future_then_6.dart.legacy.expect
index 44e0272..cc6a439 100644
--- a/front_end/testcases/inference/future_then_6.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_6.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_6.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_6.dart.legacy.transformed.expect
index bde8fe5..9ad93e8 100644
--- a/front_end/testcases/inference/future_then_6.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_6.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_6.dart.outline.expect b/front_end/testcases/inference/future_then_6.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_6.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_6.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional.dart b/front_end/testcases/inference/future_then_conditional.dart
index 32f7cf2..2554216 100644
--- a/front_end/testcases/inference/future_then_conditional.dart
+++ b/front_end/testcases/inference/future_then_conditional.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_conditional.dart.legacy.expect b/front_end/testcases/inference/future_then_conditional.dart.legacy.expect
index 4ddf6a7..579d81d 100644
--- a/front_end/testcases/inference/future_then_conditional.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_conditional.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_conditional.dart.legacy.transformed.expect
index 0fc63fc..1ae82f7 100644
--- a/front_end/testcases/inference/future_then_conditional.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_conditional.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional.dart.outline.expect b/front_end/testcases/inference/future_then_conditional.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_conditional.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_conditional.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_2.dart b/front_end/testcases/inference/future_then_conditional_2.dart
index 9fb812d..ea5c226 100644
--- a/front_end/testcases/inference/future_then_conditional_2.dart
+++ b/front_end/testcases/inference/future_then_conditional_2.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_conditional_2.dart.legacy.expect b/front_end/testcases/inference/future_then_conditional_2.dart.legacy.expect
index df550a5..3fbb4f7 100644
--- a/front_end/testcases/inference/future_then_conditional_2.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_conditional_2.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_2.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_conditional_2.dart.legacy.transformed.expect
index 6885ac4..9b1db02 100644
--- a/front_end/testcases/inference/future_then_conditional_2.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_conditional_2.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect b/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_3.dart b/front_end/testcases/inference/future_then_conditional_3.dart
index 6a68194..3505a6d 100644
--- a/front_end/testcases/inference/future_then_conditional_3.dart
+++ b/front_end/testcases/inference/future_then_conditional_3.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_conditional_3.dart.legacy.expect b/front_end/testcases/inference/future_then_conditional_3.dart.legacy.expect
index 9932aa3..a38c5ae 100644
--- a/front_end/testcases/inference/future_then_conditional_3.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_conditional_3.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_3.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_conditional_3.dart.legacy.transformed.expect
index c7618fd..364a78a 100644
--- a/front_end/testcases/inference/future_then_conditional_3.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_conditional_3.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect b/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_4.dart b/front_end/testcases/inference/future_then_conditional_4.dart
index f99855b..36ffafd 100644
--- a/front_end/testcases/inference/future_then_conditional_4.dart
+++ b/front_end/testcases/inference/future_then_conditional_4.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_conditional_4.dart.legacy.expect b/front_end/testcases/inference/future_then_conditional_4.dart.legacy.expect
index 7658f20..189b93e 100644
--- a/front_end/testcases/inference/future_then_conditional_4.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_conditional_4.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_4.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_conditional_4.dart.legacy.transformed.expect
index 9abcfd0..4a5e294 100644
--- a/front_end/testcases/inference/future_then_conditional_4.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_conditional_4.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect b/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_5.dart b/front_end/testcases/inference/future_then_conditional_5.dart
index 7520121..52dc987 100644
--- a/front_end/testcases/inference/future_then_conditional_5.dart
+++ b/front_end/testcases/inference/future_then_conditional_5.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_conditional_5.dart.legacy.expect b/front_end/testcases/inference/future_then_conditional_5.dart.legacy.expect
index 09a4b7b..8b21e2e 100644
--- a/front_end/testcases/inference/future_then_conditional_5.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_conditional_5.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_5.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_conditional_5.dart.legacy.transformed.expect
index 2f416f7..e5e7c73 100644
--- a/front_end/testcases/inference/future_then_conditional_5.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_conditional_5.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect b/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_6.dart b/front_end/testcases/inference/future_then_conditional_6.dart
index b5d6508..b89a28b 100644
--- a/front_end/testcases/inference/future_then_conditional_6.dart
+++ b/front_end/testcases/inference/future_then_conditional_6.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_conditional_6.dart.legacy.expect b/front_end/testcases/inference/future_then_conditional_6.dart.legacy.expect
index 24ff832..d4392fe 100644
--- a/front_end/testcases/inference/future_then_conditional_6.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_conditional_6.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_6.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_conditional_6.dart.legacy.transformed.expect
index 65684a7..fecb72e 100644
--- a/front_end/testcases/inference/future_then_conditional_6.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_conditional_6.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect b/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_ifNull.dart b/front_end/testcases/inference/future_then_ifNull.dart
index 96695d4..c399f90 100644
--- a/front_end/testcases/inference/future_then_ifNull.dart
+++ b/front_end/testcases/inference/future_then_ifNull.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_ifNull.dart.legacy.expect b/front_end/testcases/inference/future_then_ifNull.dart.legacy.expect
index 57222ab..985e5ba 100644
--- a/front_end/testcases/inference/future_then_ifNull.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_ifNull.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_ifNull.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_ifNull.dart.legacy.transformed.expect
index 557fab9..f3c12bb 100644
--- a/front_end/testcases/inference/future_then_ifNull.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_ifNull.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_ifNull.dart.outline.expect b/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
index 5e26f10..18f6651 100644
--- a/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_upwards.dart b/front_end/testcases/inference/future_then_upwards.dart
index 1a770e9..9c33569 100644
--- a/front_end/testcases/inference/future_then_upwards.dart
+++ b/front_end/testcases/inference/future_then_upwards.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_upwards.dart.legacy.expect b/front_end/testcases/inference/future_then_upwards.dart.legacy.expect
index 3b3f456..c454264 100644
--- a/front_end/testcases/inference/future_then_upwards.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_upwards.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_upwards.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_upwards.dart.legacy.transformed.expect
index 3b3f456..c454264 100644
--- a/front_end/testcases/inference/future_then_upwards.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_upwards.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_upwards.dart.outline.expect b/front_end/testcases/inference/future_then_upwards.dart.outline.expect
index e9cb911..e5a534c 100644
--- a/front_end/testcases/inference/future_then_upwards.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_upwards.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_upwards_2.dart b/front_end/testcases/inference/future_then_upwards_2.dart
index b9d340e..ffc3c35 100644
--- a/front_end/testcases/inference/future_then_upwards_2.dart
+++ b/front_end/testcases/inference/future_then_upwards_2.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_upwards_2.dart.legacy.expect b/front_end/testcases/inference/future_then_upwards_2.dart.legacy.expect
index f0dc55f..4c532cc 100644
--- a/front_end/testcases/inference/future_then_upwards_2.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_upwards_2.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_upwards_2.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_upwards_2.dart.legacy.transformed.expect
index f0dc55f..4c532cc 100644
--- a/front_end/testcases/inference/future_then_upwards_2.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_upwards_2.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect b/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
index e9cb911..e5a534c 100644
--- a/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_upwards_3.dart b/front_end/testcases/inference/future_then_upwards_3.dart
index f57ee71..8351c02 100644
--- a/front_end/testcases/inference/future_then_upwards_3.dart
+++ b/front_end/testcases/inference/future_then_upwards_3.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(T x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_then_upwards_3.dart.legacy.expect b/front_end/testcases/inference/future_then_upwards_3.dart.legacy.expect
index e868c2d..86abe95 100644
--- a/front_end/testcases/inference/future_then_upwards_3.dart.legacy.expect
+++ b/front_end/testcases/inference/future_then_upwards_3.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_upwards_3.dart.legacy.transformed.expect b/front_end/testcases/inference/future_then_upwards_3.dart.legacy.transformed.expect
index e868c2d..86abe95 100644
--- a/front_end/testcases/inference/future_then_upwards_3.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_then_upwards_3.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect b/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
index cdfda19..9162c9b 100644
--- a/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
+++ b/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_async_conditional.dart b/front_end/testcases/inference/future_union_async_conditional.dart
index e1f0f8c..455dab2 100644
--- a/front_end/testcases/inference/future_union_async_conditional.dart
+++ b/front_end/testcases/inference/future_union_async_conditional.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_union_async_conditional.dart.legacy.expect b/front_end/testcases/inference/future_union_async_conditional.dart.legacy.expect
index 42ac544..aed7501 100644
--- a/front_end/testcases/inference/future_union_async_conditional.dart.legacy.expect
+++ b/front_end/testcases/inference/future_union_async_conditional.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_async_conditional.dart.legacy.transformed.expect b/front_end/testcases/inference/future_union_async_conditional.dart.legacy.transformed.expect
index 7cb03fb..7697712 100644
--- a/front_end/testcases/inference/future_union_async_conditional.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_union_async_conditional.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect b/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
index 0e45bdd..e80eb43 100644
--- a/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
+++ b/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_async_conditional_2.dart b/front_end/testcases/inference/future_union_async_conditional_2.dart
index 41e7cb0..5188287 100644
--- a/front_end/testcases/inference/future_union_async_conditional_2.dart
+++ b/front_end/testcases/inference/future_union_async_conditional_2.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value(x) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.expect b/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.expect
index 0985390..b3989b2 100644
--- a/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.expect
+++ b/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.transformed.expect b/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.transformed.expect
index 6eb70db..8c463d9 100644
--- a/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect b/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
index 0e45bdd..e80eb43 100644
--- a/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
+++ b/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards.dart b/front_end/testcases/inference/future_union_downwards.dart
index 5622782..2882aa8 100644
--- a/front_end/testcases/inference/future_union_downwards.dart
+++ b/front_end/testcases/inference/future_union_downwards.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value([x]) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_union_downwards.dart.legacy.expect b/front_end/testcases/inference/future_union_downwards.dart.legacy.expect
index 5ca32db..c309ae6 100644
--- a/front_end/testcases/inference/future_union_downwards.dart.legacy.expect
+++ b/front_end/testcases/inference/future_union_downwards.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards.dart.legacy.transformed.expect b/front_end/testcases/inference/future_union_downwards.dart.legacy.transformed.expect
index 9c918a1..5fb66a8 100644
--- a/front_end/testcases/inference/future_union_downwards.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_union_downwards.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards.dart.outline.expect b/front_end/testcases/inference/future_union_downwards.dart.outline.expect
index 10cd1f0..263a94f 100644
--- a/front_end/testcases/inference/future_union_downwards.dart.outline.expect
+++ b/front_end/testcases/inference/future_union_downwards.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards_2.dart b/front_end/testcases/inference/future_union_downwards_2.dart
index 7ff20a9..9c32e85 100644
--- a/front_end/testcases/inference/future_union_downwards_2.dart
+++ b/front_end/testcases/inference/future_union_downwards_2.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value([x]) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_union_downwards_2.dart.legacy.expect b/front_end/testcases/inference/future_union_downwards_2.dart.legacy.expect
index 8471190..a89b874 100644
--- a/front_end/testcases/inference/future_union_downwards_2.dart.legacy.expect
+++ b/front_end/testcases/inference/future_union_downwards_2.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards_2.dart.legacy.transformed.expect b/front_end/testcases/inference/future_union_downwards_2.dart.legacy.transformed.expect
index a165015..ec5724d 100644
--- a/front_end/testcases/inference/future_union_downwards_2.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_union_downwards_2.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect b/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
index 10cd1f0..263a94f 100644
--- a/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
+++ b/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards_3.dart b/front_end/testcases/inference/future_union_downwards_3.dart
index 3cd6687..6d421db 100644
--- a/front_end/testcases/inference/future_union_downwards_3.dart
+++ b/front_end/testcases/inference/future_union_downwards_3.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value([x]) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_union_downwards_3.dart.legacy.expect b/front_end/testcases/inference/future_union_downwards_3.dart.legacy.expect
index a2acf08..9b07131 100644
--- a/front_end/testcases/inference/future_union_downwards_3.dart.legacy.expect
+++ b/front_end/testcases/inference/future_union_downwards_3.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards_3.dart.legacy.transformed.expect b/front_end/testcases/inference/future_union_downwards_3.dart.legacy.transformed.expect
index f4d6505..a3884a8 100644
--- a/front_end/testcases/inference/future_union_downwards_3.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_union_downwards_3.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect b/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
index 58b3b85..da18d4d 100644
--- a/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
+++ b/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards_4.dart b/front_end/testcases/inference/future_union_downwards_4.dart
index 0bf7b5c..e9a48fc 100644
--- a/front_end/testcases/inference/future_union_downwards_4.dart
+++ b/front_end/testcases/inference/future_union_downwards_4.dart
@@ -10,7 +10,7 @@
 class MyFuture<T> implements Future<T> {
   MyFuture() {}
   MyFuture.value([x]) {}
-  dynamic noSuchMethod(/*@topType=Invocation*/ invocation) => null;
+  dynamic noSuchMethod(invocation) => null;
   MyFuture<S> then<S>(FutureOr<S> f(T x), {Function onError}) => null;
 }
 
diff --git a/front_end/testcases/inference/future_union_downwards_4.dart.legacy.expect b/front_end/testcases/inference/future_union_downwards_4.dart.legacy.expect
index 4efea1b..b27e6d9 100644
--- a/front_end/testcases/inference/future_union_downwards_4.dart.legacy.expect
+++ b/front_end/testcases/inference/future_union_downwards_4.dart.legacy.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards_4.dart.legacy.transformed.expect b/front_end/testcases/inference/future_union_downwards_4.dart.legacy.transformed.expect
index b6eba1b..ca29563 100644
--- a/front_end/testcases/inference/future_union_downwards_4.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/future_union_downwards_4.dart.legacy.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect b/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
index 58b3b85..da18d4d 100644
--- a/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
+++ b/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
   no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
diff --git a/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect b/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
index 93dfbdf..39a3325 100644
--- a/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
+++ b/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
@@ -5,7 +5,7 @@
 class Foo<T extends core::Pattern = dynamic> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T>
     ;
-  method method<U extends self::Foo::T = dynamic>(self::Foo::method::U u) → self::Foo::method::U
+  method method<generic-covariant-impl U extends self::Foo::T = dynamic>(self::Foo::method::U u) → self::Foo::method::U
     ;
 }
 static method main() → dynamic
diff --git a/front_end/testcases/inference/generic_methods_dart_math_min_max.dart b/front_end/testcases/inference/generic_methods_dart_math_min_max.dart
index 5ce58e8..c5494ef 100644
--- a/front_end/testcases/inference/generic_methods_dart_math_min_max.dart
+++ b/front_end/testcases/inference/generic_methods_dart_math_min_max.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 import 'dart:math';
@@ -25,18 +25,16 @@
   printInt(myMax(1, 2) as int);
 
   printInt(
-      /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
+      /*@typeArgs=int*/ max(1, 2.0));
   printInt(
-      /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
+      /*@typeArgs=int*/ min(1, 2.0));
   printDouble(
       /*@typeArgs=double*/ max(1, 2.0));
   printDouble(
       /*@typeArgs=double*/ min(1, 2.0));
 
   // Types other than int and double are not accepted.
-  printInt(/*@typeArgs=int*/ min(
-      /*@error=ArgumentTypeNotAssignable*/ "hi",
-      /*@error=ArgumentTypeNotAssignable*/ "there"));
+  printInt(/*@typeArgs=int*/ min("hi", "there"));
 }
 
 main() {}
diff --git a/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect b/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
index 13f3e92..14e6aae 100644
--- a/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
+++ b/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
-//                                                                     ^
+//       /*@typeArgs=int*/ max(1, 2.0));
+//                                ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
-//                                                                     ^
+//       /*@typeArgs=int*/ min(1, 2.0));
+//                                ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:34: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@error=ArgumentTypeNotAssignable*/ "hi",
-//                                            ^
+//   printInt(/*@typeArgs=int*/ min("hi", "there"));
+//                                  ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:40: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@error=ArgumentTypeNotAssignable*/ "there"));
-//                                            ^
+//   printInt(/*@typeArgs=int*/ min("hi", "there"));
+//                                        ^
 //
 import self as self;
 import "dart:core" as core;
@@ -41,22 +41,22 @@
   self::printDouble(math::min<core::double>(1.0, 2.0));
   self::printInt(self::myMax(1, 2) as{TypeError} core::int);
   self::printInt(self::myMax(1, 2) as core::int);
-  self::printInt(math::max<core::int>(1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  self::printInt(math::max<core::int>(1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-      /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
-                                                                    ^" in 2.0 as{TypeError} core::int));
-  self::printInt(math::min<core::int>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+      /*@typeArgs=int*/ max(1, 2.0));
+                               ^" in 2.0 as{TypeError} core::int));
+  self::printInt(math::min<core::int>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-      /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
-                                                                    ^" in 2.0 as{TypeError} core::int));
+      /*@typeArgs=int*/ min(1, 2.0));
+                               ^" in 2.0 as{TypeError} core::int));
   self::printDouble(math::max<core::double>(1.0, 2.0));
   self::printDouble(math::min<core::double>(1.0, 2.0));
-  self::printInt(math::min<core::int>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  self::printInt(math::min<core::int>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:34: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-      /*@error=ArgumentTypeNotAssignable*/ \"hi\",
-                                           ^" in "hi" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  printInt(/*@typeArgs=int*/ min(\"hi\", \"there\"));
+                                 ^" in "hi" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:40: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-      /*@error=ArgumentTypeNotAssignable*/ \"there\"));
-                                           ^" in "there" as{TypeError} core::int));
+  printInt(/*@typeArgs=int*/ min(\"hi\", \"there\"));
+                                       ^" in "there" as{TypeError} core::int));
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect b/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
index 13f3e92..14e6aae 100644
--- a/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
+++ b/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
-//                                                                     ^
+//       /*@typeArgs=int*/ max(1, 2.0));
+//                                ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
-//                                                                     ^
+//       /*@typeArgs=int*/ min(1, 2.0));
+//                                ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:34: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@error=ArgumentTypeNotAssignable*/ "hi",
-//                                            ^
+//   printInt(/*@typeArgs=int*/ min("hi", "there"));
+//                                  ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:40: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@error=ArgumentTypeNotAssignable*/ "there"));
-//                                            ^
+//   printInt(/*@typeArgs=int*/ min("hi", "there"));
+//                                        ^
 //
 import self as self;
 import "dart:core" as core;
@@ -41,22 +41,22 @@
   self::printDouble(math::min<core::double>(1.0, 2.0));
   self::printInt(self::myMax(1, 2) as{TypeError} core::int);
   self::printInt(self::myMax(1, 2) as core::int);
-  self::printInt(math::max<core::int>(1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  self::printInt(math::max<core::int>(1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-      /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
-                                                                    ^" in 2.0 as{TypeError} core::int));
-  self::printInt(math::min<core::int>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+      /*@typeArgs=int*/ max(1, 2.0));
+                               ^" in 2.0 as{TypeError} core::int));
+  self::printInt(math::min<core::int>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-      /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
-                                                                    ^" in 2.0 as{TypeError} core::int));
+      /*@typeArgs=int*/ min(1, 2.0));
+                               ^" in 2.0 as{TypeError} core::int));
   self::printDouble(math::max<core::double>(1.0, 2.0));
   self::printDouble(math::min<core::double>(1.0, 2.0));
-  self::printInt(math::min<core::int>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  self::printInt(math::min<core::int>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:34: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-      /*@error=ArgumentTypeNotAssignable*/ \"hi\",
-                                           ^" in "hi" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  printInt(/*@typeArgs=int*/ min(\"hi\", \"there\"));
+                                 ^" in "hi" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:40: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-      /*@error=ArgumentTypeNotAssignable*/ \"there\"));
-                                           ^" in "there" as{TypeError} core::int));
+  printInt(/*@typeArgs=int*/ min(\"hi\", \"there\"));
+                                       ^" in "there" as{TypeError} core::int));
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart b/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart
index c72713a..fc87629 100644
--- a/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart
+++ b/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 class C {
@@ -10,15 +10,12 @@
 }
 
 class D extends C {
-/*@error=OverrideTypeVariablesMismatch*/
-/*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
-          /*@topType=dynamic*/ x) =>
-      x;
+  m(x) => x;
 }
 
 main() {
   int y = /*info:DYNAMIC_CAST*/ new D()
-      . /*error:WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD*/ /*@target=D::m*/ /*@error=TypeArgumentMismatch*/ m<
-          int>(42);
+      . /*error:WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD*/ /*@target=D::m*/ m<int>(
+          42);
   print(y);
 }
diff --git a/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect b/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
index 6e70f39..d79aa89 100644
--- a/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
+++ b/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
@@ -2,24 +2,24 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
-// /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
-//                                                                ^
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:13:3: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
+//   m(x) => x;
+//   ^
 // pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: This is the overridden method ('m').
 //   T m<T>(T x) => x;
 //     ^
 //
-// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: The return type of the method 'D.m' is 'dynamic', which does not match the return type, 'T', of the overridden method, 'C.m'.
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:13:3: Error: The return type of the method 'D.m' is 'dynamic', which does not match the return type, 'T', of the overridden method, 'C.m'.
 // Change to a subtype of 'T'.
-// /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
-//                                                                ^
+//   m(x) => x;
+//   ^
 // pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: This is the overridden method ('m').
 //   T m<T>(T x) => x;
 //     ^
 //
-// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:21:106: Error: Expected 0 type arguments.
-//       . /*error:WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD*/ /*@target=D::m*/ /*@error=TypeArgumentMismatch*/ m<
-//                                                                                                          ^
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:18:74: Error: Expected 0 type arguments.
+//       . /*error:WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD*/ /*@target=D::m*/ m<int>(
+//                                                                          ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart b/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart
index b1f78be..5d9fa15 100644
--- a/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart
+++ b/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart
@@ -2,21 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 class C {
-  /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
+  m(x) => x;
   dynamic g(int x) => x;
 }
 
 class D extends C {
-  T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
-          T /*@error=OverrideTypeMismatchParameter*/ x) =>
-      x;
-  T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
-          T /*@error=OverrideTypeMismatchParameter*/ x) =>
-      x;
+  T m<T>(T x) => x;
+  T g<T>(T x) => x;
 }
 
 main() {
diff --git a/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.expect b/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.expect
index 2b9e694..ecbdb07 100644
--- a/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.expect
+++ b/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.expect
@@ -2,16 +2,16 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Warning: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
-//   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
-//                                              ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Context: This is the overridden method ('m').
-//   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
-//                        ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:5: Warning: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
+//   T m<T>(T x) => x;
+//     ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:3: Context: This is the overridden method ('m').
+//   m(x) => x;
+//   ^
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Warning: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
-//   T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
-//                                              ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:5: Warning: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
+//   T g<T>(T x) => x;
+//     ^
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
 //   dynamic g(int x) => x;
 //           ^
diff --git a/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.transformed.expect b/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.transformed.expect
index 2b9e694..ecbdb07 100644
--- a/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.transformed.expect
@@ -2,16 +2,16 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Warning: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
-//   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
-//                                              ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Context: This is the overridden method ('m').
-//   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
-//                        ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:5: Warning: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
+//   T m<T>(T x) => x;
+//     ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:3: Context: This is the overridden method ('m').
+//   m(x) => x;
+//   ^
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Warning: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
-//   T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
-//                                              ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:5: Warning: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
+//   T g<T>(T x) => x;
+//     ^
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
 //   dynamic g(int x) => x;
 //           ^
diff --git a/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect b/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
index 04d3c2c..9d1f921 100644
--- a/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
+++ b/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
@@ -2,32 +2,32 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
-//   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
-//                                              ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Context: This is the overridden method ('m').
-//   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
-//                        ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:5: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
+//   T m<T>(T x) => x;
+//     ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:3: Context: This is the overridden method ('m').
+//   m(x) => x;
+//   ^
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:54: Error: The parameter 'x' of the method 'D.m' has type 'T', which does not match the corresponding type, 'dynamic', in the overridden method, 'C.m'.
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:12: Error: The parameter 'x' of the method 'D.m' has type 'T', which does not match the corresponding type, 'dynamic', in the overridden method, 'C.m'.
 // Change to a supertype of 'dynamic', or, for a covariant parameter, a subtype.
-//           T /*@error=OverrideTypeMismatchParameter*/ x) =>
-//                                                      ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Context: This is the overridden method ('m').
-//   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
-//                        ^
+//   T m<T>(T x) => x;
+//            ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:3: Context: This is the overridden method ('m').
+//   m(x) => x;
+//   ^
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Error: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
-//   T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
-//                                              ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:5: Error: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
+//   T g<T>(T x) => x;
+//     ^
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
 //   dynamic g(int x) => x;
 //           ^
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:18:54: Error: The parameter 'x' of the method 'D.g' has type 'T', which does not match the corresponding type, 'int', in the overridden method, 'C.g'.
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:12: Error: The parameter 'x' of the method 'D.g' has type 'T', which does not match the corresponding type, 'int', in the overridden method, 'C.g'.
 // Change to a supertype of 'int', or, for a covariant parameter, a subtype.
-//           T /*@error=OverrideTypeMismatchParameter*/ x) =>
-//                                                      ^
+//   T g<T>(T x) => x;
+//            ^
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
 //   dynamic g(int x) => x;
 //           ^
diff --git a/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart b/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart
index 8fc6aa4..c980fb7 100644
--- a/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart
+++ b/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C<T> extends D<T> {
-  /*@topType=(C::f::U) -> void*/ f<U>(/*@topType=C::f::U*/ x) {}
+  f<U>(x) {}
 }
 
 class D<T> {
diff --git a/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart b/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart
index ca323a2..8ca88c6 100644
--- a/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart
+++ b/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C<T> extends D<T> {
-  /*@topType=void*/ f<U>(/*@topType=() -> List<C::f::U>*/ g) => null;
+  f<U>(g) => null;
 }
 
 abstract class D<T> {
diff --git a/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart b/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart
index 16f1fcf..e46904d 100644
--- a/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart
+++ b/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C<T> extends D<T> {
-  /*@topType=() -> C::f::U*/ f<U>(/*@topType=C::f::U*/ x) {}
+  f<U>(x) {}
 }
 
 class D<T> {
diff --git a/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart b/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart
index db7ae17..db2f883 100644
--- a/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart
+++ b/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart
@@ -10,7 +10,7 @@
 }
 
 class D extends C {
-  /*@topType=D::m::S*/ m<S>(/*@topType=D::m::S*/ x) => x;
+  m<S>(x) => x;
 }
 
 main() {
diff --git a/front_end/testcases/inference/index_assign_operator_return_type.dart b/front_end/testcases/inference/index_assign_operator_return_type.dart
index 6f16f85..47099c8 100644
--- a/front_end/testcases/inference/index_assign_operator_return_type.dart
+++ b/front_end/testcases/inference/index_assign_operator_return_type.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 class C {
@@ -14,7 +14,7 @@
 }
 
 class D extends C implements I {
-  operator /*@topType=void*/ []=(dynamic index, dynamic value) {}
+  operator []=(dynamic index, dynamic value) {}
 }
 
 main() {}
diff --git a/front_end/testcases/inference/index_assign_operator_return_type_2.dart b/front_end/testcases/inference/index_assign_operator_return_type_2.dart
index b7ddcd0..84362ad 100644
--- a/front_end/testcases/inference/index_assign_operator_return_type_2.dart
+++ b/front_end/testcases/inference/index_assign_operator_return_type_2.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 class C {
@@ -14,7 +14,7 @@
 }
 
 class D extends C implements I {
-  operator /*@topType=void*/ []=(int index, /*@topType=dynamic*/ value) {}
+  operator []=(int index, value) {}
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart b/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart
index 0d751d9..bd7233a 100644
--- a/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart
+++ b/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart
@@ -6,12 +6,12 @@
 library test;
 
 class A implements B {
-  get /*@topType=int*/ x => f();
-  void set x(/*@topType=int*/ value) {}
+  get x => f();
+  void set x(value) {}
 }
 
 class B {
-  var /*@topType=int*/ x = 0;
+  var x = 0;
 }
 
 dynamic f() => null;
diff --git a/front_end/testcases/inference/infer_assign_to_ref.dart b/front_end/testcases/inference/infer_assign_to_ref.dart
index ac6e633..c4b8bcc 100644
--- a/front_end/testcases/inference/infer_assign_to_ref.dart
+++ b/front_end/testcases/inference/infer_assign_to_ref.dart
@@ -10,7 +10,7 @@
 }
 
 A a = new A();
-var /*@topType=int*/ c = 0;
+var c = 0;
 
 main() {
   a;
diff --git a/front_end/testcases/inference/infer_binary_custom.dart b/front_end/testcases/inference/infer_binary_custom.dart
index ceb40bb..d25eef7 100644
--- a/front_end/testcases/inference/infer_binary_custom.dart
+++ b/front_end/testcases/inference/infer_binary_custom.dart
@@ -6,12 +6,12 @@
 library test;
 
 class A {
-  int operator +(/*@topType=dynamic*/ other) => 1;
-  double operator -(/*@topType=dynamic*/ other) => 2.0;
+  int operator +(other) => 1;
+  double operator -(other) => 2.0;
 }
 
-var /*@topType=int*/ v_add = new A() /*@target=A::+*/ + 'foo';
-var /*@topType=double*/ v_minus = new A() /*@target=A::-*/ - 'bar';
+var v_add = new A() /*@target=A::+*/ + 'foo';
+var v_minus = new A() /*@target=A::-*/ - 'bar';
 
 main() {
   v_add;
diff --git a/front_end/testcases/inference/infer_binary_double_double.dart b/front_end/testcases/inference/infer_binary_double_double.dart
index 4a70a38..ad180e6 100644
--- a/front_end/testcases/inference/infer_binary_double_double.dart
+++ b/front_end/testcases/inference/infer_binary_double_double.dart
@@ -5,18 +5,18 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=bool*/ a_equal = 1.0 /*@target=num::==*/ == 2.0;
-var /*@topType=bool*/ a_notEqual = 1.0 /*@target=num::==*/ != 2.0;
-var /*@topType=double*/ a_add = 1.0 /*@target=double::+*/ + 2.0;
-var /*@topType=double*/ a_subtract = 1.0 /*@target=double::-*/ - 2.0;
-var /*@topType=double*/ a_multiply = 1.0 /*@target=double::**/ * 2.0;
-var /*@topType=double*/ a_divide = 1.0 /*@target=double::/ */ / 2.0;
-var /*@topType=int*/ a_floorDivide = 1.0 /*@target=double::~/ */ ~/ 2.0;
-var /*@topType=bool*/ a_greater = 1.0 /*@target=num::>*/ > 2.0;
-var /*@topType=bool*/ a_less = 1.0 /*@target=num::<*/ < 2.0;
-var /*@topType=bool*/ a_greaterEqual = 1.0 /*@target=num::>=*/ >= 2.0;
-var /*@topType=bool*/ a_lessEqual = 1.0 /*@target=num::<=*/ <= 2.0;
-var /*@topType=double*/ a_modulo = 1.0 /*@target=double::%*/ % 2.0;
+var a_equal = 1.0 /*@target=num::==*/ == 2.0;
+var a_notEqual = 1.0 /*@target=num::==*/ != 2.0;
+var a_add = 1.0 /*@target=double::+*/ + 2.0;
+var a_subtract = 1.0 /*@target=double::-*/ - 2.0;
+var a_multiply = 1.0 /*@target=double::**/ * 2.0;
+var a_divide = 1.0 /*@target=double::/ */ / 2.0;
+var a_floorDivide = 1.0 /*@target=double::~/ */ ~/ 2.0;
+var a_greater = 1.0 /*@target=num::>*/ > 2.0;
+var a_less = 1.0 /*@target=num::<*/ < 2.0;
+var a_greaterEqual = 1.0 /*@target=num::>=*/ >= 2.0;
+var a_lessEqual = 1.0 /*@target=num::<=*/ <= 2.0;
+var a_modulo = 1.0 /*@target=double::%*/ % 2.0;
 
 main() {
   a_equal;
diff --git a/front_end/testcases/inference/infer_binary_double_int.dart b/front_end/testcases/inference/infer_binary_double_int.dart
index 00d3420..7794c6d 100644
--- a/front_end/testcases/inference/infer_binary_double_int.dart
+++ b/front_end/testcases/inference/infer_binary_double_int.dart
@@ -5,18 +5,18 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=bool*/ a_equal = 1.0 /*@target=num::==*/ == 2;
-var /*@topType=bool*/ a_notEqual = 1.0 /*@target=num::==*/ != 2;
-var /*@topType=double*/ a_add = 1.0 /*@target=double::+*/ + 2;
-var /*@topType=double*/ a_subtract = 1.0 /*@target=double::-*/ - 2;
-var /*@topType=double*/ a_multiply = 1.0 /*@target=double::**/ * 2;
-var /*@topType=double*/ a_divide = 1.0 /*@target=double::/ */ / 2;
-var /*@topType=int*/ a_floorDivide = 1.0 /*@target=double::~/ */ ~/ 2;
-var /*@topType=bool*/ a_greater = 1.0 /*@target=num::>*/ > 2;
-var /*@topType=bool*/ a_less = 1.0 /*@target=num::<*/ < 2;
-var /*@topType=bool*/ a_greaterEqual = 1.0 /*@target=num::>=*/ >= 2;
-var /*@topType=bool*/ a_lessEqual = 1.0 /*@target=num::<=*/ <= 2;
-var /*@topType=double*/ a_modulo = 1.0 /*@target=double::%*/ % 2;
+var a_equal = 1.0 /*@target=num::==*/ == 2;
+var a_notEqual = 1.0 /*@target=num::==*/ != 2;
+var a_add = 1.0 /*@target=double::+*/ + 2;
+var a_subtract = 1.0 /*@target=double::-*/ - 2;
+var a_multiply = 1.0 /*@target=double::**/ * 2;
+var a_divide = 1.0 /*@target=double::/ */ / 2;
+var a_floorDivide = 1.0 /*@target=double::~/ */ ~/ 2;
+var a_greater = 1.0 /*@target=num::>*/ > 2;
+var a_less = 1.0 /*@target=num::<*/ < 2;
+var a_greaterEqual = 1.0 /*@target=num::>=*/ >= 2;
+var a_lessEqual = 1.0 /*@target=num::<=*/ <= 2;
+var a_modulo = 1.0 /*@target=double::%*/ % 2;
 
 main() {
   a_equal;
diff --git a/front_end/testcases/inference/infer_binary_int_double.dart b/front_end/testcases/inference/infer_binary_int_double.dart
index 7d85e62..64d270f 100644
--- a/front_end/testcases/inference/infer_binary_int_double.dart
+++ b/front_end/testcases/inference/infer_binary_int_double.dart
@@ -5,18 +5,18 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=bool*/ a_equal = 1 /*@target=num::==*/ == 2.0;
-var /*@topType=bool*/ a_notEqual = 1 /*@target=num::==*/ != 2.0;
-var /*@topType=double*/ a_add = 1 /*@target=num::+*/ + 2.0;
-var /*@topType=double*/ a_subtract = 1 /*@target=num::-*/ - 2.0;
-var /*@topType=double*/ a_multiply = 1 /*@target=num::**/ * 2.0;
-var /*@topType=double*/ a_divide = 1 /*@target=num::/ */ / 2.0;
-var /*@topType=int*/ a_floorDivide = 1 /*@target=num::~/ */ ~/ 2.0;
-var /*@topType=bool*/ a_greater = 1 /*@target=num::>*/ > 2.0;
-var /*@topType=bool*/ a_less = 1 /*@target=num::<*/ < 2.0;
-var /*@topType=bool*/ a_greaterEqual = 1 /*@target=num::>=*/ >= 2.0;
-var /*@topType=bool*/ a_lessEqual = 1 /*@target=num::<=*/ <= 2.0;
-var /*@topType=double*/ a_modulo = 1 /*@target=num::%*/ % 2.0;
+var a_equal = 1 /*@target=num::==*/ == 2.0;
+var a_notEqual = 1 /*@target=num::==*/ != 2.0;
+var a_add = 1 /*@target=num::+*/ + 2.0;
+var a_subtract = 1 /*@target=num::-*/ - 2.0;
+var a_multiply = 1 /*@target=num::**/ * 2.0;
+var a_divide = 1 /*@target=num::/ */ / 2.0;
+var a_floorDivide = 1 /*@target=num::~/ */ ~/ 2.0;
+var a_greater = 1 /*@target=num::>*/ > 2.0;
+var a_less = 1 /*@target=num::<*/ < 2.0;
+var a_greaterEqual = 1 /*@target=num::>=*/ >= 2.0;
+var a_lessEqual = 1 /*@target=num::<=*/ <= 2.0;
+var a_modulo = 1 /*@target=num::%*/ % 2.0;
 
 main() {
   a_equal;
diff --git a/front_end/testcases/inference/infer_binary_int_int.dart b/front_end/testcases/inference/infer_binary_int_int.dart
index 1f22bd7..7283155 100644
--- a/front_end/testcases/inference/infer_binary_int_int.dart
+++ b/front_end/testcases/inference/infer_binary_int_int.dart
@@ -5,23 +5,23 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=bool*/ a_equal = 1 /*@target=num::==*/ == 2;
-var /*@topType=bool*/ a_notEqual = 1 /*@target=num::==*/ != 2;
-var /*@topType=int*/ a_bitXor = 1 /*@target=int::^*/ ^ 2;
-var /*@topType=int*/ a_bitAnd = 1 /*@target=int::&*/ & 2;
-var /*@topType=int*/ a_bitOr = 1 /*@target=int::|*/ | 2;
-var /*@topType=int*/ a_bitShiftRight = 1 /*@target=int::>>*/ >> 2;
-var /*@topType=int*/ a_bitShiftLeft = 1 /*@target=int::<<*/ << 2;
-var /*@topType=int*/ a_add = 1 /*@target=num::+*/ + 2;
-var /*@topType=int*/ a_subtract = 1 /*@target=num::-*/ - 2;
-var /*@topType=int*/ a_multiply = 1 /*@target=num::**/ * 2;
-var /*@topType=double*/ a_divide = 1 /*@target=num::/ */ / 2;
-var /*@topType=int*/ a_floorDivide = 1 /*@target=num::~/ */ ~/ 2;
-var /*@topType=bool*/ a_greater = 1 /*@target=num::>*/ > 2;
-var /*@topType=bool*/ a_less = 1 /*@target=num::<*/ < 2;
-var /*@topType=bool*/ a_greaterEqual = 1 /*@target=num::>=*/ >= 2;
-var /*@topType=bool*/ a_lessEqual = 1 /*@target=num::<=*/ <= 2;
-var /*@topType=int*/ a_modulo = 1 /*@target=num::%*/ % 2;
+var a_equal = 1 /*@target=num::==*/ == 2;
+var a_notEqual = 1 /*@target=num::==*/ != 2;
+var a_bitXor = 1 /*@target=int::^*/ ^ 2;
+var a_bitAnd = 1 /*@target=int::&*/ & 2;
+var a_bitOr = 1 /*@target=int::|*/ | 2;
+var a_bitShiftRight = 1 /*@target=int::>>*/ >> 2;
+var a_bitShiftLeft = 1 /*@target=int::<<*/ << 2;
+var a_add = 1 /*@target=num::+*/ + 2;
+var a_subtract = 1 /*@target=num::-*/ - 2;
+var a_multiply = 1 /*@target=num::**/ * 2;
+var a_divide = 1 /*@target=num::/ */ / 2;
+var a_floorDivide = 1 /*@target=num::~/ */ ~/ 2;
+var a_greater = 1 /*@target=num::>*/ > 2;
+var a_less = 1 /*@target=num::<*/ < 2;
+var a_greaterEqual = 1 /*@target=num::>=*/ >= 2;
+var a_lessEqual = 1 /*@target=num::<=*/ <= 2;
+var a_modulo = 1 /*@target=num::%*/ % 2;
 
 main() {
   a_equal;
diff --git a/front_end/testcases/inference/infer_conditional.dart b/front_end/testcases/inference/infer_conditional.dart
index 042a3a1..26bc6ea 100644
--- a/front_end/testcases/inference/infer_conditional.dart
+++ b/front_end/testcases/inference/infer_conditional.dart
@@ -5,8 +5,8 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=num*/ a = 1 /*@target=num::==*/ == 2 ? 1 : 2.0;
-var /*@topType=num*/ b = 1 /*@target=num::==*/ == 2 ? 1.0 : 2;
+var a = 1 /*@target=num::==*/ == 2 ? 1 : 2.0;
+var b = 1 /*@target=num::==*/ == 2 ? 1.0 : 2;
 
 main() {
   a;
diff --git a/front_end/testcases/inference/infer_consts_transitively_2.dart b/front_end/testcases/inference/infer_consts_transitively_2.dart
index 1159b22..a86c249 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2.dart
+++ b/front_end/testcases/inference/infer_consts_transitively_2.dart
@@ -7,8 +7,8 @@
 
 import 'infer_consts_transitively_2_a.dart';
 
-const /*@topType=int*/ m1 = a1;
-const /*@topType=int*/ m2 = a2;
+const m1 = a1;
+const m2 = a2;
 
 foo() {
   int i;
diff --git a/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect b/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect
index 0998224..80d04c7 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect
index 0998224..80d04c7 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.expect b/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.expect
index 3530a86..d434a70 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.transformed.expect b/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.transformed.expect
index 3530a86..d434a70 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_consts_transitively_2.dart.type_promotion.expect b/front_end/testcases/inference/infer_consts_transitively_2.dart.type_promotion.expect
index 3628855..d118f42 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2.dart.type_promotion.expect
+++ b/front_end/testcases/inference/infer_consts_transitively_2.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/infer_consts_transitively_2.dart:15:5: Context: Write to i@387
+pkg/front_end/testcases/inference/infer_consts_transitively_2.dart:15:5: Context: Write to i@353
   i = m1;
     ^
diff --git a/front_end/testcases/inference/infer_consts_transitively_2_a.dart b/front_end/testcases/inference/infer_consts_transitively_2_a.dart
index 05643fe..25fcf76 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2_a.dart
+++ b/front_end/testcases/inference/infer_consts_transitively_2_a.dart
@@ -7,7 +7,7 @@
 import 'infer_consts_transitively_2.dart';
 import 'infer_consts_transitively_2_b.dart';
 
-const /*@topType=int*/ a1 = m2;
-const /*@topType=int*/ a2 = b1;
+const a1 = m2;
+const a2 = b1;
 
 main() {}
diff --git a/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect b/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect
index c06662b..6fa0ac1 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect
index c06662b..6fa0ac1 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.expect b/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.expect
index cbafa8c..f548afe 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.transformed.expect b/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.transformed.expect
index cbafa8c..f548afe 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_consts_transitively_2_b.dart b/front_end/testcases/inference/infer_consts_transitively_2_b.dart
index 6210f30..99d0034 100644
--- a/front_end/testcases/inference/infer_consts_transitively_2_b.dart
+++ b/front_end/testcases/inference/infer_consts_transitively_2_b.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*@testedFeatures=inference*/
-const /*@topType=int*/ b1 = 2;
+const b1 = 2;
 
 main() {
   b1;
diff --git a/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart b/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart
index 690be00..4acae34 100644
--- a/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart
+++ b/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart
@@ -6,16 +6,11 @@
 library test;
 
 class A {
-  var /*@topType=dynamic*/ x,
-      /*@topType=int*/ y = 2,
-      /*@topType=String*/ z = "hi";
+  var x, y = 2, z = "hi";
 }
 
 class B implements A {
-  var /*@topType=dynamic*/ x = 2,
-      /*@topType=int*/ y = 3,
-      /*@topType=String*/ z,
-      /*@topType=int*/ w = 2;
+  var x = 2, y = 3, z, w = 2;
 }
 
 foo() {
diff --git a/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect b/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
index 5c42083..06929ac 100644
--- a/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
+++ b/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
@@ -2,17 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
 //                                                              ^
@@ -41,18 +41,18 @@
   core::String s;
   core::int i;
   s = new self::B::•().{self::B::x} as{TypeError} core::String;
-  s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
                                                              ^" in new self::B::•().{self::B::y} as{TypeError} core::String;
   s = new self::B::•().{self::B::z};
-  s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
                                                              ^" in new self::B::•().{self::B::w} as{TypeError} core::String;
   i = new self::B::•().{self::B::x} as{TypeError} core::int;
   i = new self::B::•().{self::B::y};
-  i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
                                                              ^" in new self::B::•().{self::B::z} as{TypeError} core::int;
diff --git a/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect b/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
index 5c42083..06929ac 100644
--- a/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
+++ b/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
 //                                                              ^
@@ -41,18 +41,18 @@
   core::String s;
   core::int i;
   s = new self::B::•().{self::B::x} as{TypeError} core::String;
-  s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
                                                              ^" in new self::B::•().{self::B::y} as{TypeError} core::String;
   s = new self::B::•().{self::B::z};
-  s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
                                                              ^" in new self::B::•().{self::B::w} as{TypeError} core::String;
   i = new self::B::•().{self::B::x} as{TypeError} core::int;
   i = new self::B::•().{self::B::y};
-  i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
                                                              ^" in new self::B::•().{self::B::z} as{TypeError} core::int;
diff --git a/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.type_promotion.expect b/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.type_promotion.expect
index 7c9fd70..eeb9f3c 100644
--- a/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.type_promotion.expect
+++ b/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.type_promotion.expect
@@ -1,24 +1,24 @@
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:25:5: Context: Write to s@537
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:20:5: Context: Write to s@374
   s = /*info:DYNAMIC_CAST*/ new B(). /*@target=B::x*/ x;
     ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:5: Context: Write to s@537
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:5: Context: Write to s@374
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
     ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:5: Context: Write to s@537
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:22:5: Context: Write to s@374
   s = new B(). /*@target=B::z*/ z;
     ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:5: Context: Write to s@537
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:5: Context: Write to s@374
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
     ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:30:5: Context: Write to i@546
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:25:5: Context: Write to i@383
   i = /*info:DYNAMIC_CAST*/ new B(). /*@target=B::x*/ x;
     ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:31:5: Context: Write to i@546
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:5: Context: Write to i@383
   i = new B(). /*@target=B::y*/ y;
     ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:5: Context: Write to i@546
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:5: Context: Write to i@383
   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
     ^
-pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:33:5: Context: Write to i@546
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:5: Context: Write to i@383
   i = new B(). /*@target=B::w*/ w;
     ^
diff --git a/front_end/testcases/inference/infer_field_from_later_inferred_field.dart b/front_end/testcases/inference/infer_field_from_later_inferred_field.dart
index b2c29f6..ed04bda 100644
--- a/front_end/testcases/inference/infer_field_from_later_inferred_field.dart
+++ b/front_end/testcases/inference/infer_field_from_later_inferred_field.dart
@@ -6,11 +6,11 @@
 library test;
 
 class A implements B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 class B {
-  var /*@topType=int*/ x = 0;
+  var x = 0;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart b/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart
index 680a38b..bed6351 100644
--- a/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart
+++ b/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart
@@ -6,11 +6,11 @@
 library test;
 
 class A implements B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 abstract class B implements C {
-  get /*@topType=int*/ x;
+  get x;
 }
 
 abstract class C {
diff --git a/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart b/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart
index 25960b5..5d758a8 100644
--- a/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart
+++ b/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart
@@ -6,11 +6,11 @@
 library test;
 
 class A implements B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 abstract class B implements C {
-  void set x(/*@topType=int*/ value);
+  void set x(value);
 }
 
 abstract class C {
diff --git a/front_end/testcases/inference/infer_field_override_multiple.dart b/front_end/testcases/inference/infer_field_override_multiple.dart
index 8b6336a..7ba15bc 100644
--- a/front_end/testcases/inference/infer_field_override_multiple.dart
+++ b/front_end/testcases/inference/infer_field_override_multiple.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 abstract class A {
@@ -23,21 +23,21 @@
 
 // Superclasses have a consistent type for `x` so inferrence succeeds.
 class E extends A implements B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 // Superclasses don't have a consistent type for `x` so inference fails, even if
 // the types are related.
 class F extends A implements C {
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+  var x;
 }
 
 class G extends A implements D {
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+  var x;
 }
 
 class H extends C implements D {
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
+  var x;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect b/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
index 01203f7..c24c0bb 100644
--- a/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
+++ b/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
@@ -2,65 +2,65 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
-//                                                                                                                                                                   ^
+//   var x;
+//       ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
-//                                                                                                                                                                   ^
+//   var x;
+//       ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
-//                                                                                                                                                                   ^
+//   var x;
+//       ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F.x' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'A.x'.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: The return type of the method 'F.x' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'A.x'.
 // Change to a subtype of 'int'.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
-//                                                                                                                                                                   ^
+//   var x;
+//       ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is the overridden method ('x').
 //   int get x;
 //           ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F.x' is 'dynamic', which does not match the return type, 'num', of the overridden method, 'C.x'.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: The return type of the method 'F.x' is 'dynamic', which does not match the return type, 'num', of the overridden method, 'C.x'.
 // Change to a subtype of 'num'.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
-//                                                                                                                                                                   ^
+//   var x;
+//       ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is the overridden method ('x').
 //   num get x;
 //           ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G.x' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'A.x'.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: The return type of the method 'G.x' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'A.x'.
 // Change to a subtype of 'int'.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
-//                                                                                                                                                                   ^
+//   var x;
+//       ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is the overridden method ('x').
 //   int get x;
 //           ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G.x' is 'dynamic', which does not match the return type, 'double', of the overridden method, 'D.x'.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: The return type of the method 'G.x' is 'dynamic', which does not match the return type, 'double', of the overridden method, 'D.x'.
 // Change to a subtype of 'double'.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
-//                                                                                                                                                                   ^
+//   var x;
+//       ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is the overridden method ('x').
 //   double get x;
 //              ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H.x' is 'dynamic', which does not match the return type, 'num', of the overridden method, 'C.x'.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: The return type of the method 'H.x' is 'dynamic', which does not match the return type, 'num', of the overridden method, 'C.x'.
 // Change to a subtype of 'num'.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
-//                                                                                                                                                                   ^
+//   var x;
+//       ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is the overridden method ('x').
 //   num get x;
 //           ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H.x' is 'dynamic', which does not match the return type, 'double', of the overridden method, 'D.x'.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: The return type of the method 'H.x' is 'dynamic', which does not match the return type, 'double', of the overridden method, 'D.x'.
 // Change to a subtype of 'double'.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
-//                                                                                                                                                                   ^
+//   var x;
+//       ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is the overridden method ('x').
 //   double get x;
 //              ^
diff --git a/front_end/testcases/inference/infer_field_override_of_override.dart b/front_end/testcases/inference/infer_field_override_of_override.dart
index c1438e7..fe84499 100644
--- a/front_end/testcases/inference/infer_field_override_of_override.dart
+++ b/front_end/testcases/inference/infer_field_override_of_override.dart
@@ -14,7 +14,7 @@
 }
 
 class C extends B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_field_override_with_substitution.dart b/front_end/testcases/inference/infer_field_override_with_substitution.dart
index 966ead8..eaa800f 100644
--- a/front_end/testcases/inference/infer_field_override_with_substitution.dart
+++ b/front_end/testcases/inference/infer_field_override_with_substitution.dart
@@ -12,9 +12,9 @@
 }
 
 class B extends A<int> {
-  var /*@topType=List<int>*/ x;
-  var /*@topType=List<int>*/ y;
-  var /*@topType=List<int>*/ z;
+  var x;
+  var y;
+  var z;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.expect b/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.expect
index 0ca493c..6e31b6d 100644
--- a/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.expect
+++ b/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
-  field core::List<self::A::T> z = null;
+  generic-covariant-impl field core::List<self::A::T> z = null;
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   abstract get x() → core::List<self::A::T>;
-  abstract set y(core::List<self::A::T> value) → void;
+  abstract set y(generic-covariant-impl core::List<self::A::T> value) → void;
 }
 class B extends self::A<core::int> {
   field dynamic x = null;
diff --git a/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.transformed.expect
index 0ca493c..6e31b6d 100644
--- a/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
-  field core::List<self::A::T> z = null;
+  generic-covariant-impl field core::List<self::A::T> z = null;
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
   abstract get x() → core::List<self::A::T>;
-  abstract set y(core::List<self::A::T> value) → void;
+  abstract set y(generic-covariant-impl core::List<self::A::T> value) → void;
 }
 class B extends self::A<core::int> {
   field dynamic x = null;
diff --git a/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect b/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect
index 71b6a0a..2fc6225 100644
--- a/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect
+++ b/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 abstract class A<T extends core::Object = dynamic> extends core::Object {
-  field core::List<self::A::T> z;
+  generic-covariant-impl field core::List<self::A::T> z;
   synthetic constructor •() → self::A<self::A::T>
     ;
   abstract get x() → core::List<self::A::T>;
-  abstract set y(core::List<self::A::T> value) → void;
+  abstract set y(generic-covariant-impl core::List<self::A::T> value) → void;
 }
 class B extends self::A<core::int> {
   field dynamic x;
diff --git a/front_end/testcases/inference/infer_field_overrides_getter.dart b/front_end/testcases/inference/infer_field_overrides_getter.dart
index 753c60d..04bc378 100644
--- a/front_end/testcases/inference/infer_field_overrides_getter.dart
+++ b/front_end/testcases/inference/infer_field_overrides_getter.dart
@@ -14,23 +14,23 @@
 }
 
 class C extends A {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 class D extends B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 class E implements A {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 class F implements B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 class G extends Object with B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_field_overrides_setter.dart b/front_end/testcases/inference/infer_field_overrides_setter.dart
index 6b58152..2bbf71a 100644
--- a/front_end/testcases/inference/infer_field_overrides_setter.dart
+++ b/front_end/testcases/inference/infer_field_overrides_setter.dart
@@ -14,23 +14,23 @@
 }
 
 class C extends A {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 class D extends B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 class E implements A {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 class F implements B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 class G extends Object with B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_field_static.dart b/front_end/testcases/inference/infer_field_static.dart
index d5ddfbc..619762f 100644
--- a/front_end/testcases/inference/infer_field_static.dart
+++ b/front_end/testcases/inference/infer_field_static.dart
@@ -15,7 +15,7 @@
 // So B.x doesn't inherit A.x's type.
 
 class B extends A {
-  static var /*@topType=dynamic*/ x = f();
+  static var x = f();
 }
 
 // Similar with C.x.  It is not even eligible for inference since it's static
diff --git a/front_end/testcases/inference/infer_final_field_getter_and_setter.dart b/front_end/testcases/inference/infer_final_field_getter_and_setter.dart
index 185cb96..64260b8 100644
--- a/front_end/testcases/inference/infer_final_field_getter_and_setter.dart
+++ b/front_end/testcases/inference/infer_final_field_getter_and_setter.dart
@@ -11,7 +11,7 @@
 }
 
 class B extends A {
-  final /*@topType=int*/ x;
+  final x;
 
   B(this.x);
 }
diff --git a/front_end/testcases/inference/infer_final_field_getter_only.dart b/front_end/testcases/inference/infer_final_field_getter_only.dart
index fc4531b..7f0c3b0 100644
--- a/front_end/testcases/inference/infer_final_field_getter_only.dart
+++ b/front_end/testcases/inference/infer_final_field_getter_only.dart
@@ -10,7 +10,7 @@
 }
 
 class B extends A {
-  final /*@topType=int*/ x;
+  final x;
 
   B(this.x);
 }
diff --git a/front_end/testcases/inference/infer_final_field_setter_only.dart b/front_end/testcases/inference/infer_final_field_setter_only.dart
index 39ed20b..15aaf46 100644
--- a/front_end/testcases/inference/infer_final_field_setter_only.dart
+++ b/front_end/testcases/inference/infer_final_field_setter_only.dart
@@ -10,7 +10,7 @@
 }
 
 class B extends A {
-  final /*@topType=double*/ x;
+  final x;
 
   B(this.x);
 }
diff --git a/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart b/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart
index 3b9b207..ec28367 100644
--- a/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart
+++ b/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart
@@ -7,32 +7,30 @@
 
 class A {
   int x;
-  B operator +(/*@topType=dynamic*/ other) => null;
+  B operator +(other) => null;
 }
 
 class B extends A {
   B(ignore);
 }
 
-var /*@topType=A*/ a = new A();
+var a = new A();
 // Note: it doesn't matter that some of these refer to 'x'.
-var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
-var /*@topType=List<dynamic>*/ c1 = /*@typeArgs=dynamic*/ [
+var b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+var c1 = /*@typeArgs=dynamic*/ [
   /*error:UNDEFINED_IDENTIFIER*/ x
 ]; // list literals
-var /*@topType=List<dynamic>*/ c2 = /*@typeArgs=dynamic*/ const [];
-var /*@topType=Map<dynamic, dynamic>*/ d = <dynamic, dynamic>{
-  'a': 'b'
-}; // map literals
-var /*@topType=A*/ e = new A().. /*@target=A::x*/ x = 3; // cascades
-var /*@topType=int*/ f =
+var c2 = /*@typeArgs=dynamic*/ const [];
+var d = <dynamic, dynamic>{'a': 'b'}; // map literals
+var e = new A().. /*@target=A::x*/ x = 3; // cascades
+var f =
     2 /*@target=num::+*/ + 3; // binary expressions are OK if the left operand
 // is from a library in a different strongest
 // conected component.
-var /*@topType=int*/ g = /*@target=int::unary-*/ -3;
-var /*@topType=B*/ h = new A() /*@target=A::+*/ + 3;
-var /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
-var /*@topType=B*/ j = /*info:UNNECESSARY_CAST*/ null as B;
+var g = /*@target=int::unary-*/ -3;
+var h = new A() /*@target=A::+*/ + 3;
+var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
+var j = /*info:UNNECESSARY_CAST*/ null as B;
 
 test1() {
   a = /*error:INVALID_ASSIGNMENT*/ "hi";
diff --git a/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.expect b/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.expect
index 7ccc813..7004d74 100644
--- a/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.expect
+++ b/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Warning: Getter not found: 'x'.
-// var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
-//                                                             ^
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:46: Warning: Getter not found: 'x'.
+// var b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+//                                              ^
 //
 // pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Warning: Getter not found: 'x'.
 //   /*error:UNDEFINED_IDENTIFIER*/ x
diff --git a/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.transformed.expect
index 7ccc813..7004d74 100644
--- a/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.transformed.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Warning: Getter not found: 'x'.
-// var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
-//                                                             ^
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:46: Warning: Getter not found: 'x'.
+// var b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+//                                              ^
 //
 // pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Warning: Getter not found: 'x'.
 //   /*error:UNDEFINED_IDENTIFIER*/ x
diff --git a/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect b/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
index 0b2998b..4002d85 100644
--- a/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
+++ b/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
@@ -2,82 +2,82 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Error: Getter not found: 'x'.
-// var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
-//                                                             ^
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:46: Error: Getter not found: 'x'.
+// var b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+//                                              ^
 //
 // pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Getter not found: 'x'.
 //   /*error:UNDEFINED_IDENTIFIER*/ x
 //                                  ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'A'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The method 'unary-' isn't defined for the class 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
-// var /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
-//                                                                               ^
+// var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
+//                                                          ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'A'.
 //   a = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
 //  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B'.
 //   b = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:41:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
 //  - 'Set' is from 'dart:core'.
 //  - 'List' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
 //   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
 //                                                           ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
 //  - 'Set' is from 'dart:core'.
 //  - 'List' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
 //   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
 //                                                           ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
 //  - 'Map' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'Map<dynamic, dynamic>'.
 //   d = /*error:INVALID_ASSIGNMENT*/ 3;
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
 //  - 'Map' is from 'dart:core'.
 //  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'A'.
 //   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   f = /*error:INVALID_ASSIGNMENT*/ false;
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   g = /*error:INVALID_ASSIGNMENT*/ false;
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
 //  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B'.
 //   h = /*error:INVALID_ASSIGNMENT*/ false;
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
 //  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B'.
 //   j = /*error:INVALID_ASSIGNMENT*/ false;
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
 //  - 'List' is from 'dart:core'.
 //  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B'.
@@ -102,9 +102,9 @@
     ;
 }
 static field self::A a = new self::A::•();
-static field self::B b = new self::B::•(invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Error: Getter not found: 'x'.
-var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
-                                                            ^");
+static field self::B b = new self::B::•(invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:46: Error: Getter not found: 'x'.
+var b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+                                             ^");
 static field core::List<dynamic> c1 = <dynamic>[invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Getter not found: 'x'.
   /*error:UNDEFINED_IDENTIFIER*/ x
                                  ^"];
@@ -114,20 +114,20 @@
 static field core::int f = 2.{core::num::+}(3);
 static field core::int g = 3.{core::int::unary-}();
 static field self::B h = new self::A::•().{self::A::+}(3);
-static field dynamic i = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'A'.
+static field dynamic i = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The method 'unary-' isn't defined for the class 'A'.
  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
-var /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
-                                                                              ^";
+var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
+                                                         ^";
 static field self::B j = null as self::B;
 static method test1() → dynamic {
-  self::a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+  self::a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} self::A;
   self::a = new self::B::•(3);
-  self::b = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
+  self::b = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'B'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
@@ -138,29 +138,29 @@
   self::c2 = <dynamic>[];
   self::c2 = let final core::Set<dynamic> #t6 = col::LinkedHashSet::•<dynamic>() in #t6;
   self::d = <dynamic, dynamic>{};
-  self::d = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
+  self::d = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
  - 'Map' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'Map<dynamic, dynamic>'.
   d = /*error:INVALID_ASSIGNMENT*/ 3;
                                    ^" in 3 as{TypeError} core::Map<dynamic, dynamic>;
   self::e = new self::A::•();
-  self::e = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
+  self::e = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
  - 'Map' is from 'dart:core'.
  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                   ^" in <dynamic, dynamic>{} as{TypeError} self::A;
   self::f = 3;
-  self::f = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+  self::f = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} core::int;
   self::g = 1;
-  self::g = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+  self::g = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   g = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} core::int;
-  self::h = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+  self::h = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'B'.
   h = /*error:INVALID_ASSIGNMENT*/ false;
@@ -168,12 +168,12 @@
   self::h = new self::B::•("b");
   self::i = false;
   self::j = new self::B::•("b");
-  self::j = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+  self::j = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'B'.
   j = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} self::B;
-  self::j = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
+  self::j = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
  - 'List' is from 'dart:core'.
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'B'.
diff --git a/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index f0a746a..93049fd 100644
--- a/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
 }
 static field self::A a = new self::A::•();
 static field self::B b = new self::B::•(invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Error: Getter not found: 'x'.
-var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+var  b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
                                                             ^");
 static field core::List<dynamic> c1 = <dynamic>[invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Getter not found: 'x'.
   /*error:UNDEFINED_IDENTIFIER*/ x
@@ -31,7 +31,7 @@
 static field dynamic i = let final self::A #t3 = new self::A::•() in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'A'.
  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
-var /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
+var  i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
                                                                               ^";
 static field self::B j = null as self::B;
 static method test1() → dynamic {
diff --git a/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart b/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart
index 3c9c3ef..6226e35 100644
--- a/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart
+++ b/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart
@@ -6,11 +6,11 @@
 library test;
 
 class A {
-  var /*@topType=dynamic*/ x;
+  var x;
 }
 
 class B implements A {
-  var /*@topType=dynamic*/ x = 2;
+  var x = 2;
 }
 
 foo() {
diff --git a/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart b/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart
index fd0a94b..178c14a 100644
--- a/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart
+++ b/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart
@@ -6,11 +6,11 @@
 library test;
 
 class A {
-  final /*@topType=dynamic*/ x = null;
+  final x = null;
 }
 
 class B implements A {
-  final /*@topType=dynamic*/ x = 2;
+  final x = 2;
 }
 
 foo() {
diff --git a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart
index f2357b3..9943823 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart
+++ b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart
@@ -7,7 +7,7 @@
 
 import 'infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart';
 
-var /*@topType=int*/ y = x; // now ok :)
+var y = x; // now ok :)
 
 test1() {
   int t = 3;
diff --git a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect
index 4ea1232..9c32726 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect
index 4ea1232..9c32726 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.expect
index c251bf8..3e157ba 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.transformed.expect
index c251bf8..3e157ba 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.type_promotion.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.type_promotion.expect
index f71d77a..ca48ff3 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.type_promotion.expect
+++ b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.type_promotion.expect
@@ -1,6 +1,6 @@
-pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart:14:5: Context: Write to t@389
+pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart:14:5: Context: Write to t@372
   t = x;
     ^
-pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart:15:5: Context: Write to t@389
+pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart:15:5: Context: Write to t@372
   t = y;
     ^
diff --git a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart
index 6b746f5..59b8aa8 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart
+++ b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart
@@ -8,7 +8,7 @@
 import 'infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart';
 
 class B {
-  static var /*@topType=int*/ y = A.x;
+  static var y = A.x;
 }
 
 test1() {
diff --git a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect
index 878a97d..11440fd 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect
index 878a97d..11440fd 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.expect
index 28ec8b4..d23de18 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.transformed.expect
index 28ec8b4..d23de18 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.type_promotion.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.type_promotion.expect
index 5b8cb3d..298131f 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.type_promotion.expect
+++ b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.type_promotion.expect
@@ -1,6 +1,6 @@
-pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart:16:5: Context: Write to t@400
+pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart:16:5: Context: Write to t@383
   t = A.x;
     ^
-pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart:17:5: Context: Write to t@400
+pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart:17:5: Context: Write to t@383
   t = B.y;
     ^
diff --git a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart
index dd2ad8c..cc5d086 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart
+++ b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart
@@ -6,7 +6,7 @@
 import 'infer_from_variables_in_cycle_libs_when_flag_is_on2.dart';
 
 class A {
-  static var /*@topType=int*/ x = 2;
+  static var x = 2;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect
index 9af84b2..3f3d4f9 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect
index 9af84b2..3f3d4f9 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.expect
index 5112e7e..1ace456 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.transformed.expect
index 5112e7e..1ace456 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart
index ccc5157..e0f359b 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart
+++ b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart
@@ -5,6 +5,6 @@
 /*@testedFeatures=inference*/
 import 'infer_from_variables_in_cycle_libs_when_flag_is_on2.dart';
 
-var /*@topType=int*/ x = 2; // ok to infer
+var x = 2; // ok to infer
 
 main() {}
diff --git a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect
index ad43ba3..12230fd 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect
index ad43ba3..12230fd 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.expect
index f5cd011..f6fbc3e 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.transformed.expect
index f5cd011..f6fbc3e 100644
--- a/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart
index a270099..4b54811 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart
+++ b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart
@@ -7,7 +7,7 @@
 
 import 'infer_from_variables_in_non_cycle_imports_with_flag_a.dart';
 
-var /*@topType=int*/ y = x;
+var y = x;
 
 test1() {
   x = /*error:INVALID_ASSIGNMENT*/ "hi";
diff --git a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.expect b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.expect
index d442d47..6e1db6f 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.transformed.expect
index d442d47..6e1db6f 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
index ebfe694..1499bf7 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
index ebfe694..1499bf7 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart
index bdf047f..f7bb1b1 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart
+++ b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart
@@ -8,7 +8,7 @@
 import 'infer_from_variables_in_non_cycle_imports_with_flag2_a.dart';
 
 class B {
-  static var /*@topType=int*/ y = A.x;
+  static var y = A.x;
 }
 
 test1() {
diff --git a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect
index db58bcd..426906e 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect
index db58bcd..426906e 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
index 2af44de..4d2b4b8 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
index 2af44de..4d2b4b8 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart
index 7ab5fda..906f8d8 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart
+++ b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart
@@ -4,7 +4,7 @@
 
 /*@testedFeatures=inference*/
 class A {
-  static var /*@topType=int*/ x = 2;
+  static var x = 2;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart
index 3195c4c..1aa8c0a 100644
--- a/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart
+++ b/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*@testedFeatures=inference*/
-var /*@topType=int*/ x = 2;
+var x = 2;
 
 main() {
   x;
diff --git a/front_end/testcases/inference/infer_getter_cross_to_setter.dart b/front_end/testcases/inference/infer_getter_cross_to_setter.dart
index 91cd19f..203adfa 100644
--- a/front_end/testcases/inference/infer_getter_cross_to_setter.dart
+++ b/front_end/testcases/inference/infer_getter_cross_to_setter.dart
@@ -10,7 +10,7 @@
 }
 
 abstract class B extends A {
-  get /*@topType=double*/ x;
+  get x;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart b/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart
index ff91432..7469d08 100644
--- a/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart
+++ b/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart
@@ -6,11 +6,11 @@
 library test;
 
 class A implements B {
-  get /*@topType=int*/ x => f();
+  get x => f();
 }
 
 abstract class B implements C {
-  get /*@topType=int*/ x;
+  get x;
 }
 
 abstract class C {
diff --git a/front_end/testcases/inference/infer_method_missing_params.dart b/front_end/testcases/inference/infer_method_missing_params.dart
index 18bc5e3..a9f6d88 100644
--- a/front_end/testcases/inference/infer_method_missing_params.dart
+++ b/front_end/testcases/inference/infer_method_missing_params.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 // All of these cases are error conditions; this test checks how we recover.
@@ -20,13 +20,9 @@
 }
 
 abstract class C implements A, B {
-  /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
-      /*@topType=int*/ x,
-      /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);
-  /*@topType=int*/ g(/*@topType=int*/ x,
-      [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);
-  /*@topType=int*/ h(/*@topType=int*/ x,
-      {/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y});
+  f(x, y);
+  g(x, [y]);
+  h(x, {y});
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_method_missing_params.dart.legacy.expect b/front_end/testcases/inference/infer_method_missing_params.dart.legacy.expect
index 1738d37..5337a40 100644
--- a/front_end/testcases/inference/infer_method_missing_params.dart.legacy.expect
+++ b/front_end/testcases/inference/infer_method_missing_params.dart.legacy.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Warning: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
-//   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
-//                                                             ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:3: Warning: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
+//   f(x, y);
+//   ^
 // pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
 //   int f(int x);
 //       ^
diff --git a/front_end/testcases/inference/infer_method_missing_params.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_method_missing_params.dart.legacy.transformed.expect
index 1738d37..5337a40 100644
--- a/front_end/testcases/inference/infer_method_missing_params.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/infer_method_missing_params.dart.legacy.transformed.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Warning: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
-//   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
-//                                                             ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:3: Warning: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
+//   f(x, y);
+//   ^
 // pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
 //   int f(int x);
 //       ^
diff --git a/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect b/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
index 5e0625d..0ae3513 100644
--- a/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
+++ b/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Warning: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
-//   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
-//                                                             ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:3: Warning: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
+//   f(x, y);
+//   ^
 // pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
 //   int f(int x);
 //       ^
diff --git a/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect b/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
index e47b23c..f4717a8 100644
--- a/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
+++ b/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
@@ -2,24 +2,24 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:79: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:8: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
-//       /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y);
-//                                                                               ^
+//   f(x, y);
+//        ^
 //
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:29:80: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
-//       {/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y});
-//                                                                                ^
+//   h(x, {y});
+//         ^
 //
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:27:80: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:24:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
-//       [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);
-//                                                                                ^
+//   g(x, [y]);
+//         ^
 //
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Error: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
-//   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
-//                                                             ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:3: Error: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
+//   f(x, y);
+//   ^
 // pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
 //   int f(int x);
 //       ^
diff --git a/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart b/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart
index d7e8119..2374e76 100644
--- a/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart
+++ b/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C extends D {
-  set /*@topType=void*/ foo(/*@topType=int*/ x) {}
+  set foo(x) {}
 }
 
 class D {
diff --git a/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart b/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart
index 9e5cad7..bee5d20 100644
--- a/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart
+++ b/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart
@@ -6,11 +6,11 @@
 library test;
 
 class C extends D {
-  set /*@topType=void*/ foo(/*@topType=int*/ x) {}
+  set foo(x) {}
 }
 
 class D {
-  set /*@topType=void*/ foo(int x) {}
+  set foo(int x) {}
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_prefix_expression.dart b/front_end/testcases/inference/infer_prefix_expression.dart
index ea88fe0..0561e23 100644
--- a/front_end/testcases/inference/infer_prefix_expression.dart
+++ b/front_end/testcases/inference/infer_prefix_expression.dart
@@ -5,9 +5,9 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=bool*/ a_not = !true;
-var /*@topType=int*/ a_complement = /*@target=int::~*/ ~1;
-var /*@topType=int*/ a_negate = /*@target=int::unary-*/ -1;
+var a_not = !true;
+var a_complement = /*@target=int::~*/ ~1;
+var a_negate = /*@target=int::unary-*/ -1;
 
 main() {
   a_not;
diff --git a/front_end/testcases/inference/infer_prefix_expression_custom.dart b/front_end/testcases/inference/infer_prefix_expression_custom.dart
index 46cfedc..fe447a9 100644
--- a/front_end/testcases/inference/infer_prefix_expression_custom.dart
+++ b/front_end/testcases/inference/infer_prefix_expression_custom.dart
@@ -11,9 +11,9 @@
   double operator -() => 2.0;
 }
 
-var /*@topType=A*/ a = new A();
-var /*@topType=int*/ v_complement = /*@target=A::~*/ ~a;
-var /*@topType=double*/ v_negate = /*@target=A::unary-*/ -a;
+var a = new A();
+var v_complement = /*@target=A::~*/ ~a;
+var v_negate = /*@target=A::unary-*/ -a;
 
 main() {
   a;
diff --git a/front_end/testcases/inference/infer_return_type_for_static_setter.dart b/front_end/testcases/inference/infer_return_type_for_static_setter.dart
index e3bf142..972b299 100644
--- a/front_end/testcases/inference/infer_return_type_for_static_setter.dart
+++ b/front_end/testcases/inference/infer_return_type_for_static_setter.dart
@@ -6,9 +6,9 @@
 library test;
 
 class C {
-  static set /*@topType=void*/ foo(int x) {}
+  static set foo(int x) {}
 }
 
-set /*@topType=void*/ bar(int x) {}
+set bar(int x) {}
 
 main() {}
diff --git a/front_end/testcases/inference/infer_setter_cross_to_getter.dart b/front_end/testcases/inference/infer_setter_cross_to_getter.dart
index 47f35d5..219dca0 100644
--- a/front_end/testcases/inference/infer_setter_cross_to_getter.dart
+++ b/front_end/testcases/inference/infer_setter_cross_to_getter.dart
@@ -10,7 +10,7 @@
 }
 
 abstract class B extends A {
-  void set x(/*@topType=double*/ value);
+  void set x(value);
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart b/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart
index 2a4141b..c0ae645 100644
--- a/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart
+++ b/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart
@@ -6,11 +6,11 @@
 library test;
 
 class A implements B {
-  void set x(/*@topType=int*/ value) {}
+  void set x(value) {}
 }
 
 abstract class B implements C {
-  void set x(/*@topType=int*/ value);
+  void set x(value);
 }
 
 abstract class C {
diff --git a/front_end/testcases/inference/infer_setter_return_type_only.dart b/front_end/testcases/inference/infer_setter_return_type_only.dart
index 57583aa..8e536dc 100644
--- a/front_end/testcases/inference/infer_setter_return_type_only.dart
+++ b/front_end/testcases/inference/infer_setter_return_type_only.dart
@@ -12,7 +12,7 @@
 class B extends A {
   // The setter return type should be inferred, but the setter parameter type
   // should not.
-  set /*@topType=void*/ x(Object o) {}
+  set x(Object o) {}
 }
 
 main() {
diff --git a/front_end/testcases/inference/infer_statics_transitively.dart b/front_end/testcases/inference/infer_statics_transitively.dart
index aa06cbb..8c3c5d0 100644
--- a/front_end/testcases/inference/infer_statics_transitively.dart
+++ b/front_end/testcases/inference/infer_statics_transitively.dart
@@ -7,8 +7,8 @@
 
 import 'infer_statics_transitively_a.dart';
 
-final /*@topType=int*/ m1 = a1;
-final /*@topType=int*/ m2 = A.a2;
+final m1 = a1;
+final m2 = A.a2;
 
 foo() {
   int i;
diff --git a/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect b/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect
index 094adfb..7e55b99 100644
--- a/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect
index 094adfb..7e55b99 100644
--- a/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively.dart.strong.expect b/front_end/testcases/inference/infer_statics_transitively.dart.strong.expect
index 7d3fd79..99c4846 100644
--- a/front_end/testcases/inference/infer_statics_transitively.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively.dart.strong.transformed.expect b/front_end/testcases/inference/infer_statics_transitively.dart.strong.transformed.expect
index 7d3fd79..99c4846 100644
--- a/front_end/testcases/inference/infer_statics_transitively.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively.dart.type_promotion.expect b/front_end/testcases/inference/infer_statics_transitively.dart.type_promotion.expect
index 2bf9cee..f5e0605 100644
--- a/front_end/testcases/inference/infer_statics_transitively.dart.type_promotion.expect
+++ b/front_end/testcases/inference/infer_statics_transitively.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/infer_statics_transitively.dart:15:5: Context: Write to i@388
+pkg/front_end/testcases/inference/infer_statics_transitively.dart:15:5: Context: Write to i@354
   i = m1;
     ^
diff --git a/front_end/testcases/inference/infer_statics_transitively2.dart b/front_end/testcases/inference/infer_statics_transitively2.dart
index 148c6f1..40dbc28 100644
--- a/front_end/testcases/inference/infer_statics_transitively2.dart
+++ b/front_end/testcases/inference/infer_statics_transitively2.dart
@@ -5,10 +5,10 @@
 /*@testedFeatures=inference*/
 library test;
 
-const /*@topType=int*/ x1 = 1;
-final /*@topType=int*/ x2 = 1;
-final /*@topType=int*/ y1 = x1;
-final /*@topType=int*/ y2 = x2;
+const x1 = 1;
+final x2 = 1;
+final y1 = x1;
+final y2 = x2;
 
 foo() {
   int i;
diff --git a/front_end/testcases/inference/infer_statics_transitively2.dart.type_promotion.expect b/front_end/testcases/inference/infer_statics_transitively2.dart.type_promotion.expect
index bd3b23f..bd4a813 100644
--- a/front_end/testcases/inference/infer_statics_transitively2.dart.type_promotion.expect
+++ b/front_end/testcases/inference/infer_statics_transitively2.dart.type_promotion.expect
@@ -1,6 +1,6 @@
-pkg/front_end/testcases/inference/infer_statics_transitively2.dart:15:5: Context: Write to i@403
+pkg/front_end/testcases/inference/infer_statics_transitively2.dart:15:5: Context: Write to i@335
   i = y1;
     ^
-pkg/front_end/testcases/inference/infer_statics_transitively2.dart:16:5: Context: Write to i@403
+pkg/front_end/testcases/inference/infer_statics_transitively2.dart:16:5: Context: Write to i@335
   i = y2;
     ^
diff --git a/front_end/testcases/inference/infer_statics_transitively3.dart b/front_end/testcases/inference/infer_statics_transitively3.dart
index 6bd303b..16e92d1 100644
--- a/front_end/testcases/inference/infer_statics_transitively3.dart
+++ b/front_end/testcases/inference/infer_statics_transitively3.dart
@@ -8,12 +8,12 @@
 import 'infer_statics_transitively3_a.dart' show a1, A;
 import 'infer_statics_transitively3_a.dart' as p show a2, A;
 
-const /*@topType=int*/ t1 = 1;
-const /*@topType=int*/ t2 = t1;
-const /*@topType=int*/ t3 = a1;
-const /*@topType=int*/ t4 = p.a2;
-const /*@topType=dynamic*/ t5 = A.a3;
-const /*@topType=dynamic*/ t6 = p.A.a3;
+const t1 = 1;
+const t2 = t1;
+const t3 = a1;
+const t4 = p.a2;
+const t5 = A.a3;
+const t6 = p.A.a3;
 
 foo() {
   int i;
diff --git a/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect b/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect
index c14e037..b5b71b0 100644
--- a/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect
index c14e037..b5b71b0 100644
--- a/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively3.dart.strong.expect b/front_end/testcases/inference/infer_statics_transitively3.dart.strong.expect
index 8554b53..d80f5c4 100644
--- a/front_end/testcases/inference/infer_statics_transitively3.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively3.dart.strong.transformed.expect b/front_end/testcases/inference/infer_statics_transitively3.dart.strong.transformed.expect
index 8554b53..d80f5c4 100644
--- a/front_end/testcases/inference/infer_statics_transitively3.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively3.dart.type_promotion.expect b/front_end/testcases/inference/infer_statics_transitively3.dart.type_promotion.expect
index 2d28253..3a64db3 100644
--- a/front_end/testcases/inference/infer_statics_transitively3.dart.type_promotion.expect
+++ b/front_end/testcases/inference/infer_statics_transitively3.dart.type_promotion.expect
@@ -1,12 +1,12 @@
-pkg/front_end/testcases/inference/infer_statics_transitively3.dart:20:5: Context: Write to i@602
+pkg/front_end/testcases/inference/infer_statics_transitively3.dart:20:5: Context: Write to i@492
   i = t1;
     ^
-pkg/front_end/testcases/inference/infer_statics_transitively3.dart:21:5: Context: Write to i@602
+pkg/front_end/testcases/inference/infer_statics_transitively3.dart:21:5: Context: Write to i@492
   i = t2;
     ^
-pkg/front_end/testcases/inference/infer_statics_transitively3.dart:22:5: Context: Write to i@602
+pkg/front_end/testcases/inference/infer_statics_transitively3.dart:22:5: Context: Write to i@492
   i = t3;
     ^
-pkg/front_end/testcases/inference/infer_statics_transitively3.dart:23:5: Context: Write to i@602
+pkg/front_end/testcases/inference/infer_statics_transitively3.dart:23:5: Context: Write to i@492
   i = t4;
     ^
diff --git a/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect b/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect
index 041ca29..4e48a93 100644
--- a/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect
index 041ca29..4e48a93 100644
--- a/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.expect b/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.expect
index 295510c..9891055 100644
--- a/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.transformed.expect b/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.transformed.expect
index 295510c..9891055 100644
--- a/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively_a.dart b/front_end/testcases/inference/infer_statics_transitively_a.dart
index 3d09a81..a7b6d9e 100644
--- a/front_end/testcases/inference/infer_statics_transitively_a.dart
+++ b/front_end/testcases/inference/infer_statics_transitively_a.dart
@@ -7,10 +7,10 @@
 import 'infer_statics_transitively.dart';
 import 'infer_statics_transitively_b.dart';
 
-final /*@topType=int*/ a1 = m2;
+final a1 = m2;
 
 class A {
-  static final /*@topType=int*/ a2 = b1;
+  static final a2 = b1;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect b/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect
index e1f6bf9..7c8af8a 100644
--- a/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect
index e1f6bf9..7c8af8a 100644
--- a/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.expect b/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.expect
index e5c5eb0..aa6b4be 100644
--- a/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.transformed.expect b/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.transformed.expect
index e5c5eb0..aa6b4be 100644
--- a/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect b/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect
index cdad9fa..1303bcc 100644
--- a/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect
index cdad9fa..1303bcc 100644
--- a/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.expect b/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.expect
index cdad9fa..1303bcc 100644
--- a/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.transformed.expect b/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.transformed.expect
index cdad9fa..1303bcc 100644
--- a/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_throw.dart b/front_end/testcases/inference/infer_throw.dart
index 0bd74f4..53940dc 100644
--- a/front_end/testcases/inference/infer_throw.dart
+++ b/front_end/testcases/inference/infer_throw.dart
@@ -5,10 +5,10 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=bool*/ t = true;
-var /*@topType=dynamic*/ a = (throw 0);
-var /*@topType=int*/ b = (throw 0) ? 1 : 2;
-var /*@topType=int*/ c = t ? (throw 1) : 2;
-var /*@topType=int*/ d = t ? 1 : (throw 2);
+var t = true;
+var a = (throw 0);
+var b = (throw 0) ? 1 : 2;
+var c = t ? (throw 1) : 2;
+var d = t ? 1 : (throw 2);
 
 main() {}
diff --git a/front_end/testcases/inference/infer_throw_downwards.dart b/front_end/testcases/inference/infer_throw_downwards.dart
index c733531..d542a11 100644
--- a/front_end/testcases/inference/infer_throw_downwards.dart
+++ b/front_end/testcases/inference/infer_throw_downwards.dart
@@ -7,7 +7,7 @@
 
 T f<T>() => null;
 
-var /*@topType=dynamic*/ x = throw /*@typeArgs=dynamic*/ f();
+var x = throw /*@typeArgs=dynamic*/ f();
 
 void g() {
   var /*@type=dynamic*/ x = throw /*@typeArgs=dynamic*/ f();
diff --git a/front_end/testcases/inference/infer_type_on_overridden_fields2.dart b/front_end/testcases/inference/infer_type_on_overridden_fields2.dart
index 356477b..e203004 100644
--- a/front_end/testcases/inference/infer_type_on_overridden_fields2.dart
+++ b/front_end/testcases/inference/infer_type_on_overridden_fields2.dart
@@ -10,7 +10,7 @@
 }
 
 class B extends A {
-  get /*@topType=int*/ x => 3;
+  get x => 3;
 }
 
 foo() {
diff --git a/front_end/testcases/inference/infer_type_on_overridden_fields4.dart b/front_end/testcases/inference/infer_type_on_overridden_fields4.dart
index 130f045..5dd2297 100644
--- a/front_end/testcases/inference/infer_type_on_overridden_fields4.dart
+++ b/front_end/testcases/inference/infer_type_on_overridden_fields4.dart
@@ -10,7 +10,7 @@
 }
 
 class B implements A {
-  get /*@topType=int*/ x => 3;
+  get x => 3;
 }
 
 foo() {
diff --git a/front_end/testcases/inference/infer_type_on_var_from_field.dart b/front_end/testcases/inference/infer_type_on_var_from_field.dart
index 8c53b40..8301e0d 100644
--- a/front_end/testcases/inference/infer_type_on_var_from_field.dart
+++ b/front_end/testcases/inference/infer_type_on_var_from_field.dart
@@ -8,7 +8,7 @@
 class A {
   int x = 0;
 
-  /*@topType=dynamic*/ test1() {
+  test1() {
     var /*@type=int*/ a = /*@target=A::x*/ x;
     a = /*error:INVALID_ASSIGNMENT*/ "hi";
     a = 3;
@@ -21,7 +21,7 @@
   }
 
   int y; // field def after use
-  final /*@topType=int*/ z = 42; // should infer `int`
+  final z = 42; // should infer `int`
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect b/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect
index e745ffe..426e83a 100644
--- a/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect
+++ b/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect
@@ -1,18 +1,18 @@
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:7: Context: Write to a@341
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:7: Context: Write to a@320
     a = /*error:INVALID_ASSIGNMENT*/ "hi";
       ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:14:7: Context: Write to a@341
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:14:7: Context: Write to a@320
     a = 3;
       ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:7: Context: Write to b@441
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:7: Context: Write to b@420
     b = /*error:INVALID_ASSIGNMENT*/ "hi";
       ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:17:7: Context: Write to b@441
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:17:7: Context: Write to b@420
     b = 4;
       ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:7: Context: Write to c@541
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:7: Context: Write to c@520
     c = /*error:INVALID_ASSIGNMENT*/ "hi";
       ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:20:7: Context: Write to c@541
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:20:7: Context: Write to c@520
     c = 4;
       ^
diff --git a/front_end/testcases/inference/infer_type_on_var_from_top_level.dart b/front_end/testcases/inference/infer_type_on_var_from_top_level.dart
index 402a884..6b971b5 100644
--- a/front_end/testcases/inference/infer_type_on_var_from_top_level.dart
+++ b/front_end/testcases/inference/infer_type_on_var_from_top_level.dart
@@ -20,6 +20,6 @@
 }
 
 int y = 0; // field def after use
-final /*@topType=int*/ z = 42; // should infer `int`
+final z = 42; // should infer `int`
 
 main() {}
diff --git a/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart b/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart
index 8f61c86..6a235ad 100644
--- a/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart
+++ b/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart
@@ -8,7 +8,7 @@
 import 'infer_type_regardless_of_declaration_order_or_cycles_b.dart';
 
 class C extends B {
-  get /*@topType=int*/ x => null;
+  get x => null;
 }
 
 class A {
diff --git a/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect b/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect
index 4302f4f..707d09d 100644
--- a/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect
index 4302f4f..707d09d 100644
--- a/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect b/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
index 1f0fd34..ff10b61 100644
--- a/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect b/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
index 1f0fd34..ff10b61 100644
--- a/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect b/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect
index 2e91f62..f32c8d5 100644
--- a/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect
index 2e91f62..f32c8d5 100644
--- a/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect b/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
index fe03c30..9b49051 100644
--- a/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect b/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect
index fe03c30..9b49051 100644
--- a/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_typed_map_literal.dart b/front_end/testcases/inference/infer_typed_map_literal.dart
index 0b78431..03bad8b 100644
--- a/front_end/testcases/inference/infer_typed_map_literal.dart
+++ b/front_end/testcases/inference/infer_typed_map_literal.dart
@@ -5,13 +5,12 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=Map<int, String>*/ a = <int, String>{0: 'aaa', 1: 'bbb'};
-var /*@topType=Map<double, int>*/ b = <double, int>{1.1: 1, 2.2: 2};
-var /*@topType=Map<List<int>, Map<String, double>>*/ c =
-    <List<int>, Map<String, double>>{};
-var /*@topType=Map<int, dynamic>*/ d = <int, dynamic>{};
-var /*@topType=Map<dynamic, int>*/ e = <dynamic, int>{};
-var /*@topType=Map<dynamic, dynamic>*/ f = <dynamic, dynamic>{};
+var a = <int, String>{0: 'aaa', 1: 'bbb'};
+var b = <double, int>{1.1: 1, 2.2: 2};
+var c = <List<int>, Map<String, double>>{};
+var d = <int, dynamic>{};
+var e = <dynamic, int>{};
+var f = <dynamic, dynamic>{};
 
 main() {
   a;
diff --git a/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart b/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart
index b86463c..c1be80c 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart
+++ b/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart
@@ -11,8 +11,8 @@
 }
 
 class B implements A<int> {
-  get /*@topType=int*/ x => 3;
-  get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ "hello";
+  get x => 3;
+  get w => /*error:RETURN_OF_INVALID_TYPE*/ "hello";
 }
 
 foo() {
diff --git a/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
index 2ac925a..e8cded4 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
+++ b/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
@@ -2,10 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ "hello";
-//                                                              ^
+//   get w => /*error:RETURN_OF_INVALID_TYPE*/ "hello";
+//                                             ^
 //
 // pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
@@ -29,10 +29,10 @@
   get x() → core::int
     return 3;
   get w() → core::int
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
-                                                             ^" in "hello" as{TypeError} core::int;
+  get w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
+                                            ^" in "hello" as{TypeError} core::int;
 }
 static method foo() → dynamic {
   core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
diff --git a/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
index 2ac925a..e8cded4 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
+++ b/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ "hello";
-//                                                              ^
+//   get w => /*error:RETURN_OF_INVALID_TYPE*/ "hello";
+//                                             ^
 //
 // pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
@@ -29,10 +29,10 @@
   get x() → core::int
     return 3;
   get w() → core::int
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
-                                                             ^" in "hello" as{TypeError} core::int;
+  get w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
+                                            ^" in "hello" as{TypeError} core::int;
 }
 static method foo() → dynamic {
   core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
diff --git a/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart b/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart
index d3bf9ef..957177a 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart
+++ b/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart
@@ -11,7 +11,7 @@
 
 class B<E> extends A<E> {
   E y;
-  get /*@topType=B::E*/ x => /*@target=B::y*/ y;
+  get x => /*@target=B::y*/ y;
 }
 
 foo() {
diff --git a/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.expect
index ef150d9..3c624e6 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.expect
+++ b/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  field self::A::T x = null;
+  generic-covariant-impl field self::A::T x = null;
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
-  field self::B::E y = null;
+  generic-covariant-impl field self::B::E y = null;
   synthetic constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
diff --git a/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.transformed.expect
index ef150d9..3c624e6 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  field self::A::T x = null;
+  generic-covariant-impl field self::A::T x = null;
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
 }
 class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
-  field self::B::E y = null;
+  generic-covariant-impl field self::B::E y = null;
   synthetic constructor •() → self::B<self::B::E>
     : super self::A::•()
     ;
diff --git a/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart b/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart
index 473e129..5025679 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart
+++ b/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart
@@ -6,12 +6,12 @@
 library test;
 
 abstract class I<E> {
-  String m(/*@topType=dynamic*/ a, String f(v, E e));
+  String m(a, String f(v, E e));
 }
 
 abstract class A<E> implements I<E> {
   const A();
-  String m(/*@topType=dynamic*/ a, String f(v, E e));
+  String m(a, String f(v, E e));
 }
 
 abstract class M {
@@ -22,7 +22,7 @@
   const B();
   int get y => 0;
 
-  /*@topType=String*/ m(/*@topType=dynamic*/ a, f(v, E e)) {}
+  m(a, f(v, E e)) {}
 }
 
 foo() {
diff --git a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart
index c3b7d7d..49235aa 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart
+++ b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart
@@ -21,7 +21,7 @@
   const B();
   int get y => 0;
 
-  /*@topType=A<B::E>*/ m(/*@topType=dynamic*/ a, f(v, int e)) {}
+  m(a, f(v, int e)) {}
 }
 
 foo() {
diff --git a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect
index 2f73c7b..ecee2c6 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect
index 2f73c7b..ecee2c6 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
index af26f52..1f20b42 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
index af26f52..1f20b42 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart
index aac0b74..0d4db22 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart
+++ b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart
@@ -6,7 +6,7 @@
 import 'infer_types_on_generic_instantiations_in_library_cycle.dart';
 
 abstract class I<E> {
-  A<E> m(/*@topType=dynamic*/ a, String f(v, int e));
+  A<E> m(a, String f(v, int e));
 }
 
 main() {}
diff --git a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect
index c8150f5..54ed9fa 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect
+++ b/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/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect
index c8150f5..54ed9fa 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
index 09436d7..a10bf88 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
+++ b/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/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect b/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
index 09436d7..a10bf88 100644
--- a/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
+++ b/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/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.expect b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.expect
index 4cb8f64..5afe30e 100644
--- a/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.expect
+++ b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
-  method foo(self::Bar::T t) → void {
+  method foo(generic-covariant-impl self::Bar::T t) → void {
     for (dynamic i in t) {
       core::int x = i;
     }
@@ -22,7 +22,7 @@
   synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
     : super core::Object::•()
     ;
-  method foo(self::Baz::S t) → void {
+  method foo(generic-covariant-impl self::Baz::S t) → void {
     for (dynamic i in t) {
       core::int x = i;
       self::Baz::T y = i;
diff --git a/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.transformed.expect
index 4cb8f64..5afe30e 100644
--- a/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.transformed.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
-  method foo(self::Bar::T t) → void {
+  method foo(generic-covariant-impl self::Bar::T t) → void {
     for (dynamic i in t) {
       core::int x = i;
     }
@@ -22,7 +22,7 @@
   synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
     : super core::Object::•()
     ;
-  method foo(self::Baz::S t) → void {
+  method foo(generic-covariant-impl self::Baz::S t) → void {
     for (dynamic i in t) {
       core::int x = i;
       self::Baz::T y = i;
diff --git a/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart
index f2fc604..9b410ed 100644
--- a/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart
+++ b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart
@@ -12,7 +12,7 @@
 }
 
 class Bar<T extends Stream<String>> {
-  /*@topType=dynamic*/ foo(T t) async {
+  foo(T t) async {
     await for (var /*@type=String*/ i in t) {
       int x = /*error:INVALID_ASSIGNMENT*/ i;
     }
@@ -20,7 +20,7 @@
 }
 
 class Baz<T, E extends Stream<T>, S extends E> {
-  /*@topType=dynamic*/ foo(S t) async {
+  foo(S t) async {
     await for (var /*@type=Baz::T*/ i in t) {
       int x = /*error:INVALID_ASSIGNMENT*/ i;
       T y = i;
diff --git a/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.expect b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.expect
index 0d7e2c9..e4a880e 100644
--- a/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.expect
+++ b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.expect
@@ -15,7 +15,7 @@
   synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
-  method foo(self::Bar::T t) → dynamic async {
+  method foo(generic-covariant-impl self::Bar::T t) → dynamic async {
     await for (dynamic i in t) {
       core::int x = i;
     }
@@ -25,7 +25,7 @@
   synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
     : super core::Object::•()
     ;
-  method foo(self::Baz::S t) → dynamic async {
+  method foo(generic-covariant-impl self::Baz::S t) → dynamic async {
     await for (dynamic i in t) {
       core::int x = i;
       self::Baz::T y = i;
diff --git a/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.transformed.expect b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.transformed.expect
index 2cc1d41..a26de4c 100644
--- a/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.transformed.expect
@@ -15,7 +15,7 @@
   synthetic constructor •() → self::Bar<self::Bar::T>
     : super core::Object::•()
     ;
-  method foo(self::Bar::T t) → dynamic /* originally async */ {
+  method foo(generic-covariant-impl self::Bar::T t) → dynamic /* originally async */ {
     final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
@@ -74,7 +74,7 @@
   synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
     : super core::Object::•()
     ;
-  method foo(self::Baz::S t) → dynamic /* originally async */ {
+  method foo(generic-covariant-impl self::Baz::S t) → dynamic /* originally async */ {
     final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
diff --git a/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
index 70778c8..c157ca9 100644
--- a/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
+++ b/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
@@ -13,13 +13,13 @@
 class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
   synthetic constructor •() → self::Bar<self::Bar::T>
     ;
-  method foo(self::Bar::T t) → dynamic
+  method foo(generic-covariant-impl self::Bar::T t) → dynamic
     ;
 }
 class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
   synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
     ;
-  method foo(self::Baz::S t) → dynamic
+  method foo(generic-covariant-impl self::Baz::S t) → dynamic
     ;
 }
 abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
diff --git a/front_end/testcases/inference/infer_variable_void.dart b/front_end/testcases/inference/infer_variable_void.dart
index 3e54630..65fdfb3 100644
--- a/front_end/testcases/inference/infer_variable_void.dart
+++ b/front_end/testcases/inference/infer_variable_void.dart
@@ -6,7 +6,7 @@
 library test;
 
 void f() {}
-var /*@topType=void*/ x = /*info:USE_OF_VOID_RESULT*/ f();
+var x = /*info:USE_OF_VOID_RESULT*/ f();
 
 main() {
   x;
diff --git a/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart b/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart
index d383d76..5ecd7db 100644
--- a/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart
+++ b/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart
@@ -6,7 +6,7 @@
 library test;
 
 class Foo {
-  var /*@topType=int*/ x = 1;
+  var x = 1;
   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ "1"]);
 }
 
diff --git a/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart b/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart
index 281d549..760375f 100644
--- a/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart
+++ b/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart
@@ -6,8 +6,8 @@
 library test;
 
 class C {
-  static var /*@topType=String*/ x = 'x';
-  var /*@topType=Map<String, Map<String, String>>*/ y = /*@typeArgs=String, Map<String, String>*/ {
+  static var x = 'x';
+  var y = /*@typeArgs=String, Map<String, String>*/ {
     'a': /*@typeArgs=String, String*/ {'b': 'c'},
     'd': /*@typeArgs=String, String*/ {'e': x}
   };
diff --git a/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart b/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart
index 39d8091..8e9c16b 100644
--- a/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart
+++ b/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart
@@ -5,10 +5,10 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=String*/ x = 'x';
+var x = 'x';
 
 class C {
-  var /*@topType=String*/ y = x;
+  var y = x;
 }
 
 main() {
diff --git a/front_end/testcases/inference/inferred_type_cascade.dart b/front_end/testcases/inference/inferred_type_cascade.dart
index a6308da..c7f21af 100644
--- a/front_end/testcases/inference/inferred_type_cascade.dart
+++ b/front_end/testcases/inference/inferred_type_cascade.dart
@@ -11,7 +11,7 @@
   void m() {}
 }
 
-var /*@topType=A*/ v = new A()
+var v = new A()
   .. /*@target=A::a*/ a = 1
   .. /*@target=A::b*/ b. /*@target=List::add*/ add(2)
   .. /*@target=A::m*/ m();
diff --git a/front_end/testcases/inference/inferred_type_custom_binary_op.dart b/front_end/testcases/inference/inferred_type_custom_binary_op.dart
index bc3ee5c..776efe5 100644
--- a/front_end/testcases/inference/inferred_type_custom_binary_op.dart
+++ b/front_end/testcases/inference/inferred_type_custom_binary_op.dart
@@ -10,7 +10,7 @@
 }
 
 C c = new C();
-var /*@topType=bool*/ x = c /*@target=C::**/ * c;
+var x = c /*@target=C::**/ * c;
 
 main() {
   c;
diff --git a/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart b/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart
index 02e1dfb..72a8365 100644
--- a/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart
+++ b/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart
@@ -12,7 +12,7 @@
 abstract class C implements I {}
 
 C c;
-var /*@topType=bool*/ x = c /*@target=I::**/ * c;
+var x = c /*@target=I::**/ * c;
 
 main() {
   c;
diff --git a/front_end/testcases/inference/inferred_type_custom_unary_op.dart b/front_end/testcases/inference/inferred_type_custom_unary_op.dart
index d54e302..26e560c 100644
--- a/front_end/testcases/inference/inferred_type_custom_unary_op.dart
+++ b/front_end/testcases/inference/inferred_type_custom_unary_op.dart
@@ -10,7 +10,7 @@
 }
 
 C c = new C();
-var /*@topType=bool*/ x = /*@target=C::unary-*/ -c;
+var x = /*@target=C::unary-*/ -c;
 
 main() {
   c;
diff --git a/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart b/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart
index 1289475..db149d1 100644
--- a/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart
+++ b/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart
@@ -12,7 +12,7 @@
 abstract class C implements I {}
 
 C c;
-var /*@topType=bool*/ x = /*@target=I::unary-*/ -c;
+var x = /*@target=I::unary-*/ -c;
 
 main() {
   c;
diff --git a/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart b/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart
index e9e21a5..813e3cd 100644
--- a/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart
+++ b/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart
@@ -10,6 +10,6 @@
 }
 
 C f() => null;
-var /*@topType=() -> bool*/ x = f(). /*@target=C::g*/ g;
+var x = f(). /*@target=C::g*/ g;
 
 main() {}
diff --git a/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart b/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart
index 28313ff..b4874c6 100644
--- a/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart
+++ b/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart
@@ -12,6 +12,6 @@
 abstract class C implements I {}
 
 C f() => null;
-var /*@topType=() -> bool*/ x = f(). /*@target=I::g*/ g;
+var x = f(). /*@target=I::g*/ g;
 
 main() {}
diff --git a/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart b/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart
index 4ccdbce..38ccc97 100644
--- a/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart
+++ b/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=(Object) -> void*/ v = print;
+var v = print;
 
 main() {
   v;
diff --git a/front_end/testcases/inference/inferred_type_invoke_method.dart b/front_end/testcases/inference/inferred_type_invoke_method.dart
index ec5825a..387aeff 100644
--- a/front_end/testcases/inference/inferred_type_invoke_method.dart
+++ b/front_end/testcases/inference/inferred_type_invoke_method.dart
@@ -10,6 +10,6 @@
 }
 
 C f() => null;
-var /*@topType=bool*/ x = f(). /*@target=C::g*/ g();
+var x = f(). /*@target=C::g*/ g();
 
 main() {}
diff --git a/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart b/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart
index f28fb58..e31a0d3 100644
--- a/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart
+++ b/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart
@@ -12,6 +12,6 @@
 abstract class C implements I {}
 
 C f() => null;
-var /*@topType=bool*/ x = f(). /*@target=I::g*/ g();
+var x = f(). /*@target=I::g*/ g();
 
 main() {}
diff --git a/front_end/testcases/inference/inferred_type_is_enum.dart b/front_end/testcases/inference/inferred_type_is_enum.dart
index 46c1099..1262709 100644
--- a/front_end/testcases/inference/inferred_type_is_enum.dart
+++ b/front_end/testcases/inference/inferred_type_is_enum.dart
@@ -6,7 +6,7 @@
 library test;
 
 enum E { v1 }
-final /*@topType=E*/ x = E.v1;
+final x = E.v1;
 
 main() {
   x;
diff --git a/front_end/testcases/inference/inferred_type_is_enum_values.dart b/front_end/testcases/inference/inferred_type_is_enum_values.dart
index abc84d5..2463b13 100644
--- a/front_end/testcases/inference/inferred_type_is_enum_values.dart
+++ b/front_end/testcases/inference/inferred_type_is_enum_values.dart
@@ -6,7 +6,7 @@
 library test;
 
 enum E { v1 }
-final /*@topType=List<E>*/ x = E.values;
+final x = E.values;
 
 main() {
   x;
diff --git a/front_end/testcases/inference/inferred_type_is_typedef.dart b/front_end/testcases/inference/inferred_type_is_typedef.dart
index fa8c890..faf400f 100644
--- a/front_end/testcases/inference/inferred_type_is_typedef.dart
+++ b/front_end/testcases/inference/inferred_type_is_typedef.dart
@@ -6,7 +6,7 @@
 library test;
 
 typedef void F();
-final /*@topType=Map<String, () -> void>*/ x = <String, F>{};
+final x = <String, F>{};
 
 main() {
   x;
diff --git a/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart b/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart
index 26b4cc8..09ae0af 100644
--- a/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart
+++ b/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart
@@ -6,6 +6,6 @@
 library test;
 
 typedef T F<T>();
-final /*@topType=Map<String, () -> int>*/ x = <String, F<int>>{};
+final x = <String, F<int>>{};
 
 main() {}
diff --git a/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart b/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart
index 9ea230b..2cc5ff7 100644
--- a/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart
+++ b/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart
@@ -7,7 +7,7 @@
 
 int f() => null;
 String g() => null;
-var /*@topType=List<() -> Object>*/ v = /*@typeArgs=() -> Object*/ [f, g];
+var v = /*@typeArgs=() -> Object*/ [f, g];
 
 main() {
   v;
diff --git a/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart b/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart
index 17056f9..dadf60b 100644
--- a/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart
+++ b/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart
@@ -7,10 +7,7 @@
 
 int f(int x(String y)) => null;
 String g(int x(String y)) => null;
-var /*@topType=List<((String) -> int) -> Object>*/ v = /*@typeArgs=((String) -> int) -> Object*/ [
-  f,
-  g
-];
+var v = /*@typeArgs=((String) -> int) -> Object*/ [f, g];
 
 main() {
   v;
diff --git a/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart b/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart
index 4a1212c..d922665 100644
--- a/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart
+++ b/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart
@@ -7,10 +7,7 @@
 
 int f({int x}) => null;
 String g({int x}) => null;
-var /*@topType=List<({x: int}) -> Object>*/ v = /*@typeArgs=({x: int}) -> Object*/ [
-  f,
-  g
-];
+var v = /*@typeArgs=({x: int}) -> Object*/ [f, g];
 
 main() {
   v;
diff --git a/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart b/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart
index 192c43f..1307233 100644
--- a/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart
+++ b/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart
@@ -7,10 +7,7 @@
 
 int f([int x]) => null;
 String g([int x]) => null;
-var /*@topType=List<([int]) -> Object>*/ v = /*@typeArgs=([int]) -> Object*/ [
-  f,
-  g
-];
+var v = /*@typeArgs=([int]) -> Object*/ [f, g];
 
 main() {
   v;
diff --git a/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart b/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart
index 4d1cef2..926a0d3 100644
--- a/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart
+++ b/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart
@@ -7,7 +7,7 @@
 
 int f(int x) => null;
 String g(int x) => null;
-var /*@topType=List<(int) -> Object>*/ v = /*@typeArgs=(int) -> Object*/ [f, g];
+var v = /*@typeArgs=(int) -> Object*/ [f, g];
 
 main() {
   v;
diff --git a/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart b/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart
index 1408cdd..11972a9 100644
--- a/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart
+++ b/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C {
-  static final /*@topType=(bool) -> (int) -> Map<int, bool>*/ f = /*@returnType=(int) -> Map<int, bool>*/ (bool
+  static final f = /*@returnType=(int) -> Map<int, bool>*/ (bool
       b) => /*@returnType=Map<int, bool>*/ (int i) => /*@typeArgs=int, bool*/ {i: b};
 }
 
diff --git a/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart b/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart
index 3de4209..76efa44 100644
--- a/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart
+++ b/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart
@@ -6,8 +6,7 @@
 library test;
 
 class C {
-  static final /*@topType=(bool) -> bool*/ f = /*@returnType=bool*/ (bool b) =>
-      b;
+  static final f = /*@returnType=bool*/ (bool b) => b;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart b/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart
index 8d3291f..08e3315 100644
--- a/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart
+++ b/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C {
-  static final /*@topType=(bool) -> int*/ f = /*@returnType=int*/ (bool b) => 1;
+  static final f = /*@returnType=int*/ (bool b) => 1;
 }
 
 main() {}
diff --git a/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart b/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart
index 5a23706..1030f5b 100644
--- a/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart
+++ b/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-final /*@topType=(bool) -> int*/ f = /*@returnType=int*/ (bool b) => 1;
+final f = /*@returnType=int*/ (bool b) => 1;
 
 main() {
   f;
diff --git a/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart b/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart
index fb72d4d..4c3240d 100644
--- a/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart
+++ b/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart
@@ -10,7 +10,7 @@
 // circularity.
 
 class I1 {
-  final /*@topType=int*/ x = y;
+  final x = y;
 }
 
 abstract class I2 {
@@ -21,6 +21,6 @@
   int get x => 0;
 }
 
-var /*@topType=int*/ y = new C(). /*@target=C::x*/ x;
+var y = new C(). /*@target=C::x*/ x;
 
 main() {}
diff --git a/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart b/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart
index cca99f8..a1c62d3 100644
--- a/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart
+++ b/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart
@@ -7,7 +7,7 @@
 
 class C<T extends num> {}
 
-var /*@topType=C<int>*/ x = new C<int>();
+var x = new C<int>();
 
 main() {
   x;
diff --git a/front_end/testcases/inference/list_literal_typed.dart b/front_end/testcases/inference/list_literal_typed.dart
index d923333..5182f1a 100644
--- a/front_end/testcases/inference/list_literal_typed.dart
+++ b/front_end/testcases/inference/list_literal_typed.dart
@@ -5,10 +5,10 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=List<int>*/ a = <int>[];
-var /*@topType=List<double>*/ b = <double>[1.0, 2.0, 3.0];
-var /*@topType=List<List<int>>*/ c = <List<int>>[];
-var /*@topType=List<dynamic>*/ d = <dynamic>[1, 2.0, false];
+var a = <int>[];
+var b = <double>[1.0, 2.0, 3.0];
+var c = <List<int>>[];
+var d = <dynamic>[1, 2.0, false];
 
 main() {
   var /*@type=List<int>*/ a = <int>[];
diff --git a/front_end/testcases/inference/list_literals_top_level.dart b/front_end/testcases/inference/list_literals_top_level.dart
index 1f6736b..84b51a0 100644
--- a/front_end/testcases/inference/list_literals_top_level.dart
+++ b/front_end/testcases/inference/list_literals_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=List<int>*/ x1 = /*@typeArgs=int*/ [1, 2, 3];
+var x1 = /*@typeArgs=int*/ [1, 2, 3];
 test1() {
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
@@ -13,7 +13,7 @@
   List<num> y = x1;
 }
 
-var /*@topType=List<num>*/ x2 = /*@typeArgs=num*/ [1, 2.0, 3];
+var x2 = /*@typeArgs=num*/ [1, 2.0, 3];
 test2() {
   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
   x2. /*@target=List::add*/ add(4.0);
diff --git a/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.expect b/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.expect
index e89d29c..f31c88e 100644
--- a/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.expect
+++ b/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t;
+  generic-covariant-impl field self::C::T t;
   constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.transformed.expect b/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.transformed.expect
index e89d29c..f31c88e 100644
--- a/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t;
+  generic-covariant-impl field self::C::T t;
   constructor •(self::C::T t) → self::C<self::C::T>
     : self::C::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect b/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect
index 9c807e8..cdfac01 100644
--- a/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect
+++ b/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T t;
+  generic-covariant-impl field self::C::T t;
   constructor •(self::C::T t) → self::C<self::C::T>
     ;
 }
diff --git a/front_end/testcases/inference/map_literals_top_level.dart b/front_end/testcases/inference/map_literals_top_level.dart
index 7ce98e6..362aef1 100644
--- a/front_end/testcases/inference/map_literals_top_level.dart
+++ b/front_end/testcases/inference/map_literals_top_level.dart
@@ -5,10 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=Map<int, String>*/ x1 = /*@typeArgs=int, String*/ {
-  1: 'x',
-  2: 'y'
-};
+var x1 = /*@typeArgs=int, String*/ {1: 'x', 2: 'y'};
 test1() {
   x1 /*@target=Map::[]=*/ [3] = 'z';
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
@@ -17,11 +14,7 @@
   Map<num, String> y = x1;
 }
 
-var /*@topType=Map<num, Pattern>*/ x2 = /*@typeArgs=num, Pattern*/ {
-  1: 'x',
-  2: 'y',
-  3.0: new RegExp('.')
-};
+var x2 = /*@typeArgs=num, Pattern*/ {1: 'x', 2: 'y', 3.0: new RegExp('.')};
 test2() {
   x2 /*@target=Map::[]=*/ [3] = 'z';
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
diff --git a/front_end/testcases/inference/map_literals_top_level.dart.strong.expect b/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
index 29bcc2c..9049589 100644
--- a/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
+++ b/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
 // Try changing the type of the left hand side, or casting the right hand side to 'num'.
 //   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
 //  - 'Pattern' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
 //   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
@@ -35,15 +35,15 @@
 static field core::Map<core::num, core::Pattern> x2 = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
 static method test1() → dynamic {
   self::x1.{core::Map::[]=}(3, "z");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::int, "w");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                                                   ^" in 4.0 as{TypeError} core::int, "u");
-  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in 42 as{TypeError} core::String);
@@ -51,12 +51,12 @@
 }
 static method test2() → dynamic {
   self::x2.{core::Map::[]=}(3, "z");
-  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
 Try changing the type of the left hand side, or casting the right hand side to 'num'.
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::num, "w");
   self::x2.{core::Map::[]=}(4.0, "u");
-  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
  - 'Pattern' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
diff --git a/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect b/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
index 29bcc2c..9049589 100644
--- a/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
+++ b/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
 // Try changing the type of the left hand side, or casting the right hand side to 'num'.
 //   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
 //  - 'Pattern' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
 //   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
@@ -35,15 +35,15 @@
 static field core::Map<core::num, core::Pattern> x2 = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
 static method test1() → dynamic {
   self::x1.{core::Map::[]=}(3, "z");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::int, "w");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                                                   ^" in 4.0 as{TypeError} core::int, "u");
-  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in 42 as{TypeError} core::String);
@@ -51,12 +51,12 @@
 }
 static method test2() → dynamic {
   self::x2.{core::Map::[]=}(3, "z");
-  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
 Try changing the type of the left hand side, or casting the right hand side to 'num'.
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::num, "w");
   self::x2.{core::Map::[]=}(4.0, "u");
-  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
  - 'Pattern' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
diff --git a/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart b/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart
index 3198118..a1490d6 100644
--- a/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart
+++ b/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart
@@ -11,6 +11,6 @@
 
 class D<T> {}
 
-var /*@topType=D<int>*/ f = new C(). /*@target=C::f*/ f<int>();
+var f = new C(). /*@target=C::f*/ f<int>();
 
 main() {}
diff --git a/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart b/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart
index e7fe40a..3b57d56 100644
--- a/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart
+++ b/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart
@@ -12,6 +12,6 @@
 class D<T> {}
 
 C c;
-var /*@topType=D<int>*/ f = c. /*@target=C::f*/ f<int>();
+var f = c. /*@target=C::f*/ f<int>();
 
 main() {}
diff --git a/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart b/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart
index 1ba94e3..5ca8020 100644
--- a/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart
+++ b/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart
@@ -11,6 +11,6 @@
 
 class D<T> {}
 
-var /*@topType=D<int>*/ f = C.f<int>();
+var f = C.f<int>();
 
 main() {}
diff --git a/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart b/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart
index afc9811..4574e77 100644
--- a/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart
+++ b/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart
@@ -9,7 +9,7 @@
 
 class D<T> {}
 
-var /*@topType=D<int>*/ g = f<int>();
+var g = f<int>();
 
 main() {
   g;
diff --git a/front_end/testcases/inference/mixin_inference_outwards_3.dart b/front_end/testcases/inference/mixin_inference_outwards_3.dart
index 001083d..1d03f48 100644
--- a/front_end/testcases/inference/mixin_inference_outwards_3.dart
+++ b/front_end/testcases/inference/mixin_inference_outwards_3.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class I<X> {}
 
 class M0<T> extends Object implements I<T> {}
@@ -12,7 +10,6 @@
 
 // M0 is inferred as M0<dynamic>
 // Error since class hierarchy is inconsistent
-class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-    extends Object with M0, M1<int> {}
+class A extends Object with M0, M1<int> {}
 
 main() {}
diff --git a/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.expect b/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.expect
index 890adf5..0c7e099 100644
--- a/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.expect
+++ b/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.expect
@@ -1,15 +1,15 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1<int> {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1<int> {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.transformed.expect b/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.transformed.expect
index 2b7b8f2..4a8d005 100644
--- a/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.transformed.expect
@@ -1,15 +1,15 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1<int> {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1<int> {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect b/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
index 6452cea..f4273b4 100644
--- a/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
+++ b/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
@@ -1,15 +1,15 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1<int> {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1<int> {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect b/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
index 890adf5..0c7e099 100644
--- a/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
+++ b/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
@@ -1,15 +1,15 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1<int> {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1<int> {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_outwards_4.dart b/front_end/testcases/inference/mixin_inference_outwards_4.dart
index 73f13f6..4f88178 100644
--- a/front_end/testcases/inference/mixin_inference_outwards_4.dart
+++ b/front_end/testcases/inference/mixin_inference_outwards_4.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class I<X> {}
 
 class M0<T> extends Object implements I<T> {}
@@ -13,8 +11,6 @@
 // M0 is inferred as M0<dynamic> (unconstrained)
 // M1 is inferred as M1<dynamic> (constrained by inferred argument to M0)
 // Error since class hierarchy is inconsistent
-class /*@error=AmbiguousSupertypes*/ A extends Object
-    with M0, M1
-    implements I<int> {}
+class A extends Object with M0, M1 implements I<int> {}
 
 main() {}
diff --git a/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.expect b/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.expect
index fb172cf..969931b 100644
--- a/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.expect
+++ b/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.expect
@@ -1,10 +1,10 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:14:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart'.
-// class /*@error=AmbiguousSupertypes*/ A extends Object
-//                                      ^
+// class A extends Object with M0, M1 implements I<int> {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.transformed.expect b/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.transformed.expect
index 17ece57..b25c51d 100644
--- a/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.transformed.expect
@@ -1,10 +1,10 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:14:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart'.
-// class /*@error=AmbiguousSupertypes*/ A extends Object
-//                                      ^
+// class A extends Object with M0, M1 implements I<int> {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect b/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
index bae1a11..96a22ac 100644
--- a/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
+++ b/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
@@ -1,10 +1,10 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:14:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart'.
-// class /*@error=AmbiguousSupertypes*/ A extends Object
-//                                      ^
+// class A extends Object with M0, M1 implements I<int> {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect b/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
index fb172cf..969931b 100644
--- a/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
+++ b/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
@@ -1,10 +1,10 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:14:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart'.
-// class /*@error=AmbiguousSupertypes*/ A extends Object
-//                                      ^
+// class A extends Object with M0, M1 implements I<int> {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_unification_1.dart b/front_end/testcases/inference/mixin_inference_unification_1.dart
index 002c659..ed6e1be 100644
--- a/front_end/testcases/inference/mixin_inference_unification_1.dart
+++ b/front_end/testcases/inference/mixin_inference_unification_1.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class I<X, Y> {}
 
 class M0<T> implements I<T, int> {}
@@ -12,7 +10,6 @@
 
 // M0 inferred as M0<String>
 // M1 inferred as M1<int>
-class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-    extends Object with M0, M1 {}
+class A extends Object with M0, M1 {}
 
 main() {}
diff --git a/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.expect b/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.expect
index a776b09..59abdc5 100644
--- a/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.expect
+++ b/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.expect
@@ -1,15 +1,15 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.transformed.expect b/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.transformed.expect
index 06aab2c..6a20389 100644
--- a/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.transformed.expect
@@ -1,15 +1,15 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect b/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
index ab6dd91..1858f05 100644
--- a/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
+++ b/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
@@ -1,15 +1,15 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect b/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
index a776b09..59abdc5 100644
--- a/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
+++ b/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
@@ -1,15 +1,15 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_unification_2.dart b/front_end/testcases/inference/mixin_inference_unification_2.dart
index ecff4ec..64d4550 100644
--- a/front_end/testcases/inference/mixin_inference_unification_2.dart
+++ b/front_end/testcases/inference/mixin_inference_unification_2.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class I<X, Y> {}
 
 class M0<T> implements I<T, List<T>> {}
@@ -16,7 +14,6 @@
 // U0 = List<U1>
 // U1 = List<U0>
 // which has no finite solution
-class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-    extends Object with M0, M1 {}
+class A extends Object with M0, M1 {}
 
 main() {}
diff --git a/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.expect b/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.expect
index 6e2e1ab..1ed537d 100644
--- a/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.expect
+++ b/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.expect
@@ -1,17 +1,17 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
 //  - 'List' is from 'dart:core'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
 //  - 'List' is from 'dart:core'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.transformed.expect b/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.transformed.expect
index da13f1a..8b678a5 100644
--- a/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.transformed.expect
@@ -1,17 +1,17 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
 //  - 'List' is from 'dart:core'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
 //  - 'List' is from 'dart:core'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect b/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
index 1e1142a..aa39cba 100644
--- a/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
+++ b/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
@@ -1,17 +1,17 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
 //  - 'List' is from 'dart:core'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
 //  - 'List' is from 'dart:core'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect b/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
index 6e2e1ab..1ed537d 100644
--- a/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
+++ b/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
@@ -1,17 +1,17 @@
 //
 // Problems in component:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
 //  - 'List' is from 'dart:core'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
 //  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
 //  - 'List' is from 'dart:core'.
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
+// class A extends Object with M0, M1 {}
+//       ^
 //
 library;
 import self as self;
diff --git a/front_end/testcases/inference/non_inferrable_getter_setter.dart b/front_end/testcases/inference/non_inferrable_getter_setter.dart
index 919883c..f8ac0dc 100644
--- a/front_end/testcases/inference/non_inferrable_getter_setter.dart
+++ b/front_end/testcases/inference/non_inferrable_getter_setter.dart
@@ -6,8 +6,8 @@
 library test;
 
 class C {
-  get /*@topType=dynamic*/ x => null;
-  void set x(/*@topType=dynamic*/ value) {}
+  get x => null;
+  void set x(value) {}
 }
 
 main() {}
diff --git a/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart b/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
index 65e1bda..2eb6926 100644
--- a/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
+++ b/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=dynamic*/ h = null;
+var h = null;
 void foo(int f(Object _)) {}
 
 test() {
diff --git a/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect b/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect
index 1eed720..8eb4001 100644
--- a/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect
+++ b/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect
@@ -1,6 +1,6 @@
-pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:15:5: Context: Write to f@369
+pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:15:5: Context: Write to f@348
   f = /*@returnType=Null*/ (/*@type=Object*/ x) => 'hello';
     ^
-pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:18:5: Context: Write to g@542
+pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:18:5: Context: Write to g@521
   g = 'hello';
     ^
diff --git a/front_end/testcases/inference/property_get_toplevel.dart b/front_end/testcases/inference/property_get_toplevel.dart
index 745394e..15b76a6 100644
--- a/front_end/testcases/inference/property_get_toplevel.dart
+++ b/front_end/testcases/inference/property_get_toplevel.dart
@@ -12,8 +12,8 @@
 }
 
 C c = new C();
-var /*@topType=() -> int*/ function_ref = c. /*@target=C::function*/ function;
-var /*@topType=List<() -> int>*/ function_ref_list = /*@typeArgs=() -> int*/ [
+var function_ref = c. /*@target=C::function*/ function;
+var function_ref_list = /*@typeArgs=() -> int*/ [
   c. /*@target=C::function*/ function
 ];
 
diff --git a/front_end/testcases/inference/property_set.dart.legacy.expect b/front_end/testcases/inference/property_set.dart.legacy.expect
index 27f4870..dc17adc 100644
--- a/front_end/testcases/inference/property_set.dart.legacy.expect
+++ b/front_end/testcases/inference/property_set.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  field core::List<self::A::T> x = null;
+  generic-covariant-impl field core::List<self::A::T> x = null;
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
-  set y(core::List<self::A::T> value) → void {}
+  set y(generic-covariant-impl core::List<self::A::T> value) → void {}
 }
 static method test() → dynamic {
   self::A<core::int> a_int = new self::A::•<core::int>();
diff --git a/front_end/testcases/inference/property_set.dart.legacy.transformed.expect b/front_end/testcases/inference/property_set.dart.legacy.transformed.expect
index 27f4870..dc17adc 100644
--- a/front_end/testcases/inference/property_set.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/property_set.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  field core::List<self::A::T> x = null;
+  generic-covariant-impl field core::List<self::A::T> x = null;
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
-  set y(core::List<self::A::T> value) → void {}
+  set y(generic-covariant-impl core::List<self::A::T> value) → void {}
 }
 static method test() → dynamic {
   self::A<core::int> a_int = new self::A::•<core::int>();
diff --git a/front_end/testcases/inference/property_set.dart.outline.expect b/front_end/testcases/inference/property_set.dart.outline.expect
index f8ea57e..e1a87aa 100644
--- a/front_end/testcases/inference/property_set.dart.outline.expect
+++ b/front_end/testcases/inference/property_set.dart.outline.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class A<T extends core::Object = dynamic> extends core::Object {
-  field core::List<self::A::T> x;
+  generic-covariant-impl field core::List<self::A::T> x;
   synthetic constructor •() → self::A<self::A::T>
     ;
-  set y(core::List<self::A::T> value) → void
+  set y(generic-covariant-impl core::List<self::A::T> value) → void
     ;
 }
 static method test() → dynamic
diff --git a/front_end/testcases/inference/reference_to_typedef.dart b/front_end/testcases/inference/reference_to_typedef.dart
index 20bd461..59ec3b8 100644
--- a/front_end/testcases/inference/reference_to_typedef.dart
+++ b/front_end/testcases/inference/reference_to_typedef.dart
@@ -6,6 +6,6 @@
 library test;
 
 typedef void F();
-final /*@topType=Type*/ x = F;
+final x = F;
 
 main() {}
diff --git a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.expect b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.expect
index 1a2885a..19bc37f 100644
--- a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.expect
+++ b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::num = dynamic> extends core::Object {
-  field self::C::T a = null;
+  generic-covariant-impl field self::C::T a = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.transformed.expect b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.transformed.expect
index 1a2885a..19bc37f 100644
--- a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::num = dynamic> extends core::Object {
-  field self::C::T a = null;
+  generic-covariant-impl field self::C::T a = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.expect b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.expect
index 2582978..9c77221 100644
--- a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.expect
+++ b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::num = dynamic> extends core::Object {
-  field self::C::T a = null;
+  generic-covariant-impl field self::C::T a = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.transformed.expect b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.transformed.expect
index 2582978..9c77221 100644
--- a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C<T extends core::num = dynamic> extends core::Object {
-  field self::C::T a = null;
+  generic-covariant-impl field self::C::T a = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.expect b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.expect
index 41053f4..b4e4156 100644
--- a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.expect
+++ b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C<T extends core::num = dynamic> extends core::Object {
-  field self::C::T a = null;
+  generic-covariant-impl field self::C::T a = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method op(self::C::T b) → void {
+  method op(generic-covariant-impl self::C::T b) → void {
     self::C::T r1 = this.{self::C::a}.+(b);
     self::C::T r2 = this.{self::C::a}.-(b);
     self::C::T r3 = this.{self::C::a}.*(b);
   }
-  method opEq(self::C::T b) → void {
+  method opEq(generic-covariant-impl self::C::T b) → void {
     this.{self::C::a} = this.{self::C::a}.+(b);
     this.{self::C::a} = this.{self::C::a}.-(b);
     this.{self::C::a} = this.{self::C::a}.*(b);
diff --git a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.transformed.expect b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.transformed.expect
index 41053f4..b4e4156 100644
--- a/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C<T extends core::num = dynamic> extends core::Object {
-  field self::C::T a = null;
+  generic-covariant-impl field self::C::T a = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method op(self::C::T b) → void {
+  method op(generic-covariant-impl self::C::T b) → void {
     self::C::T r1 = this.{self::C::a}.+(b);
     self::C::T r2 = this.{self::C::a}.-(b);
     self::C::T r3 = this.{self::C::a}.*(b);
   }
-  method opEq(self::C::T b) → void {
+  method opEq(generic-covariant-impl self::C::T b) → void {
     this.{self::C::a} = this.{self::C::a}.+(b);
     this.{self::C::a} = this.{self::C::a}.-(b);
     this.{self::C::a} = this.{self::C::a}.*(b);
diff --git a/front_end/testcases/inference/setter_return_type.dart b/front_end/testcases/inference/setter_return_type.dart
index 864265c..7ea8bea 100644
--- a/front_end/testcases/inference/setter_return_type.dart
+++ b/front_end/testcases/inference/setter_return_type.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 class C {
@@ -14,7 +14,7 @@
 }
 
 class D extends C implements I {
-  set /*@topType=void*/ x(/*@topType=int*/ value) {}
+  set x(value) {}
 }
 
 main() {}
diff --git a/front_end/testcases/inference/simple_literal_bool.dart b/front_end/testcases/inference/simple_literal_bool.dart
index 265b08b..d1f1a07 100644
--- a/front_end/testcases/inference/simple_literal_bool.dart
+++ b/front_end/testcases/inference/simple_literal_bool.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=bool*/ a = true;
+var a = true;
 
 main() {
   var /*@type=bool*/ b = false;
diff --git a/front_end/testcases/inference/simple_literal_double.dart b/front_end/testcases/inference/simple_literal_double.dart
index ca78922..c595708 100644
--- a/front_end/testcases/inference/simple_literal_double.dart
+++ b/front_end/testcases/inference/simple_literal_double.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=double*/ a = 1.2;
+var a = 1.2;
 
 main() {
   var /*@type=double*/ b = 3.4;
diff --git a/front_end/testcases/inference/simple_literal_int.dart b/front_end/testcases/inference/simple_literal_int.dart
index c3ae42f..c01ba89 100644
--- a/front_end/testcases/inference/simple_literal_int.dart
+++ b/front_end/testcases/inference/simple_literal_int.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=int*/ a = 1;
+var a = 1;
 
 main() {
   var /*@type=int*/ b = 2;
diff --git a/front_end/testcases/inference/simple_literal_null.dart b/front_end/testcases/inference/simple_literal_null.dart
index d1652f5..6ca0f65 100644
--- a/front_end/testcases/inference/simple_literal_null.dart
+++ b/front_end/testcases/inference/simple_literal_null.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=dynamic*/ a = null;
+var a = null;
 
 main() {
   var /*@type=dynamic*/ b = null;
diff --git a/front_end/testcases/inference/static_method_tear_off.dart b/front_end/testcases/inference/static_method_tear_off.dart
index 7a8dfd9..ecd7504 100644
--- a/front_end/testcases/inference/static_method_tear_off.dart
+++ b/front_end/testcases/inference/static_method_tear_off.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-const /*@topType=(String) -> int*/ v = C.f;
+const v = C.f;
 
 class C {
   static int f(String s) => null;
diff --git a/front_end/testcases/inference/string_literal.dart b/front_end/testcases/inference/string_literal.dart
index 8261e2b..6eb5292 100644
--- a/front_end/testcases/inference/string_literal.dart
+++ b/front_end/testcases/inference/string_literal.dart
@@ -5,10 +5,10 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=int*/ x = 1;
-var /*@topType=String*/ a = 'aaa';
-var /*@topType=String*/ b = 'b ${x} bb';
-var /*@topType=String*/ c = 'c ${x} cc' 'ccc';
+var x = 1;
+var a = 'aaa';
+var b = 'b ${x} bb';
+var c = 'c ${x} cc' 'ccc';
 
 main() {
   var /*@type=int*/ x = 1;
diff --git a/front_end/testcases/inference/super_index_set_substitution.dart.legacy.expect b/front_end/testcases/inference/super_index_set_substitution.dart.legacy.expect
index 5bbe4de..b1c6c5f 100644
--- a/front_end/testcases/inference/super_index_set_substitution.dart.legacy.expect
+++ b/front_end/testcases/inference/super_index_set_substitution.dart.legacy.expect
@@ -9,7 +9,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  operator []=(core::Map<core::int, self::B::T> x, core::List<self::B::T> y) → void {}
+  operator []=(generic-covariant-impl core::Map<core::int, self::B::T> x, generic-covariant-impl core::List<self::B::T> y) → void {}
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → self::C<self::C::U>
diff --git a/front_end/testcases/inference/super_index_set_substitution.dart.legacy.transformed.expect b/front_end/testcases/inference/super_index_set_substitution.dart.legacy.transformed.expect
index 5bbe4de..b1c6c5f 100644
--- a/front_end/testcases/inference/super_index_set_substitution.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/super_index_set_substitution.dart.legacy.transformed.expect
@@ -9,7 +9,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  operator []=(core::Map<core::int, self::B::T> x, core::List<self::B::T> y) → void {}
+  operator []=(generic-covariant-impl core::Map<core::int, self::B::T> x, generic-covariant-impl core::List<self::B::T> y) → void {}
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
   synthetic constructor •() → self::C<self::C::U>
diff --git a/front_end/testcases/inference/super_index_set_substitution.dart.outline.expect b/front_end/testcases/inference/super_index_set_substitution.dart.outline.expect
index a7cf483..80fd653 100644
--- a/front_end/testcases/inference/super_index_set_substitution.dart.outline.expect
+++ b/front_end/testcases/inference/super_index_set_substitution.dart.outline.expect
@@ -8,7 +8,7 @@
 class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T>
     ;
-  operator []=(core::Map<core::int, self::B::T> x, core::List<self::B::T> y) → void
+  operator []=(generic-covariant-impl core::Map<core::int, self::B::T> x, generic-covariant-impl core::List<self::B::T> y) → void
     ;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
diff --git a/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.expect b/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.expect
index b0a8223..20df3bc 100644
--- a/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.expect
+++ b/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.expect
@@ -19,7 +19,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  method g(self::E<self::B::T> x) → self::D<self::B::T>
+  method g(generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
diff --git a/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.transformed.expect b/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.transformed.expect
index b0a8223..20df3bc 100644
--- a/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.transformed.expect
@@ -19,7 +19,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  method g(self::E<self::B::T> x) → self::D<self::B::T>
+  method g(generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
diff --git a/front_end/testcases/inference/super_method_invocation_substitution.dart.outline.expect b/front_end/testcases/inference/super_method_invocation_substitution.dart.outline.expect
index 27eacb9..f2b99a5 100644
--- a/front_end/testcases/inference/super_method_invocation_substitution.dart.outline.expect
+++ b/front_end/testcases/inference/super_method_invocation_substitution.dart.outline.expect
@@ -16,7 +16,7 @@
 class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T>
     ;
-  method g(self::E<self::B::T> x) → self::D<self::B::T>
+  method g(generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
     ;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
diff --git a/front_end/testcases/inference/super_property_get.dart b/front_end/testcases/inference/super_property_get.dart
index 75b3499..d778047 100644
--- a/front_end/testcases/inference/super_property_get.dart
+++ b/front_end/testcases/inference/super_property_get.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C {
-  var /*@topType=int*/ x = 0;
+  var x = 0;
 }
 
 class D extends C {
diff --git a/front_end/testcases/inference/super_property_get_invoke_function_typed.dart b/front_end/testcases/inference/super_property_get_invoke_function_typed.dart
index 1a9fb6d..75a68da 100644
--- a/front_end/testcases/inference/super_property_get_invoke_function_typed.dart
+++ b/front_end/testcases/inference/super_property_get_invoke_function_typed.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C {
-  var /*@topType=() -> int*/ f = /*@returnType=int*/ () => 0;
+  var f = /*@returnType=int*/ () => 0;
 }
 
 class D extends C {
diff --git a/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart b/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart
index 3de2bf8..e7d11f2 100644
--- a/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart
+++ b/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart
@@ -10,7 +10,7 @@
 }
 
 class C {
-  var /*@topType=CallableClass*/ f = new CallableClass();
+  var f = new CallableClass();
 }
 
 class D extends C {
diff --git a/front_end/testcases/inference/super_property_get_substitution.dart.legacy.expect b/front_end/testcases/inference/super_property_get_substitution.dart.legacy.expect
index 23680d0..fd035f1 100644
--- a/front_end/testcases/inference/super_property_get_substitution.dart.legacy.expect
+++ b/front_end/testcases/inference/super_property_get_substitution.dart.legacy.expect
@@ -16,7 +16,7 @@
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::D<self::B::T> x = null;
+  generic-covariant-impl field self::D<self::B::T> x = null;
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/super_property_get_substitution.dart.legacy.transformed.expect b/front_end/testcases/inference/super_property_get_substitution.dart.legacy.transformed.expect
index 23680d0..fd035f1 100644
--- a/front_end/testcases/inference/super_property_get_substitution.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/super_property_get_substitution.dart.legacy.transformed.expect
@@ -16,7 +16,7 @@
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::D<self::B::T> x = null;
+  generic-covariant-impl field self::D<self::B::T> x = null;
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect b/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect
index bc7d92d..caa88dc 100644
--- a/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect
+++ b/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect
@@ -14,7 +14,7 @@
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::D<self::B::T> x;
+  generic-covariant-impl field self::D<self::B::T> x;
   synthetic constructor •() → self::B<self::B::T>
     ;
 }
diff --git a/front_end/testcases/inference/super_property_set_substitution.dart.legacy.expect b/front_end/testcases/inference/super_property_set_substitution.dart.legacy.expect
index 696b98f..ae129dc 100644
--- a/front_end/testcases/inference/super_property_set_substitution.dart.legacy.expect
+++ b/front_end/testcases/inference/super_property_set_substitution.dart.legacy.expect
@@ -16,7 +16,7 @@
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::D<self::B::T> x = null;
+  generic-covariant-impl field self::D<self::B::T> x = null;
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/super_property_set_substitution.dart.legacy.transformed.expect b/front_end/testcases/inference/super_property_set_substitution.dart.legacy.transformed.expect
index 696b98f..ae129dc 100644
--- a/front_end/testcases/inference/super_property_set_substitution.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference/super_property_set_substitution.dart.legacy.transformed.expect
@@ -16,7 +16,7 @@
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::D<self::B::T> x = null;
+  generic-covariant-impl field self::D<self::B::T> x = null;
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/inference/super_property_set_substitution.dart.outline.expect b/front_end/testcases/inference/super_property_set_substitution.dart.outline.expect
index 886a4fd..1fa178c 100644
--- a/front_end/testcases/inference/super_property_set_substitution.dart.outline.expect
+++ b/front_end/testcases/inference/super_property_set_substitution.dart.outline.expect
@@ -14,7 +14,7 @@
     ;
 }
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::D<self::B::T> x;
+  generic-covariant-impl field self::D<self::B::T> x;
   synthetic constructor •() → self::B<self::B::T>
     ;
 }
diff --git a/front_end/testcases/inference/toplevel_inference_toplevel_var.dart b/front_end/testcases/inference/toplevel_inference_toplevel_var.dart
index 86a6ea3..80477d3 100644
--- a/front_end/testcases/inference/toplevel_inference_toplevel_var.dart
+++ b/front_end/testcases/inference/toplevel_inference_toplevel_var.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=int*/ i = 0;
+var i = 0;
 
 main() {
   var /*@type=int*/ j = i;
diff --git a/front_end/testcases/inference/type_cast.dart b/front_end/testcases/inference/type_cast.dart
index 2dd2b01..d55a1cc 100644
--- a/front_end/testcases/inference/type_cast.dart
+++ b/front_end/testcases/inference/type_cast.dart
@@ -8,11 +8,11 @@
 class A<T> {}
 
 class B<T> extends A<T> {
-  /*@topType=dynamic*/ foo() {}
+  foo() {}
 }
 
 A<num> a = new B<int>();
-var /*@topType=B<int>*/ b = (a as B<int>);
+var b = (a as B<int>);
 
 main() {
   A<num> a = new B<int>();
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart b/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart
index b8ba0e2..208b13d 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart
@@ -9,7 +9,7 @@
   C(T x());
 }
 
-var /*@topType=C<dynamic>*/ v = new C<dynamic>(/*@returnType=int*/ () {
+var v = new C<dynamic>(/*@returnType=int*/ () {
   return 1;
 });
 
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart b/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart
index 6313ca1..e59070e 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart
@@ -9,7 +9,7 @@
   C(T x());
 }
 
-var /*@topType=C<int>*/ v = new C<int>(/*@returnType=int*/ () {
+var v = new C<int>(/*@returnType=int*/ () {
   return 1;
 });
 
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart b/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart
index 6ed1ab4..0c85e2f 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart
@@ -9,7 +9,7 @@
   C(x());
 }
 
-var /*@topType=C*/ v = new C(/*@returnType=int*/ () {
+var v = new C(/*@returnType=int*/ () {
   return 1;
 });
 
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart
index 27638af..72be85e 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart
@@ -6,7 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var /*@topType=List<dynamic>*/ v = f<dynamic>(
+var v = f<dynamic>(
     /*@returnType=int*/ () {
   return 1;
 });
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart
index fcb3945..59c1da4 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart
@@ -6,6 +6,8 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
+var v = (f<dynamic>)(() {
+  return 1;
+});
 
 main() {}
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.expect b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.expect
index 361c9d3..ba6541a 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.expect
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:39: Error: An equality expression can't be an operand of another equality expression.
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:19: Error: An equality expression can't be an operand of another equality expression.
 // Try re-writing the expression.
-// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
-//                                       ^
+// var v = (f<dynamic>)(() {
+//                   ^
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Error: Expected an identifier, but got ')'.
-// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
-//                                        ^
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: Expected an identifier, but got ')'.
+// var v = (f<dynamic>)(() {
+//                    ^
 //
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(dynamic).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Error: This couldn't be parsed.
-var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
-                                       ^").call(() → dynamic {
+static field dynamic v = self::f.<(dynamic).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: This couldn't be parsed.
+var v = (f<dynamic>)(() {
+                   ^").call(() → dynamic {
   return 1;
 });
 static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect
index 58e5d4b..48a0717 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:39: Error: An equality expression can't be an operand of another equality expression.
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:19: Error: An equality expression can't be an operand of another equality expression.
 // Try re-writing the expression.
-// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
-//                                       ^
+// var v = (f<dynamic>)(() {
+//                   ^
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:40: Error: Expected an identifier, but got ')'.
-// var /*@topType=dynamic*/v = (f<dynamic>)(() { return 1; });
-//                                        ^
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: Expected an identifier, but got ')'.
+// var v = (f<dynamic>)(() {
+//                    ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
index 90d0037..0a3a0e2 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
@@ -6,8 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var /*@topType=dynamic*/ v =
-    (f)<dynamic>(/*info:INFERRED_TYPE_CLOSURE*/ /*@returnType=int*/ () {
+var v = (f)<dynamic>(/*info:INFERRED_TYPE_CLOSURE*/ /*@returnType=int*/ () {
   return 1;
 });
 
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect
new file mode 100644
index 0000000..a43bff6
--- /dev/null
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<dynamic> v = self::f.call<dynamic>(() → core::int {
+  return 1;
+});
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+  return <self::f::T>[g.call()];
+static method main() → dynamic {
+  self::v;
+}
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart
index cd0d3ba..d332d12 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart
@@ -6,7 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var /*@topType=List<int>*/ v = f<int>(/*@returnType=int*/ () {
+var v = f<int>(/*@returnType=int*/ () {
   return 1;
 });
 
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart
index 761fe2a..b24960b 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart
@@ -6,6 +6,8 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
+var v = (f<int>)(() {
+  return 1;
+});
 
 main() {}
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.expect b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.expect
index 4492f7c..27f915d 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.expect
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:35: Error: An equality expression can't be an operand of another equality expression.
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:15: Error: An equality expression can't be an operand of another equality expression.
 // Try re-writing the expression.
-// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
-//                                   ^
+// var v = (f<int>)(() {
+//               ^
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Error: Expected an identifier, but got ')'.
-// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
-//                                    ^
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: Expected an identifier, but got ')'.
+// var v = (f<int>)(() {
+//                ^
 //
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(core::int).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Error: This couldn't be parsed.
-var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
-                                   ^").call(() → dynamic {
+static field dynamic v = self::f.<(core::int).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: This couldn't be parsed.
+var v = (f<int>)(() {
+               ^").call(() → dynamic {
   return 1;
 });
 static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect
index 6f5ce50..babb86c 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect
@@ -2,14 +2,14 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:35: Error: An equality expression can't be an operand of another equality expression.
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:15: Error: An equality expression can't be an operand of another equality expression.
 // Try re-writing the expression.
-// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
-//                                   ^
+// var v = (f<int>)(() {
+//               ^
 //
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:36: Error: Expected an identifier, but got ')'.
-// var /*@topType=dynamic*/v = (f<int>)(() { return 1; });
-//                                    ^
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: Expected an identifier, but got ')'.
+// var v = (f<int>)(() {
+//                ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
index d9bf6c6..f8ab111 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
@@ -6,8 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var /*@topType=dynamic*/ v =
-    (f)<int>(/*info:INFERRED_TYPE_CLOSURE*/ /*@returnType=int*/ () {
+var v = (f)<int>(/*info:INFERRED_TYPE_CLOSURE*/ /*@returnType=int*/ () {
   return 1;
 });
 
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect
new file mode 100644
index 0000000..cd480b4
--- /dev/null
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int> v = self::f.call<core::int>(() → core::int {
+  return 1;
+});
+static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+  return <self::f::T>[g.call()];
+static method main() → dynamic {
+  self::v;
+}
diff --git a/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart b/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart
index 366bc8c..45e2995 100644
--- a/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart
+++ b/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart
@@ -6,10 +6,10 @@
 library test;
 
 class C {
-  double f(/*@topType=dynamic*/ x) => 1.0;
+  double f(x) => 1.0;
 }
 
-var /*@topType=double*/ v = new C(). /*@target=C::f*/ f(/*@returnType=int*/ () {
+var v = new C(). /*@target=C::f*/ f(/*@returnType=int*/ () {
   return 1;
 });
 
diff --git a/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart b/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart
index bc4dbaf..6e49f44 100644
--- a/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart
+++ b/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart
@@ -16,7 +16,7 @@
   print("running");
 }
 
-var /*@topType=dynamic*/ x = run<dynamic>(printRunning);
+var x = run<dynamic>(printRunning);
 
 main() {
   void printRunning() {
diff --git a/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect b/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect
index 96232fc..0c4ff5c 100644
--- a/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect
+++ b/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect
@@ -1,12 +1,12 @@
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:29:5: Context: Write to x@559
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:29:5: Context: Write to x@538
   x = 123;
     ^
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:30:5: Context: Write to x@559
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:30:5: Context: Write to x@538
   x = 'hi';
     ^
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:31:5: Context: Write to y@612
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:31:5: Context: Write to y@591
   y = /*error:INVALID_ASSIGNMENT*/ 123;
     ^
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:32:5: Context: Write to y@612
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:32:5: Context: Write to y@591
   y = /*error:INVALID_ASSIGNMENT*/ 'hi';
     ^
diff --git a/front_end/testcases/inference_new/dependency_only_if_generic_method.dart b/front_end/testcases/inference_new/dependency_only_if_generic_method.dart
index 68d91d1..5d9af14 100644
--- a/front_end/testcases/inference_new/dependency_only_if_generic_method.dart
+++ b/front_end/testcases/inference_new/dependency_only_if_generic_method.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 class A {
@@ -10,22 +10,21 @@
   int g(dynamic i) => 0;
 }
 
-var /*@topType=A*/ a = new A();
+var a = new A();
 
 // There's a circularity between b and c because a.f is generic, so the type of
 // c is required to infer b, and vice versa.
 
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
-    a. /*@typeArgs=dynamic*/ /*@target=A::f*/ f(c);
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ c = /*@returnType=dynamic*/ () =>
-    a. /*@typeArgs=dynamic*/ /*@target=A::f*/ f(b);
+var b = /*@returnType=invalid-type*/ () =>
+    a. /*@typeArgs=invalid-type*/ /*@target=A::f*/ f(c);
+var c = /*@returnType=invalid-type*/ () =>
+    a. /*@typeArgs=invalid-type*/ /*@target=A::f*/ f(b);
 
 // e's use of a.g breaks the circularity, because a.g is not generic, therefore
 // the type of e does not depend on the type of d.
 
-var /*@topType=() -> () -> int*/ d = /*@returnType=() -> int*/ () =>
+var d = /*@returnType=() -> int*/ () =>
     a. /*@typeArgs=() -> int*/ /*@target=A::f*/ f(e);
-var /*@topType=() -> int*/ e = /*@returnType=int*/ () =>
-    a. /*@target=A::g*/ g(d);
+var e = /*@returnType=int*/ () => a. /*@target=A::g*/ g(d);
 
 main() {}
diff --git a/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect b/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
index 637a638..1681eb9 100644
--- a/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
+++ b/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:67: Error: Can't infer the type of 'c': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:5: Error: Can't infer the type of 'c': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ c = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var c = /*@returnType=invalid-type*/ () =>
+//     ^
 //
-// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:67: Error: Can't infer the type of 'b': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:5: Error: Can't infer the type of 'b': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var b = /*@returnType=invalid-type*/ () =>
+//     ^
 //
 import self as self;
 import "dart:core" as core;
@@ -25,8 +25,8 @@
     return 0;
 }
 static field self::A a = new self::A::•();
-static field dynamic b = () → dynamic => self::a.{self::A::f}<dynamic>(self::c);
-static field dynamic c = () → dynamic => self::a.{self::A::f}<dynamic>(self::b);
+static field invalid-type b = (() → invalid-type => self::a.{self::A::f}<invalid-type>(self::c)) as{TypeError} invalid-type;
+static field invalid-type c = (() → invalid-type => self::a.{self::A::f}<invalid-type>(self::b)) as{TypeError} invalid-type;
 static field () → () → core::int d = () → () → core::int => self::a.{self::A::f}<() → core::int>(self::e);
 static field () → core::int e = () → core::int => self::a.{self::A::g}(self::d);
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect b/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
index 637a638..1681eb9 100644
--- a/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
+++ b/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:67: Error: Can't infer the type of 'c': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:20:5: Error: Can't infer the type of 'c': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ c = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var c = /*@returnType=invalid-type*/ () =>
+//     ^
 //
-// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:67: Error: Can't infer the type of 'b': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:5: Error: Can't infer the type of 'b': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var b = /*@returnType=invalid-type*/ () =>
+//     ^
 //
 import self as self;
 import "dart:core" as core;
@@ -25,8 +25,8 @@
     return 0;
 }
 static field self::A a = new self::A::•();
-static field dynamic b = () → dynamic => self::a.{self::A::f}<dynamic>(self::c);
-static field dynamic c = () → dynamic => self::a.{self::A::f}<dynamic>(self::b);
+static field invalid-type b = (() → invalid-type => self::a.{self::A::f}<invalid-type>(self::c)) as{TypeError} invalid-type;
+static field invalid-type c = (() → invalid-type => self::a.{self::A::f}<invalid-type>(self::b)) as{TypeError} invalid-type;
 static field () → () → core::int d = () → () → core::int => self::a.{self::A::f}<() → core::int>(self::e);
 static field () → core::int e = () → core::int => self::a.{self::A::g}(self::d);
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference_new/dependency_only_if_overloaded.dart b/front_end/testcases/inference_new/dependency_only_if_overloaded.dart
index 0c3cd9b..1880cfe 100644
--- a/front_end/testcases/inference_new/dependency_only_if_overloaded.dart
+++ b/front_end/testcases/inference_new/dependency_only_if_overloaded.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 int intValue = 0;
@@ -12,21 +12,18 @@
 // There's a circularity between a and b because the type of `int + x` depends
 // on the type of x.
 
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
-    intValue /*@target=num::+*/ + b;
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = a();
+var a = /*@returnType=num*/ () => intValue /*@target=num::+*/ + b;
+var b = a();
 
 // But there's no circularity between c and d because the type of `num + x` is
 // always num.
 
-var /*@topType=() -> num*/ c = /*@returnType=num*/ () =>
-    numValue /*@target=num::+*/ + d;
-var /*@topType=num*/ d = c();
+var c = /*@returnType=num*/ () => numValue /*@target=num::+*/ + d;
+var d = c();
 
 // Similar for double.
 
-var /*@topType=() -> double*/ e = /*@returnType=double*/ () =>
-    doubleValue /*@target=double::+*/ + f;
-var /*@topType=double*/ f = e();
+var e = /*@returnType=double*/ () => doubleValue /*@target=double::+*/ + f;
+var f = e();
 
 main() {}
diff --git a/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect b/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
index d2d6d0d..f2657ee 100644
--- a/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
+++ b/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:67: Error: Can't infer the type of 'b': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:16:5: Error: Can't infer the type of 'b': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = a();
-//                                                                   ^
+// var b = a();
+//     ^
 //
-// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:67: Error: Can't infer the type of 'a': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:5: Error: Can't infer the type of 'a': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
-//                                                                   ^
+// var a = /*@returnType=num*/ () => intValue /*@target=num::+*/ + b;
+//     ^
 //
 import self as self;
 import "dart:core" as core;
@@ -18,8 +18,8 @@
 static field core::int intValue = 0;
 static field core::num numValue = 0;
 static field core::double doubleValue = 0.0;
-static field dynamic a = () → core::num => self::intValue.{core::num::+}(self::b as{TypeError} core::num);
-static field dynamic b = self::a.call();
+static field invalid-type a = (() → core::num => self::intValue.{core::num::+}(self::b as{TypeError} core::num)) as{TypeError} invalid-type;
+static field invalid-type b = self::a.call() as{TypeError} invalid-type;
 static field () → core::num c = () → core::num => self::numValue.{core::num::+}(self::d);
 static field core::num d = self::c.call();
 static field () → core::double e = () → core::double => self::doubleValue.{core::double::+}(self::f);
diff --git a/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect b/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
index d2d6d0d..6d183c0 100644
--- a/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
+++ b/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
@@ -2,15 +2,20 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:67: Error: Can't infer the type of 'b': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:72: Error: Can't infer the type of 'b': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = a();
-//                                                                   ^
+// var  /*@error=CantInferTypeDueToCircularity*/ b = a/*@error=UndefinedMethod*/();
+//                                                                        ^
 //
-// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:67: Error: Can't infer the type of 'a': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:72: Error: Can't infer the type of 'a': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
-//                                                                   ^
+// var  /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:77: Error: The method 'call' isn't defined for the class 'invalid-type'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+// var  /*@error=CantInferTypeDueToCircularity*/ b = a/*@error=UndefinedMethod*/();
+//                                                                             ^
 //
 import self as self;
 import "dart:core" as core;
@@ -18,8 +23,11 @@
 static field core::int intValue = 0;
 static field core::num numValue = 0;
 static field core::double doubleValue = 0.0;
-static field dynamic a = () → core::num => self::intValue.{core::num::+}(self::b as{TypeError} core::num);
-static field dynamic b = self::a.call();
+static field invalid-type a = (() → core::num => self::intValue.{core::num::+}(self::b as{TypeError} core::num)) as{TypeError} invalid-type;
+static field invalid-type b = invalid-expression "pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:77: Error: The method 'call' isn't defined for the class 'invalid-type'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+var  /*@error=CantInferTypeDueToCircularity*/ b = a/*@error=UndefinedMethod*/();
+                                                                            ^";
 static field () → core::num c = () → core::num => self::numValue.{core::num::+}(self::d);
 static field core::num d = self::c.call();
 static field () → core::double e = () → core::double => self::doubleValue.{core::double::+}(self::f);
diff --git a/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart b/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart
index 3a5760c..e296a6a 100644
--- a/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart
+++ b/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart
@@ -13,8 +13,6 @@
   B(T x);
 }
 
-var /*@topType=List<B<int>>*/ t3 = /*@typeArgs=B<int>*/ [
-  new /*@typeArgs=int*/ B(3)
-];
+var t3 = /*@typeArgs=B<int>*/ [new /*@typeArgs=int*/ B(3)];
 
 main() {}
diff --git a/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart b/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart
index 4c8edf2..5f75350 100644
--- a/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart
+++ b/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart
@@ -9,8 +9,6 @@
   A(T x);
 }
 
-var /*@topType=List<A<int>>*/ t2 = /*@typeArgs=A<int>*/ [
-  new /*@typeArgs=int*/ A(2)
-];
+var t2 = /*@typeArgs=A<int>*/ [new /*@typeArgs=int*/ A(2)];
 
 main() {}
diff --git a/front_end/testcases/inference_new/field_inference_circularity.dart b/front_end/testcases/inference_new/field_inference_circularity.dart
index d8b81a7..a609915 100644
--- a/front_end/testcases/inference_new/field_inference_circularity.dart
+++ b/front_end/testcases/inference_new/field_inference_circularity.dart
@@ -2,22 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 // A.x depends on B.x which depends on A.x, so no type is inferred.  But types
 // can be inferred for A.y and B.y.
 
 class A {
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-      new B(). /*@target=B::x*/ x;
-  var /*@topType=() -> dynamic*/ y = /*@returnType=dynamic*/ () =>
-      new B(). /*@target=B::x*/ x;
+  var x = /*@returnType=invalid-type*/ () => new B(). /*@target=B::x*/ x;
+  var y = /*@returnType=invalid-type*/ () => new B(). /*@target=B::x*/ x;
 }
 
 class B extends A {
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x;
-  var /*@topType=() -> dynamic*/ y;
+  var x;
+  var y;
 }
 
 main() {}
diff --git a/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect b/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
index 0d47f0c..e436c4f 100644
--- a/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
+++ b/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
@@ -2,29 +2,29 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:69: Error: Can't infer the type of 'x': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:7: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-//                                                                     ^
+//   var x = /*@returnType=invalid-type*/ () => new B(). /*@target=B::x*/ x;
+//       ^
 //
-// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:19:69: Error: Can't infer the type of 'x': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:17:7: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x;
-//                                                                     ^
+//   var x;
+//       ^
 //
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  field dynamic x = () → dynamic => new self::B::•().{self::B::x};
-  field () → dynamic y = () → dynamic => new self::B::•().{self::B::x};
+  field invalid-type x = (() → invalid-type => new self::B::•().{self::B::x}) as{TypeError} invalid-type;
+  field () → invalid-type y = () → invalid-type => new self::B::•().{self::B::x};
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  field dynamic x = null;
-  field () → dynamic y = null;
+  field invalid-type x = null;
+  field () → invalid-type y = null;
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
diff --git a/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect b/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect
index 0d47f0c..e436c4f 100644
--- a/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect
+++ b/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect
@@ -2,29 +2,29 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:69: Error: Can't infer the type of 'x': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:7: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-//                                                                     ^
+//   var x = /*@returnType=invalid-type*/ () => new B(). /*@target=B::x*/ x;
+//       ^
 //
-// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:19:69: Error: Can't infer the type of 'x': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:17:7: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x;
-//                                                                     ^
+//   var x;
+//       ^
 //
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  field dynamic x = () → dynamic => new self::B::•().{self::B::x};
-  field () → dynamic y = () → dynamic => new self::B::•().{self::B::x};
+  field invalid-type x = (() → invalid-type => new self::B::•().{self::B::x}) as{TypeError} invalid-type;
+  field () → invalid-type y = () → invalid-type => new self::B::•().{self::B::x};
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  field dynamic x = null;
-  field () → dynamic y = null;
+  field invalid-type x = null;
+  field () → invalid-type y = null;
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
diff --git a/front_end/testcases/inference_new/for_each_identifier_downwards.dart b/front_end/testcases/inference_new/for_each_identifier_downwards.dart
index 4e96e3e..0977a74 100644
--- a/front_end/testcases/inference_new/for_each_identifier_downwards.dart
+++ b/front_end/testcases/inference_new/for_each_identifier_downwards.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 T f<T>() => null;
diff --git a/front_end/testcases/inference_new/for_each_invalid_iterable.dart b/front_end/testcases/inference_new/for_each_invalid_iterable.dart
index da9ed77..29a09fd 100644
--- a/front_end/testcases/inference_new/for_each_invalid_iterable.dart
+++ b/front_end/testcases/inference_new/for_each_invalid_iterable.dart
@@ -2,16 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 test() async {
   String s;
-  for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
-  await for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
+  for (int x in s) {}
+  await for (int x in s) {}
   int y;
-  for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
-  await for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
+  for (y in s) {}
+  await for (y in s) {}
 }
 
 main() {}
diff --git a/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect b/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
index a921371..d0463b8 100644
--- a/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
+++ b/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:17: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
 //  - 'Iterable' is from 'dart:core'.
-//   for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
-//                                                     ^
+//   for (int x in s) {}
+//                 ^
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:23: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
 //  - 'Stream' is from 'dart:async'.
-//   await for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
-//                                                           ^
+//   await for (int x in s) {}
+//                       ^
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:13: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
 //  - 'Iterable' is from 'dart:core'.
-//   for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
-//                                                 ^
+//   for (y in s) {}
+//             ^
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:19: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
 //  - 'Stream' is from 'dart:async'.
-//   await for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
-//                                                       ^
+//   await for (y in s) {}
+//                   ^
 //
 import self as self;
 import "dart:core" as core;
@@ -28,29 +28,29 @@
 
 static method test() → dynamic async {
   core::String s;
-  for (final dynamic #t1 in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  for (final dynamic #t1 in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:17: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
-  for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
-                                                    ^" in s as{TypeError} core::Iterable<dynamic>) {
+  for (int x in s) {}
+                ^" in s as{TypeError} core::Iterable<dynamic>) {
     core::int x = #t1 as{TypeError} core::int;
   }
-  await for (final dynamic #t3 in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+  await for (final dynamic #t3 in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:23: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
-  await for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
-                                                          ^" in s as{TypeError} asy::Stream<dynamic>) {
+  await for (int x in s) {}
+                      ^" in s as{TypeError} asy::Stream<dynamic>) {
     core::int x = #t3 as{TypeError} core::int;
   }
   core::int y;
-  for (final dynamic #t5 in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  for (final dynamic #t5 in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:13: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
-  for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
-                                                ^" in s as{TypeError} core::Iterable<dynamic>) {
+  for (y in s) {}
+            ^" in s as{TypeError} core::Iterable<dynamic>) {
     y = #t5 as{TypeError} core::int;
   }
-  await for (final dynamic #t7 in let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+  await for (final dynamic #t7 in let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:19: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
-  await for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
-                                                      ^" in s as{TypeError} asy::Stream<dynamic>) {
+  await for (y in s) {}
+                  ^" in s as{TypeError} asy::Stream<dynamic>) {
     y = #t7 as{TypeError} core::int;
   }
 }
diff --git a/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect b/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
index e1b9af6..7376685 100644
--- a/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
+++ b/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:17: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
 //  - 'Iterable' is from 'dart:core'.
-//   for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
-//                                                     ^
+//   for (int x in s) {}
+//                 ^
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:23: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
 //  - 'Stream' is from 'dart:async'.
-//   await for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
-//                                                           ^
+//   await for (int x in s) {}
+//                       ^
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:13: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
 //  - 'Iterable' is from 'dart:core'.
-//   for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
-//                                                 ^
+//   for (y in s) {}
+//             ^
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:19: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
 //  - 'Stream' is from 'dart:async'.
-//   await for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
-//                                                       ^
+//   await for (y in s) {}
+//                   ^
 //
 import self as self;
 import "dart:async" as asy;
@@ -43,17 +43,17 @@
       #L1:
       {
         core::String s;
-        for (final dynamic #t1 in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+        for (final dynamic #t1 in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:17: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
-  for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
-                                                    ^" in s as{TypeError} core::Iterable<dynamic>) {
+  for (int x in s) {}
+                ^" in s as{TypeError} core::Iterable<dynamic>) {
           core::int x = #t1 as{TypeError} core::int;
         }
         {
-          dynamic :stream = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+          dynamic :stream = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:23: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
-  await for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
-                                                          ^" in s as{TypeError} asy::Stream<dynamic>;
+  await for (int x in s) {}
+                      ^" in s as{TypeError} asy::Stream<dynamic>;
           asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
@@ -78,17 +78,17 @@
             }
         }
         core::int y;
-        for (final dynamic #t8 in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+        for (final dynamic #t8 in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:13: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
-  for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
-                                                ^" in s as{TypeError} core::Iterable<dynamic>) {
+  for (y in s) {}
+            ^" in s as{TypeError} core::Iterable<dynamic>) {
           y = #t8 as{TypeError} core::int;
         }
         {
-          dynamic :stream = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+          dynamic :stream = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:19: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
-  await for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
-                                                      ^" in s as{TypeError} asy::Stream<dynamic>;
+  await for (y in s) {}
+                  ^" in s as{TypeError} asy::Stream<dynamic>;
           asy::_asyncStarListenHelper(:stream, :async_op);
           asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
diff --git a/front_end/testcases/inference_new/for_each_outer_var_type.dart b/front_end/testcases/inference_new/for_each_outer_var_type.dart
index 9ffdfe8..e98bf31 100644
--- a/front_end/testcases/inference_new/for_each_outer_var_type.dart
+++ b/front_end/testcases/inference_new/for_each_outer_var_type.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 import 'dart:async';
@@ -23,8 +23,8 @@
   await for (a in stream) {}
   for (b in iterable) {}
   await for (b in stream) {}
-  for (i /*@error=ForInLoopElementTypeNotAssignable*/ in iterable) {}
-  await for (i /*@error=ForInLoopElementTypeNotAssignable*/ in stream) {}
+  for (i in iterable) {}
+  await for (i in stream) {}
   for (a in /*@typeArgs=Iterable<A>*/ f()) {}
   await for (a in /*@typeArgs=Stream<A>*/ f()) {}
 }
diff --git a/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect b/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
index eed185f..01186e9 100644
--- a/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
+++ b/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
@@ -2,17 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:10: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
 //  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 // Try changing the type of the variable.
-//   for (i /*@error=ForInLoopElementTypeNotAssignable*/ in iterable) {}
-//                                                       ^
+//   for (i in iterable) {}
+//          ^
 //
-// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:16: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
 //  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 // Try changing the type of the variable.
-//   await for (i /*@error=ForInLoopElementTypeNotAssignable*/ in stream) {}
-//                                                             ^
+//   await for (i in stream) {}
+//                ^
 //
 import self as self;
 import "dart:core" as core;
@@ -51,18 +51,18 @@
     b = #t4 as{TypeError} self::B;
   }
   for (final self::A #t5 in iterable) {
-    i = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+    i = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:10: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 Try changing the type of the variable.
-  for (i /*@error=ForInLoopElementTypeNotAssignable*/ in iterable) {}
-                                                      ^" in #t5 as{TypeError} core::int;
+  for (i in iterable) {}
+         ^" in #t5 as{TypeError} core::int;
   }
   await for (final self::A #t7 in stream) {
-    i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+    i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:16: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 Try changing the type of the variable.
-  await for (i /*@error=ForInLoopElementTypeNotAssignable*/ in stream) {}
-                                                            ^" in #t7 as{TypeError} core::int;
+  await for (i in stream) {}
+               ^" in #t7 as{TypeError} core::int;
   }
   for (final self::A #t9 in self::f<core::Iterable<self::A>>()) {
     a = #t9;
diff --git a/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index d924c02..4a60fd2 100644
--- a/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:10: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
 //  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 // Try changing the type of the variable.
-//   for (i /*@error=ForInLoopElementTypeNotAssignable*/ in iterable) {}
-//                                                       ^
+//   for (i in iterable) {}
+//          ^
 //
-// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:16: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
 //  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 // Try changing the type of the variable.
-//   await for (i /*@error=ForInLoopElementTypeNotAssignable*/ in stream) {}
-//                                                             ^
+//   await for (i in stream) {}
+//                ^
 //
 import self as self;
 import "dart:core" as core;
@@ -110,11 +110,11 @@
             }
         }
         for (final self::A #t11 in iterable) {
-          i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+          i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:10: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 Try changing the type of the variable.
-  for (i /*@error=ForInLoopElementTypeNotAssignable*/ in iterable) {}
-                                                      ^" in #t11 as{TypeError} core::int;
+  for (i in iterable) {}
+         ^" in #t11 as{TypeError} core::int;
         }
         {
           dynamic :stream = stream;
@@ -129,11 +129,11 @@
               if(:result) {
                 final self::A #t15 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  i = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+                  i = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:16: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 Try changing the type of the variable.
-  await for (i /*@error=ForInLoopElementTypeNotAssignable*/ in stream) {}
-                                                            ^" in #t15 as{TypeError} core::int;
+  await for (i in stream) {}
+               ^" in #t15 as{TypeError} core::int;
                 }
               }
               else
diff --git a/front_end/testcases/inference_new/infer_assign_to_index.dart b/front_end/testcases/inference_new/infer_assign_to_index.dart
index f08da41..8eb3740 100644
--- a/front_end/testcases/inference_new/infer_assign_to_index.dart
+++ b/front_end/testcases/inference_new/infer_assign_to_index.dart
@@ -6,6 +6,6 @@
 library test;
 
 List<double> a = <double>[];
-var /*@topType=double*/ b = (a /*@target=List::[]=*/ [0] = 1.0);
+var b = (a /*@target=List::[]=*/ [0] = 1.0);
 
 main() {}
diff --git a/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.expect b/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.expect
index c6fb73b..9619672 100644
--- a/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.expect
+++ b/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.expect
@@ -8,10 +8,10 @@
     ;
   operator [](core::String s) → self::Base::T
     return this.{self::Base::getValue}(s);
-  operator []=(core::String s, self::Base::U v) → void
+  operator []=(core::String s, generic-covariant-impl self::Base::U v) → void
     return this.{self::Base::setValue}(s, v);
   abstract method getValue(core::String s) → self::Base::T;
-  abstract method setValue(core::String s, self::Base::U v) → void;
+  abstract method setValue(core::String s, generic-covariant-impl self::Base::U v) → void;
 }
 abstract class Test1 extends self::Base<core::int, core::int> {
   synthetic constructor •() → self::Test1
diff --git a/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.transformed.expect b/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.transformed.expect
index c6fb73b..9619672 100644
--- a/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.transformed.expect
@@ -8,10 +8,10 @@
     ;
   operator [](core::String s) → self::Base::T
     return this.{self::Base::getValue}(s);
-  operator []=(core::String s, self::Base::U v) → void
+  operator []=(core::String s, generic-covariant-impl self::Base::U v) → void
     return this.{self::Base::setValue}(s, v);
   abstract method getValue(core::String s) → self::Base::T;
-  abstract method setValue(core::String s, self::Base::U v) → void;
+  abstract method setValue(core::String s, generic-covariant-impl self::Base::U v) → void;
 }
 abstract class Test1 extends self::Base<core::int, core::int> {
   synthetic constructor •() → self::Test1
diff --git a/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.outline.expect b/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.outline.expect
index 43e0d64..98949ae 100644
--- a/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.outline.expect
+++ b/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.outline.expect
@@ -7,10 +7,10 @@
     ;
   operator [](core::String s) → self::Base::T
     ;
-  operator []=(core::String s, self::Base::U v) → void
+  operator []=(core::String s, generic-covariant-impl self::Base::U v) → void
     ;
   abstract method getValue(core::String s) → self::Base::T;
-  abstract method setValue(core::String s, self::Base::U v) → void;
+  abstract method setValue(core::String s, generic-covariant-impl self::Base::U v) → void;
 }
 abstract class Test1 extends self::Base<core::int, core::int> {
   synthetic constructor •() → self::Test1
diff --git a/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.expect b/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.expect
index 8d92bc9..bab4ea5 100644
--- a/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.expect
+++ b/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → self::Test::T;
-  abstract operator []=(core::String s, self::Test::U v) → void;
+  abstract operator []=(core::String s, generic-covariant-impl self::Test::U v) → void;
 }
 static method getInt() → core::int
   return 0;
diff --git a/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.transformed.expect b/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.transformed.expect
index 8d92bc9..bab4ea5 100644
--- a/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   abstract operator [](core::String s) → self::Test::T;
-  abstract operator []=(core::String s, self::Test::U v) → void;
+  abstract operator []=(core::String s, generic-covariant-impl self::Test::U v) → void;
 }
 static method getInt() → core::int
   return 0;
diff --git a/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect b/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect
index f14f72a..2be1f6f 100644
--- a/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect
+++ b/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::Test<self::Test::T, self::Test::U>
     ;
   abstract operator [](core::String s) → self::Test::T;
-  abstract operator []=(core::String s, self::Test::U v) → void;
+  abstract operator []=(core::String s, generic-covariant-impl self::Test::U v) → void;
 }
 static method getInt() → core::int
   ;
diff --git a/front_end/testcases/inference_new/infer_assign_to_property.dart b/front_end/testcases/inference_new/infer_assign_to_property.dart
index eb39317..7b7d80f 100644
--- a/front_end/testcases/inference_new/infer_assign_to_property.dart
+++ b/front_end/testcases/inference_new/infer_assign_to_property.dart
@@ -9,13 +9,13 @@
   int f;
 }
 
-var /*@topType=int*/ v_assign = (new A(). /*@target=A::f*/ f = 1);
-var /*@topType=int*/ v_plus = (new A(). /*@target=A::f*/ f += 1);
-var /*@topType=int*/ v_minus = (new A(). /*@target=A::f*/ f -= 1);
-var /*@topType=int*/ v_multiply = (new A(). /*@target=A::f*/ f *= 1);
-var /*@topType=int*/ v_prefix_pp = (++new A(). /*@target=A::f*/ f);
-var /*@topType=int*/ v_prefix_mm = (--new A(). /*@target=A::f*/ f);
-var /*@topType=int*/ v_postfix_pp = (new A(). /*@target=A::f*/ f++);
-var /*@topType=int*/ v_postfix_mm = (new A(). /*@target=A::f*/ f--);
+var v_assign = (new A(). /*@target=A::f*/ f = 1);
+var v_plus = (new A(). /*@target=A::f*/ f += 1);
+var v_minus = (new A(). /*@target=A::f*/ f -= 1);
+var v_multiply = (new A(). /*@target=A::f*/ f *= 1);
+var v_prefix_pp = (++new A(). /*@target=A::f*/ f);
+var v_prefix_mm = (--new A(). /*@target=A::f*/ f);
+var v_postfix_pp = (new A(). /*@target=A::f*/ f++);
+var v_postfix_mm = (new A(). /*@target=A::f*/ f--);
 
 main() {}
diff --git a/front_end/testcases/inference_new/infer_assign_to_property_custom.dart b/front_end/testcases/inference_new/infer_assign_to_property_custom.dart
index af534a0..0a7493d 100644
--- a/front_end/testcases/inference_new/infer_assign_to_property_custom.dart
+++ b/front_end/testcases/inference_new/infer_assign_to_property_custom.dart
@@ -6,17 +6,17 @@
 library test;
 
 class A {
-  int operator +(/*@topType=dynamic*/ other) => 1;
-  double operator -(/*@topType=dynamic*/ other) => 2.0;
+  int operator +(other) => 1;
+  double operator -(other) => 2.0;
 }
 
 class B {
   A a;
 }
 
-var /*@topType=int*/ v_prefix_pp = (++new B(). /*@target=B::a*/ a);
-var /*@topType=double*/ v_prefix_mm = (--new B(). /*@target=B::a*/ a);
-var /*@topType=A*/ v_postfix_pp = (new B(). /*@target=B::a*/ a++);
-var /*@topType=A*/ v_postfix_mm = (new B(). /*@target=B::a*/ a--);
+var v_prefix_pp = (++new B(). /*@target=B::a*/ a);
+var v_prefix_mm = (--new B(). /*@target=B::a*/ a);
+var v_postfix_pp = (new B(). /*@target=B::a*/ a++);
+var v_postfix_mm = (new B(). /*@target=B::a*/ a--);
 
 main() {}
diff --git a/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect b/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
index 0299145..a3ccc64 100644
--- a/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
+++ b/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
@@ -2,29 +2,29 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:20: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'A'.
-// var /*@topType=int*/ v_prefix_pp = (++new B(). /*@target=B::a*/ a);
-//                                     ^
+// var v_prefix_pp = (++new B(). /*@target=B::a*/ a);
+//                    ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:20: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'A'.
-// var /*@topType=double*/ v_prefix_mm = (--new B(). /*@target=B::a*/ a);
-//                                        ^
+// var v_prefix_mm = (--new B(). /*@target=B::a*/ a);
+//                    ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:48: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'A'.
-// var /*@topType=A*/ v_postfix_pp = (new B(). /*@target=B::a*/ a++);
-//                                                               ^
+// var v_postfix_pp = (new B(). /*@target=B::a*/ a++);
+//                                                ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:48: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'A'.
-// var /*@topType=A*/ v_postfix_mm = (new B(). /*@target=B::a*/ a--);
-//                                                               ^
+// var v_postfix_mm = (new B(). /*@target=B::a*/ a--);
+//                                                ^
 //
 import self as self;
 import "dart:core" as core;
@@ -44,24 +44,24 @@
     : super core::Object::•()
     ;
 }
-static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:20: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
-var /*@topType=int*/ v_prefix_pp = (++new B(). /*@target=B::a*/ a);
-                                    ^" in #t1.{self::B::a}.{self::A::+}(1) as{TypeError} self::A;
-static field core::double v_prefix_mm = let final self::B #t3 = new self::B::•() in #t3.{self::B::a} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+var v_prefix_pp = (++new B(). /*@target=B::a*/ a);
+                   ^" in #t1.{self::B::a}.{self::A::+}(1) as{TypeError} self::A;
+static field core::double v_prefix_mm = let final self::B #t3 = new self::B::•() in #t3.{self::B::a} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:20: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
-var /*@topType=double*/ v_prefix_mm = (--new B(). /*@target=B::a*/ a);
-                                       ^" in #t3.{self::B::a}.{self::A::-}(1) as{TypeError} self::A;
-static field self::A v_postfix_pp = let final self::B #t5 = new self::B::•() in let final self::A #t6 = #t5.{self::B::a} in let final core::int #t7 = #t5.{self::B::a} = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+var v_prefix_mm = (--new B(). /*@target=B::a*/ a);
+                   ^" in #t3.{self::B::a}.{self::A::-}(1) as{TypeError} self::A;
+static field self::A v_postfix_pp = let final self::B #t5 = new self::B::•() in let final self::A #t6 = #t5.{self::B::a} in let final core::int #t7 = #t5.{self::B::a} = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:48: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
-var /*@topType=A*/ v_postfix_pp = (new B(). /*@target=B::a*/ a++);
-                                                              ^" in #t6.{self::A::+}(1) as{TypeError} self::A in #t6;
-static field self::A v_postfix_mm = let final self::B #t9 = new self::B::•() in let final self::A #t10 = #t9.{self::B::a} in let final core::double #t11 = #t9.{self::B::a} = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+var v_postfix_pp = (new B(). /*@target=B::a*/ a++);
+                                               ^" in #t6.{self::A::+}(1) as{TypeError} self::A in #t6;
+static field self::A v_postfix_mm = let final self::B #t9 = new self::B::•() in let final self::A #t10 = #t9.{self::B::a} in let final core::double #t11 = #t9.{self::B::a} = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:48: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
-var /*@topType=A*/ v_postfix_mm = (new B(). /*@target=B::a*/ a--);
-                                                              ^" in #t10.{self::A::-}(1) as{TypeError} self::A in #t10;
+var v_postfix_mm = (new B(). /*@target=B::a*/ a--);
+                                               ^" in #t10.{self::A::-}(1) as{TypeError} self::A in #t10;
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect b/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect
index 7a44f95..2d70eeb 100644
--- a/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect
+++ b/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.transformed.expect
@@ -19,18 +19,18 @@
 }
 static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
-var /*@topType=int*/ v_prefix_pp = (++new B(). /*@target=B::a*/ a);
+var  v_prefix_pp = (++new B(). /*@target=B::a*/ a);
                                     ^" in #t1.{self::B::a}.{self::A::+}(1) as{TypeError} <BottomType>;
 static field core::double v_prefix_mm = let final self::B #t3 = new self::B::•() in #t3.{self::B::a} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
-var /*@topType=double*/ v_prefix_mm = (--new B(). /*@target=B::a*/ a);
+var  v_prefix_mm = (--new B(). /*@target=B::a*/ a);
                                        ^" in #t3.{self::B::a}.{self::A::-}(1) as{TypeError} <BottomType>;
 static field self::A v_postfix_pp = let final self::B #t5 = new self::B::•() in let final self::A #t6 = #t5.{self::B::a} in let final core::int #t7 = #t5.{self::B::a} = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
-var /*@topType=A*/ v_postfix_pp = (new B(). /*@target=B::a*/ a++);
+var  v_postfix_pp = (new B(). /*@target=B::a*/ a++);
                                                               ^" in #t6.{self::A::+}(1) as{TypeError} <BottomType>in #t6;
 static field self::A v_postfix_mm = let final self::B #t9 = new self::B::•() in let final self::A #t10 = #t9.{self::B::a} in let final core::double #t11 = #t9.{self::B::a} = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
 Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
-var /*@topType=A*/ v_postfix_mm = (new B(). /*@target=B::a*/ a--);
+var  v_postfix_mm = (new B(). /*@target=B::a*/ a--);
                                                               ^" in #t10.{self::A::-}(1) as{TypeError} <BottomType>in #t10;
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference_new/infer_assign_to_ref.dart b/front_end/testcases/inference_new/infer_assign_to_ref.dart
index 4ddb4ed..3416a62 100644
--- a/front_end/testcases/inference_new/infer_assign_to_ref.dart
+++ b/front_end/testcases/inference_new/infer_assign_to_ref.dart
@@ -10,9 +10,9 @@
 }
 
 A a = new A();
-var /*@topType=int*/ b = (a. /*@target=A::f*/ f = 1);
-var /*@topType=int*/ c = 0;
-var /*@topType=int*/ d = (c = 1);
+var b = (a. /*@target=A::f*/ f = 1);
+var c = 0;
+var d = (c = 1);
 
 main() {
   a;
diff --git a/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart b/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart
index bec35e1..33c324d 100644
--- a/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart
+++ b/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart
@@ -13,7 +13,7 @@
 // Type inference should fail here since the getter and setter for x don't
 // match.
 class B extends A {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 main() {}
diff --git a/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect b/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
index d33cc4c..9a78098 100644
--- a/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
+++ b/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
@@ -2,10 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:24: Error: The return type of the method 'B.x' is 'int', which does not match the return type, 'double', of the overridden method, 'A.x'.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: The return type of the method 'B.x' is 'int', which does not match the return type, 'double', of the overridden method, 'A.x'.
 // Change to a subtype of 'double'.
-//   var /*@topType=int*/ x;
-//                        ^
+//   var x;
+//       ^
 // pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is the overridden method ('x').
 //   void set x(double value);
 //            ^
diff --git a/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart b/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart
index 4b47931..7ebfa01 100644
--- a/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart
+++ b/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart
@@ -16,7 +16,7 @@
 // The getter in B doesn't screen the setter in A, so inference sees two
 // different types and gives an error.
 class C extends B {
-  var /*@topType=int*/ x;
+  var x;
 }
 
 main() {}
diff --git a/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect b/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
index 9e226c5..83026ec 100644
--- a/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
+++ b/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
@@ -2,10 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:24: Error: The return type of the method 'C.x' is 'int', which does not match the return type, 'num', of the overridden method, 'A.x'.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: The return type of the method 'C.x' is 'int', which does not match the return type, 'num', of the overridden method, 'A.x'.
 // Change to a subtype of 'num'.
-//   var /*@topType=int*/ x;
-//                        ^
+//   var x;
+//       ^
 // pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is the overridden method ('x').
 //   void set x(num value);
 //            ^
diff --git a/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart b/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart
index 182b452..8e774ec 100644
--- a/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart
+++ b/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart
@@ -16,7 +16,7 @@
 // The getter in B doesn't screen the setter in A, so inference sees two
 // different types and gives an error.
 class C extends B {
-  var /*@topType=num*/ x;
+  var x;
 }
 
 main() {}
diff --git a/front_end/testcases/inference_new/infer_instance_accessor_ref.dart b/front_end/testcases/inference_new/infer_instance_accessor_ref.dart
index 9abb415..fd98fc2 100644
--- a/front_end/testcases/inference_new/infer_instance_accessor_ref.dart
+++ b/front_end/testcases/inference_new/infer_instance_accessor_ref.dart
@@ -18,8 +18,8 @@
 
 class D extends C {}
 
-var /*@topType=A*/ a = new A();
-var /*@topType=C*/ x = a. /*@target=A::b*/ b. /*@target=B::c*/ c;
-var /*@topType=C*/ y = a. /*@target=A::b*/ b. /*@target=B::c*/ c ??= new D();
+var a = new A();
+var x = a. /*@target=A::b*/ b. /*@target=B::c*/ c;
+var y = a. /*@target=A::b*/ b. /*@target=B::c*/ c ??= new D();
 
 main() {}
diff --git a/front_end/testcases/inference_new/infer_instance_field_ref.dart b/front_end/testcases/inference_new/infer_instance_field_ref.dart
index 192a93b..e649aab 100644
--- a/front_end/testcases/inference_new/infer_instance_field_ref.dart
+++ b/front_end/testcases/inference_new/infer_instance_field_ref.dart
@@ -17,8 +17,8 @@
 
 class D extends C {}
 
-var /*@topType=A*/ a = new A();
-var /*@topType=C*/ x = a. /*@target=A::b*/ b. /*@target=B::c*/ c;
-var /*@topType=C*/ y = a. /*@target=A::b*/ b. /*@target=B::c*/ c ??= new D();
+var a = new A();
+var x = a. /*@target=A::b*/ b. /*@target=B::c*/ c;
+var y = a. /*@target=A::b*/ b. /*@target=B::c*/ c ??= new D();
 
 main() {}
diff --git a/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart b/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart
index 888321e..9ffd8ea 100644
--- a/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart
+++ b/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart
@@ -2,21 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 // In the code below, there is a circularity between A.b and x.
 
 class A {
-  var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
-      x;
-  var /*@topType=() -> dynamic*/ c = /*@returnType=dynamic*/ () => x;
+  var b = /*@returnType=invalid-type*/ () => x;
+  var c = /*@returnType=invalid-type*/ () => x;
 }
 
-var /*@topType=A*/ a = new A();
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-    a. /*@target=A::b*/ b;
-var /*@topType=() -> () -> dynamic*/ y = /*@returnType=() -> dynamic*/ () =>
-    a. /*@target=A::c*/ c;
+var a = new A();
+var x = /*@returnType=invalid-type*/ () => a. /*@target=A::b*/ b;
+var y = /*@returnType=() -> invalid-type*/ () => a. /*@target=A::c*/ c;
 
 main() {}
diff --git a/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect b/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
index c125a14..46baf2b 100644
--- a/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
+++ b/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:69: Error: Can't infer the type of 'b': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:7: Error: Can't infer the type of 'b': circularity found during type inference.
 // Specify the type explicitly.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
-//                                                                     ^
+//   var b = /*@returnType=invalid-type*/ () => x;
+//       ^
 //
-// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:16:5: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var x = /*@returnType=invalid-type*/ () => a. /*@target=A::b*/ b;
+//     ^
 //
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  field dynamic b = () → dynamic => self::x;
-  field () → dynamic c = () → dynamic => self::x;
+  field invalid-type b = (() → invalid-type => self::x) as{TypeError} invalid-type;
+  field () → invalid-type c = () → invalid-type => self::x;
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 static field self::A a = new self::A::•();
-static field dynamic x = () → dynamic => self::a.{self::A::b};
-static field () → () → dynamic y = () → () → dynamic => self::a.{self::A::c};
+static field invalid-type x = (() → invalid-type => self::a.{self::A::b}) as{TypeError} invalid-type;
+static field () → () → invalid-type y = () → () → invalid-type => self::a.{self::A::c};
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect b/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect
index c125a14..46baf2b 100644
--- a/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect
+++ b/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:69: Error: Can't infer the type of 'b': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:7: Error: Can't infer the type of 'b': circularity found during type inference.
 // Specify the type explicitly.
-//   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ b = /*@returnType=dynamic*/ () =>
-//                                                                     ^
+//   var b = /*@returnType=invalid-type*/ () => x;
+//       ^
 //
-// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:16:5: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var x = /*@returnType=invalid-type*/ () => a. /*@target=A::b*/ b;
+//     ^
 //
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  field dynamic b = () → dynamic => self::x;
-  field () → dynamic c = () → dynamic => self::x;
+  field invalid-type b = (() → invalid-type => self::x) as{TypeError} invalid-type;
+  field () → invalid-type c = () → invalid-type => self::x;
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 static field self::A a = new self::A::•();
-static field dynamic x = () → dynamic => self::a.{self::A::b};
-static field () → () → dynamic y = () → () → dynamic => self::a.{self::A::c};
+static field invalid-type x = (() → invalid-type => self::a.{self::A::b}) as{TypeError} invalid-type;
+static field () → () → invalid-type y = () → () → invalid-type => self::a.{self::A::c};
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference_new/infer_logical.dart b/front_end/testcases/inference_new/infer_logical.dart
index 4989c2a..5cf7f8a 100644
--- a/front_end/testcases/inference_new/infer_logical.dart
+++ b/front_end/testcases/inference_new/infer_logical.dart
@@ -7,8 +7,8 @@
 
 T f<T>() => null;
 
-var /*@topType=bool*/ x = /*@typeArgs=bool*/ f() || /*@typeArgs=bool*/ f();
-var /*@topType=bool*/ y = /*@typeArgs=bool*/ f() && /*@typeArgs=bool*/ f();
+var x = /*@typeArgs=bool*/ f() || /*@typeArgs=bool*/ f();
+var y = /*@typeArgs=bool*/ f() && /*@typeArgs=bool*/ f();
 
 void test() {
   var /*@type=bool*/ x = /*@typeArgs=bool*/ f() || /*@typeArgs=bool*/ f();
diff --git a/front_end/testcases/inference_new/infer_use_of_void.dart b/front_end/testcases/inference_new/infer_use_of_void.dart
index a713ece..a90fa93 100644
--- a/front_end/testcases/inference_new/infer_use_of_void.dart
+++ b/front_end/testcases/inference_new/infer_use_of_void.dart
@@ -10,11 +10,10 @@
 }
 
 class C extends B {
-  /*@topType=void*/ f() {}
+  f() {}
 }
 
-var /*@topType=void*/ x =
-    new C(). /*info:USE_OF_VOID_RESULT*/ /*@target=C::f*/ f();
+var x = new C(). /*info:USE_OF_VOID_RESULT*/ /*@target=C::f*/ f();
 
 main() {
   x;
diff --git a/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart b/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart
index 07bb7f4..6b14c21 100644
--- a/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart
+++ b/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart
@@ -2,10 +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.
 
-/*@testedFeatures=error,inference*/
+/*@testedFeatures=inference*/
 
 int i;
 String s;
-var /*@topType=String*/ x = i = /*@error=InvalidAssignment*/ s;
+var x = i = s;
 
 main() {}
diff --git a/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect b/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
index 28a9284..5768908 100644
--- a/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
+++ b/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:13: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-// var /*@topType=String*/ x = i = /*@error=InvalidAssignment*/ s;
-//                                                              ^
+// var x = i = s;
+//             ^
 //
 import self as self;
 import "dart:core" as core;
 
 static field core::int i;
 static field core::String s;
-static field core::String x = self::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+static field core::String x = self::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:13: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-var /*@topType=String*/ x = i = /*@error=InvalidAssignment*/ s;
-                                                             ^" in self::s as{TypeError} core::int;
+var x = i = s;
+            ^" in self::s as{TypeError} core::int;
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.transformed.expect b/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.transformed.expect
index 90592a6..4b4d6da 100644
--- a/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.transformed.expect
+++ b/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.transformed.expect
@@ -6,6 +6,6 @@
 static field core::String s;
 static field core::String x = self::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
 Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
-var /*@topType=String*/ x = i = /*@error=InvalidAssignment*/ s;
+var  x = i = /*@error=InvalidAssignment*/ s;
                                                              ^" in self::s as{TypeError} <BottomType>;
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart b/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
index 3a9a4bb..1045584 100644
--- a/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
+++ b/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=List<Null>*/ x = /*@typeArgs=Null*/ [null];
+var x = /*@typeArgs=Null*/ [null];
 
 main() {
   x;
diff --git a/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart b/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
index 6b5dccd..04c633b 100644
--- a/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
+++ b/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var /*@topType=Map<Null, Null>*/ x = /*@typeArgs=Null, Null*/ {null: null};
+var x = /*@typeArgs=Null, Null*/ {null: null};
 
 main() {
   x;
diff --git a/front_end/testcases/inference_new/property_get_toplevel.dart b/front_end/testcases/inference_new/property_get_toplevel.dart
index 449ec76..e0201da 100644
--- a/front_end/testcases/inference_new/property_get_toplevel.dart
+++ b/front_end/testcases/inference_new/property_get_toplevel.dart
@@ -12,16 +12,12 @@
 }
 
 C c = new C();
-var /*@topType=int*/ field_ref = c. /*@target=C::field*/ field;
-var /*@topType=int*/ getter_ref = c. /*@target=C::getter*/ getter;
-var /*@topType=() -> int*/ function_ref = c. /*@target=C::function*/ function;
-var /*@topType=List<int>*/ field_ref_list = /*@typeArgs=int*/ [
-  c. /*@target=C::field*/ field
-];
-var /*@topType=List<int>*/ getter_ref_list = /*@typeArgs=int*/ [
-  c. /*@target=C::getter*/ getter
-];
-var /*@topType=List<() -> int>*/ function_ref_list = /*@typeArgs=() -> int*/ [
+var field_ref = c. /*@target=C::field*/ field;
+var getter_ref = c. /*@target=C::getter*/ getter;
+var function_ref = c. /*@target=C::function*/ function;
+var field_ref_list = /*@typeArgs=int*/ [c. /*@target=C::field*/ field];
+var getter_ref_list = /*@typeArgs=int*/ [c. /*@target=C::getter*/ getter];
+var function_ref_list = /*@typeArgs=() -> int*/ [
   c. /*@target=C::function*/ function
 ];
 
diff --git a/front_end/testcases/inference_new/strongly_connected_component.dart b/front_end/testcases/inference_new/strongly_connected_component.dart
index 0589e0a..788e92f 100644
--- a/front_end/testcases/inference_new/strongly_connected_component.dart
+++ b/front_end/testcases/inference_new/strongly_connected_component.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.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 library test;
 
 bool f() => null;
@@ -14,10 +14,8 @@
 // circularity, and for error recovery their type is set to `dynamic`.
 // Thereafter, z infers without problems.
 
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-    f() ? y : z;
-var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-    x;
-var /*@topType=() -> dynamic*/ z = /*@returnType=dynamic*/ () => x;
+var x = /*@returnType=invalid-type*/ () => f() ? y : z;
+var y = /*@returnType=invalid-type*/ () => x;
+var z = /*@returnType=invalid-type*/ () => x;
 
 main() {}
diff --git a/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect b/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
index 6f86a2f..88bfdb0 100644
--- a/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
+++ b/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
@@ -2,22 +2,22 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:19:67: Error: Can't infer the type of 'y': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:18:5: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var y = /*@returnType=invalid-type*/ () => x;
+//     ^
 //
-// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:5: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
-//                                                                   ^
+// var x = /*@returnType=invalid-type*/ () => f() ? y : z;
+//     ^
 //
 import self as self;
 import "dart:core" as core;
 
-static field dynamic x = () → dynamic => self::f() ?{dynamic} self::y : self::z;
-static field dynamic y = () → dynamic => self::x;
-static field () → dynamic z = () → dynamic => self::x;
+static field invalid-type x = (() → invalid-type => self::f() ?{invalid-type} self::y : self::z) as{TypeError} invalid-type;
+static field invalid-type y = (() → invalid-type => self::x) as{TypeError} invalid-type;
+static field () → dynamic z = () → invalid-type => self::x;
 static method f() → core::bool
   return null;
 static method main() → dynamic {}
diff --git a/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect b/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
index 6f86a2f..9a54331 100644
--- a/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
+++ b/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
@@ -4,12 +4,12 @@
 //
 // pkg/front_end/testcases/inference_new/strongly_connected_component.dart:19:67: Error: Can't infer the type of 'y': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
+// var  /*@error=CantInferTypeDueToCircularity*/ y = /*@returnType=dynamic*/ () =>
 //                                                                   ^
 //
 // pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:67: Error: Can't infer the type of 'x': circularity found during type inference.
 // Specify the type explicitly.
-// var /*@topType=dynamic*/ /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
+// var  /*@error=CantInferTypeDueToCircularity*/ x = /*@returnType=dynamic*/ () =>
 //                                                                   ^
 //
 import self as self;
diff --git a/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.expect b/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.expect
index b5345da..0f54c8d 100644
--- a/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.expect
+++ b/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.expect
@@ -19,7 +19,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  operator [](self::E<self::B::T> x) → self::D<self::B::T>
+  operator [](generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
diff --git a/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.transformed.expect b/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.transformed.expect
index b5345da..0f54c8d 100644
--- a/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.transformed.expect
+++ b/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.transformed.expect
@@ -19,7 +19,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  operator [](self::E<self::B::T> x) → self::D<self::B::T>
+  operator [](generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
     return null;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
diff --git a/front_end/testcases/inference_new/super_index_get_substitution.dart.outline.expect b/front_end/testcases/inference_new/super_index_get_substitution.dart.outline.expect
index 44d6487..12ca495 100644
--- a/front_end/testcases/inference_new/super_index_get_substitution.dart.outline.expect
+++ b/front_end/testcases/inference_new/super_index_get_substitution.dart.outline.expect
@@ -16,7 +16,7 @@
 class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T>
     ;
-  operator [](self::E<self::B::T> x) → self::D<self::B::T>
+  operator [](generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
     ;
 }
 class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
diff --git a/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart b/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart
index b0382f2..d687e58 100644
--- a/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart
+++ b/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart
@@ -37,6 +37,6 @@
 // bar().foo resolves to G::foo, which is inherited from E::foo, so its return
 // type is B.  Note that the target is annotated as G::foo, since that is the
 // forwarding stub.
-var /*@topType=B*/ x = bar(). /*@target=G::foo*/ foo();
+var x = bar(). /*@target=G::foo*/ foo();
 
 main() {}
diff --git a/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart b/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
index 54b5f61..937495a 100644
--- a/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
+++ b/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
@@ -6,7 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var /*@topType=List<int>*/ v = (f) /*@typeArgs=int*/ (/*@returnType=int*/ () {
+var v = (f) /*@typeArgs=int*/ (/*@returnType=int*/ () {
   return 1;
 });
 
diff --git a/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart b/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
index 54b5f61..937495a 100644
--- a/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
+++ b/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
@@ -6,7 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var /*@topType=List<int>*/ v = (f) /*@typeArgs=int*/ (/*@returnType=int*/ () {
+var v = (f) /*@typeArgs=int*/ (/*@returnType=int*/ () {
   return 1;
 });
 
diff --git a/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart b/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart
index 0567c06..69ae7ee 100644
--- a/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart
+++ b/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart
@@ -16,7 +16,6 @@
   print("running");
 }
 
-var /*@topType=void*/ y = /*info:USE_OF_VOID_RESULT*/ /*@typeArgs=void*/ run(
-    printRunning);
+var y = /*info:USE_OF_VOID_RESULT*/ /*@typeArgs=void*/ run(printRunning);
 
 main() {}
diff --git a/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect b/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect
index 34e8860..aa682e0 100644
--- a/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect
+++ b/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/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect b/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect
index 34e8860..aa682e0 100644
--- a/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect b/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
index 63b417d..8b8c4bb 100644
--- a/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
+++ b/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/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect b/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
index aa390f4..5ed003d 100644
--- a/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
+++ b/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/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect b/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
index aa390f4..5ed003d 100644
--- a/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
+++ b/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/front_end/testcases/invalid_assignment.dart b/front_end/testcases/invalid_assignment.dart
index 346a87a..0c76ccc 100644
--- a/front_end/testcases/invalid_assignment.dart
+++ b/front_end/testcases/invalid_assignment.dart
@@ -2,19 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class A {
   String operator +(int i) => '';
 }
 
 test(int i, String s, A a) {
   i = 1;
-  i = /*@error=InvalidAssignment*/ s;
+  i = s;
   i ??= 1;
-  i ??= /*@error=InvalidAssignment*/ s;
+  i ??= s;
   a = new A();
-  a /*@error=InvalidAssignment*/ += 1;
+  a += 1;
 }
 
 main() {}
diff --git a/front_end/testcases/invalid_assignment.dart.strong.expect b/front_end/testcases/invalid_assignment.dart.strong.expect
index c15f6aa..32d40ad 100644
--- a/front_end/testcases/invalid_assignment.dart.strong.expect
+++ b/front_end/testcases/invalid_assignment.dart.strong.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   i = /*@error=InvalidAssignment*/ s;
-//                                    ^
+//   i = s;
+//       ^
 //
-// pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   i ??= /*@error=InvalidAssignment*/ s;
-//                                      ^
+//   i ??= s;
+//         ^
 //
-// pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+// pkg/front_end/testcases/invalid_assignment.dart:15:5: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/invalid_assignment.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'A'.
-//   a /*@error=InvalidAssignment*/ += 1;
-//                                  ^
+//   a += 1;
+//     ^
 //
 import self as self;
 import "dart:core" as core;
@@ -30,20 +30,20 @@
 }
 static method test(core::int i, core::String s, self::A a) → dynamic {
   i = 1;
-  i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  i = /*@error=InvalidAssignment*/ s;
-                                   ^" in s as{TypeError} core::int;
+  i = s;
+      ^" in s as{TypeError} core::int;
   i.{core::num::==}(null) ?{core::int} i = 1 : null;
-  i.{core::num::==}(null) ?{core::Object} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  i.{core::num::==}(null) ?{core::Object} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  i ??= /*@error=InvalidAssignment*/ s;
-                                     ^" in s as{TypeError} core::int : null;
+  i ??= s;
+        ^" in s as{TypeError} core::int : null;
   a = new self::A::•();
-  a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+  a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:5: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
  - 'A' is from 'pkg/front_end/testcases/invalid_assignment.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
-  a /*@error=InvalidAssignment*/ += 1;
-                                 ^" in a.{self::A::+}(1) as{TypeError} self::A;
+  a += 1;
+    ^" in a.{self::A::+}(1) as{TypeError} self::A;
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/invalid_assignment.dart.strong.transformed.expect b/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
index c15f6aa..32d40ad 100644
--- a/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
+++ b/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   i = /*@error=InvalidAssignment*/ s;
-//                                    ^
+//   i = s;
+//       ^
 //
-// pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   i ??= /*@error=InvalidAssignment*/ s;
-//                                      ^
+//   i ??= s;
+//         ^
 //
-// pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+// pkg/front_end/testcases/invalid_assignment.dart:15:5: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/invalid_assignment.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'A'.
-//   a /*@error=InvalidAssignment*/ += 1;
-//                                  ^
+//   a += 1;
+//     ^
 //
 import self as self;
 import "dart:core" as core;
@@ -30,20 +30,20 @@
 }
 static method test(core::int i, core::String s, self::A a) → dynamic {
   i = 1;
-  i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  i = /*@error=InvalidAssignment*/ s;
-                                   ^" in s as{TypeError} core::int;
+  i = s;
+      ^" in s as{TypeError} core::int;
   i.{core::num::==}(null) ?{core::int} i = 1 : null;
-  i.{core::num::==}(null) ?{core::Object} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  i.{core::num::==}(null) ?{core::Object} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  i ??= /*@error=InvalidAssignment*/ s;
-                                     ^" in s as{TypeError} core::int : null;
+  i ??= s;
+        ^" in s as{TypeError} core::int : null;
   a = new self::A::•();
-  a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+  a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:5: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
  - 'A' is from 'pkg/front_end/testcases/invalid_assignment.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
-  a /*@error=InvalidAssignment*/ += 1;
-                                 ^" in a.{self::A::+}(1) as{TypeError} self::A;
+  a += 1;
+    ^" in a.{self::A::+}(1) as{TypeError} self::A;
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/invalid_assignment.dart.type_promotion.expect b/front_end/testcases/invalid_assignment.dart.type_promotion.expect
index abff5c0..a7b9f5a 100644
--- a/front_end/testcases/invalid_assignment.dart.type_promotion.expect
+++ b/front_end/testcases/invalid_assignment.dart.type_promotion.expect
@@ -1,18 +1,18 @@
-pkg/front_end/testcases/invalid_assignment.dart:12:5: Context: Write to i@300
+pkg/front_end/testcases/invalid_assignment.dart:10:5: Context: Write to i@273
   i = 1;
     ^
-pkg/front_end/testcases/invalid_assignment.dart:13:5: Context: Write to i@300
-  i = /*@error=InvalidAssignment*/ s;
+pkg/front_end/testcases/invalid_assignment.dart:11:5: Context: Write to i@273
+  i = s;
     ^
-pkg/front_end/testcases/invalid_assignment.dart:14:5: Context: Write to i@300
+pkg/front_end/testcases/invalid_assignment.dart:12:5: Context: Write to i@273
   i ??= 1;
     ^^^
-pkg/front_end/testcases/invalid_assignment.dart:15:5: Context: Write to i@300
-  i ??= /*@error=InvalidAssignment*/ s;
+pkg/front_end/testcases/invalid_assignment.dart:13:5: Context: Write to i@273
+  i ??= s;
     ^^^
-pkg/front_end/testcases/invalid_assignment.dart:16:5: Context: Write to a@315
+pkg/front_end/testcases/invalid_assignment.dart:14:5: Context: Write to a@288
   a = new A();
     ^
-pkg/front_end/testcases/invalid_assignment.dart:17:34: Context: Write to a@315
-  a /*@error=InvalidAssignment*/ += 1;
-                                 ^^
+pkg/front_end/testcases/invalid_assignment.dart:15:5: Context: Write to a@288
+  a += 1;
+    ^^
diff --git a/front_end/testcases/invalid_cast.dart b/front_end/testcases/invalid_cast.dart
index 9baaf86..105b26b 100644
--- a/front_end/testcases/invalid_cast.dart
+++ b/front_end/testcases/invalid_cast.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class C {
   C();
   factory C.fact() => null;
@@ -19,19 +17,17 @@
 
 bad() {
   void localFunction(int i) {}
-  List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];
-  Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};
-  Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};
-  int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;
+  List<int> a = <Object>[];
+  Map<int, String> b = <Object, String>{};
+  Map<int, String> c = <int, Object>{};
+  int Function(Object) d = (int i) => i;
   D e = new C.fact();
   D f = new C.fact2();
-  D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();
-  D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();
-  void Function(Object) i =
-      C. /*@error=InvalidCastStaticMethod*/ staticFunction;
-  void Function(Object)
-      j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;
-  void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;
+  D g = new C.nonFact();
+  D h = new C.nonFact2();
+  void Function(Object) i = C.staticFunction;
+  void Function(Object) j = topLevelFunction;
+  void Function(Object) k = localFunction;
 }
 
 ok() {
diff --git a/front_end/testcases/invalid_cast.dart.strong.expect b/front_end/testcases/invalid_cast.dart.strong.expect
index 254485f..f9329e5 100644
--- a/front_end/testcases/invalid_cast.dart.strong.expect
+++ b/front_end/testcases/invalid_cast.dart.strong.expect
@@ -2,64 +2,64 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
+// pkg/front_end/testcases/invalid_cast.dart:20:25: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
 //  - 'List' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the list literal or the context in which it is used.
-//   List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];
-//                                                            ^
+//   List<int> a = <Object>[];
+//                         ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
+// pkg/front_end/testcases/invalid_cast.dart:21:40: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
 //  - 'Map' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the map literal or the context in which it is used.
-//   Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};
-//                                                                          ^
+//   Map<int, String> b = <Object, String>{};
+//                                        ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
+// pkg/front_end/testcases/invalid_cast.dart:22:37: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
 //  - 'Map' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the map literal or the context in which it is used.
-//   Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};
-//                                                                       ^
+//   Map<int, String> c = <int, Object>{};
+//                                     ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
+// pkg/front_end/testcases/invalid_cast.dart:23:28: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the function expression or the context in which it is used.
-//   int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;
-//                                                               ^
+//   int Function(Object) d = (int i) => i;
+//                            ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+// pkg/front_end/testcases/invalid_cast.dart:26:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
 //  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 //  - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 // Change the type of the object being constructed or the context in which it is used.
-//   D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();
-//                                           ^
+//   D g = new C.nonFact();
+//             ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+// pkg/front_end/testcases/invalid_cast.dart:27:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
 //  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 //  - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 // Change the type of the object being constructed or the context in which it is used.
-//   D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();
-//                                           ^
+//   D h = new C.nonFact2();
+//             ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+// pkg/front_end/testcases/invalid_cast.dart:28:31: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the method or the context in which it is used.
-//       C. /*@error=InvalidCastStaticMethod*/ staticFunction;
-//                                             ^
+//   void Function(Object) i = C.staticFunction;
+//                               ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+// pkg/front_end/testcases/invalid_cast.dart:29:29: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the function or the context in which it is used.
-//       j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;
-//                                                  ^
+//   void Function(Object) j = topLevelFunction;
+//                             ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+// pkg/front_end/testcases/invalid_cast.dart:30:29: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the function or the context in which it is used.
-//   void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;
-//                                                                 ^
+//   void Function(Object) k = localFunction;
+//                             ^
 //
 import self as self;
 import "dart:core" as core;
@@ -89,58 +89,58 @@
 static method topLevelFunction(core::int i) → void {}
 static method bad() → dynamic {
   function localFunction(core::int i) → void {}
-  core::List<core::int> a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
+  core::List<core::int> a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:20:25: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
  - 'List' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
-  List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];
-                                                           ^" in <core::Object>[];
-  core::Map<core::int, core::String> b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
+  List<int> a = <Object>[];
+                        ^" in <core::Object>[];
+  core::Map<core::int, core::String> b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:21:40: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
  - 'Map' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
-  Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};
-                                                                         ^" in <core::Object, core::String>{};
-  core::Map<core::int, core::String> c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
+  Map<int, String> b = <Object, String>{};
+                                       ^" in <core::Object, core::String>{};
+  core::Map<core::int, core::String> c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:37: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
  - 'Map' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
-  Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};
-                                                                      ^" in <core::int, core::Object>{};
-  (core::Object) → core::int d = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
+  Map<int, String> c = <int, Object>{};
+                                    ^" in <core::int, core::Object>{};
+  (core::Object) → core::int d = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:28: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the function expression or the context in which it is used.
-  int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;
-                                                              ^" in (core::int i) → core::int => i;
+  int Function(Object) d = (int i) => i;
+                           ^" in (core::int i) → core::int => i;
   self::D e = self::C::fact() as{TypeError} self::D;
   self::D f = new self::D::•() as{TypeError} self::D;
-  self::D g = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+  self::D g = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:26:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
  - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 Change the type of the object being constructed or the context in which it is used.
-  D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();
-                                          ^" in new self::C::nonFact();
-  self::D h = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+  D g = new C.nonFact();
+            ^" in new self::C::nonFact();
+  self::D h = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:27:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
  - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 Change the type of the object being constructed or the context in which it is used.
-  D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();
-                                          ^" in new self::C::nonFact2();
-  (core::Object) → void i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+  D h = new C.nonFact2();
+            ^" in new self::C::nonFact2();
+  (core::Object) → void i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:31: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the method or the context in which it is used.
-      C. /*@error=InvalidCastStaticMethod*/ staticFunction;
-                                            ^" in self::C::staticFunction;
-  (core::Object) → void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+  void Function(Object) i = C.staticFunction;
+                              ^" in self::C::staticFunction;
+  (core::Object) → void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:29: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
-      j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;
-                                                 ^" in self::topLevelFunction;
-  (core::Object) → void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+  void Function(Object) j = topLevelFunction;
+                            ^" in self::topLevelFunction;
+  (core::Object) → void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:30:29: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
-  void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;
-                                                                ^" in localFunction;
+  void Function(Object) k = localFunction;
+                            ^" in localFunction;
 }
 static method ok() → dynamic {
   function localFunction(core::int i) → void {}
diff --git a/front_end/testcases/invalid_cast.dart.strong.transformed.expect b/front_end/testcases/invalid_cast.dart.strong.transformed.expect
index a04133c..6e9e1eb 100644
--- a/front_end/testcases/invalid_cast.dart.strong.transformed.expect
+++ b/front_end/testcases/invalid_cast.dart.strong.transformed.expect
@@ -2,64 +2,64 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
+// pkg/front_end/testcases/invalid_cast.dart:20:25: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
 //  - 'List' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the list literal or the context in which it is used.
-//   List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];
-//                                                            ^
+//   List<int> a = <Object>[];
+//                         ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
+// pkg/front_end/testcases/invalid_cast.dart:21:40: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
 //  - 'Map' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the map literal or the context in which it is used.
-//   Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};
-//                                                                          ^
+//   Map<int, String> b = <Object, String>{};
+//                                        ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
+// pkg/front_end/testcases/invalid_cast.dart:22:37: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
 //  - 'Map' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the map literal or the context in which it is used.
-//   Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};
-//                                                                       ^
+//   Map<int, String> c = <int, Object>{};
+//                                     ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
+// pkg/front_end/testcases/invalid_cast.dart:23:28: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the function expression or the context in which it is used.
-//   int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;
-//                                                               ^
+//   int Function(Object) d = (int i) => i;
+//                            ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+// pkg/front_end/testcases/invalid_cast.dart:26:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
 //  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 //  - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 // Change the type of the object being constructed or the context in which it is used.
-//   D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();
-//                                           ^
+//   D g = new C.nonFact();
+//             ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+// pkg/front_end/testcases/invalid_cast.dart:27:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
 //  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 //  - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 // Change the type of the object being constructed or the context in which it is used.
-//   D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();
-//                                           ^
+//   D h = new C.nonFact2();
+//             ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+// pkg/front_end/testcases/invalid_cast.dart:28:31: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the method or the context in which it is used.
-//       C. /*@error=InvalidCastStaticMethod*/ staticFunction;
-//                                             ^
+//   void Function(Object) i = C.staticFunction;
+//                               ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+// pkg/front_end/testcases/invalid_cast.dart:29:29: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the function or the context in which it is used.
-//       j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;
-//                                                  ^
+//   void Function(Object) j = topLevelFunction;
+//                             ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+// pkg/front_end/testcases/invalid_cast.dart:30:29: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
 //  - 'Object' is from 'dart:core'.
 // Change the type of the function or the context in which it is used.
-//   void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;
-//                                                                 ^
+//   void Function(Object) k = localFunction;
+//                             ^
 //
 import self as self;
 import "dart:core" as core;
@@ -89,58 +89,58 @@
 static method topLevelFunction(core::int i) → void {}
 static method bad() → dynamic {
   function localFunction(core::int i) → void {}
-  core::List<core::int> a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
+  core::List<core::int> a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:20:25: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
  - 'List' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
-  List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];
-                                                           ^" in <core::Object>[];
-  core::Map<core::int, core::String> b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
+  List<int> a = <Object>[];
+                        ^" in <core::Object>[];
+  core::Map<core::int, core::String> b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:21:40: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
  - 'Map' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
-  Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};
-                                                                         ^" in <core::Object, core::String>{};
-  core::Map<core::int, core::String> c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
+  Map<int, String> b = <Object, String>{};
+                                       ^" in <core::Object, core::String>{};
+  core::Map<core::int, core::String> c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:37: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
  - 'Map' is from 'dart:core'.
  - 'Object' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
-  Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};
-                                                                      ^" in <core::int, core::Object>{};
-  (core::Object) → core::int d = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
+  Map<int, String> c = <int, Object>{};
+                                    ^" in <core::int, core::Object>{};
+  (core::Object) → core::int d = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:28: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the function expression or the context in which it is used.
-  int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;
-                                                              ^" in (core::int i) → core::int => i;
+  int Function(Object) d = (int i) => i;
+                           ^" in (core::int i) → core::int => i;
   self::D e = self::C::fact() as{TypeError} self::D;
   self::D f = new self::D::•() as{TypeError} self::D;
-  self::D g = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+  self::D g = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:26:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
  - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 Change the type of the object being constructed or the context in which it is used.
-  D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();
-                                          ^" in new self::C::nonFact();
-  self::D h = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+  D g = new C.nonFact();
+            ^" in new self::C::nonFact();
+  self::D h = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:27:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
  - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 Change the type of the object being constructed or the context in which it is used.
-  D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();
-                                          ^" in new self::C::nonFact2();
-  (core::Object) → void i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+  D h = new C.nonFact2();
+            ^" in new self::C::nonFact2();
+  (core::Object) → void i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:31: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the method or the context in which it is used.
-      C. /*@error=InvalidCastStaticMethod*/ staticFunction;
-                                            ^" in self::C::staticFunction;
-  (core::Object) → void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+  void Function(Object) i = C.staticFunction;
+                              ^" in self::C::staticFunction;
+  (core::Object) → void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:29: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
-      j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;
-                                                 ^" in self::topLevelFunction;
-  (core::Object) → void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+  void Function(Object) j = topLevelFunction;
+                            ^" in self::topLevelFunction;
+  (core::Object) → void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:30:29: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
-  void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;
-                                                                ^" in localFunction;
+  void Function(Object) k = localFunction;
+                            ^" in localFunction;
 }
 static method ok() → dynamic {
   function localFunction(core::int i) → void {}
diff --git a/front_end/testcases/issue34899.dart.legacy.expect b/front_end/testcases/issue34899.dart.legacy.expect
index 41128df..e7b5b76 100644
--- a/front_end/testcases/issue34899.dart.legacy.expect
+++ b/front_end/testcases/issue34899.dart.legacy.expect
@@ -5,7 +5,7 @@
 
 class Foo<T extends core::Object = dynamic> extends core::Object {
   final field () → asy::Future<dynamic> quux;
-  field self::Foo::T t;
+  generic-covariant-impl field self::Foo::T t;
   constructor •(() → asy::Future<dynamic> quux, self::Foo::T t) → self::Foo<self::Foo::T>
     : self::Foo::quux = quux, self::Foo::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/issue34899.dart.legacy.transformed.expect b/front_end/testcases/issue34899.dart.legacy.transformed.expect
index 41128df..e7b5b76 100644
--- a/front_end/testcases/issue34899.dart.legacy.transformed.expect
+++ b/front_end/testcases/issue34899.dart.legacy.transformed.expect
@@ -5,7 +5,7 @@
 
 class Foo<T extends core::Object = dynamic> extends core::Object {
   final field () → asy::Future<dynamic> quux;
-  field self::Foo::T t;
+  generic-covariant-impl field self::Foo::T t;
   constructor •(() → asy::Future<dynamic> quux, self::Foo::T t) → self::Foo<self::Foo::T>
     : self::Foo::quux = quux, self::Foo::t = t, super core::Object::•()
     ;
diff --git a/front_end/testcases/issue34899.dart.outline.expect b/front_end/testcases/issue34899.dart.outline.expect
index 1d77be0..48da0fa 100644
--- a/front_end/testcases/issue34899.dart.outline.expect
+++ b/front_end/testcases/issue34899.dart.outline.expect
@@ -5,7 +5,7 @@
 
 class Foo<T extends core::Object = dynamic> extends core::Object {
   final field () → asy::Future<dynamic> quux;
-  field self::Foo::T t;
+  generic-covariant-impl field self::Foo::T t;
   constructor •(() → asy::Future<dynamic> quux, self::Foo::T t) → self::Foo<self::Foo::T>
     ;
   method call() → asy::Future<self::Foo::T>
diff --git a/front_end/testcases/legacy.status b/front_end/testcases/legacy.status
index 947de8b..b1b1917 100644
--- a/front_end/testcases/legacy.status
+++ b/front_end/testcases/legacy.status
@@ -11,6 +11,7 @@
 call: Fail # Test can't run.
 constructor_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
 constructor_initializer_invalid: RuntimeError # Fails execution after recovery
+control_flow_collection: RuntimeError
 duplicated_field_initializer: RuntimeError
 external_import: RuntimeError # Expected -- test uses import which doesn't exist.
 fallthrough: Fail # Missing FallThroughError.
@@ -19,6 +20,7 @@
 inference/bug31436: RuntimeError # Test exercises Dart 2.0 semantics
 inference/constructors_too_many_positional_arguments: Fail
 inference/downwards_inference_annotations_locals: Fail # Issue #30031
+inference/downwards_inference_for_each: RuntimeError # Issue #36382
 inference/future_then_explicit_future: RuntimeError
 inference/generic_methods_infer_js_builtin: RuntimeError # Test attempts to access platform-private library leading to NSM.
 inference/infer_assign_to_index: Fail
@@ -35,6 +37,7 @@
 micro: Fail # External method marked abstract.
 minimum_int: Crash # Min int literal not supported in non-strong mode.
 named_parameters: Fail # Missing types and unnecessary default values.
+operator_method_not_found: RuntimeError # Expected
 optional: Fail # Unnecessary default values.
 rasta/abstract_constructor: Fail
 rasta/bad_constructor_redirection: Fail
@@ -111,6 +114,10 @@
 regress/issue_35259: RuntimeError # Expected
 regress/issue_35260: RuntimeError # Expected
 regress/issue_35266: RuntimeError # Expected
+regress/issue_36400: RuntimeError
+regress/issue_36647: RuntimeError # Expected
+regress/issue_36647_2: RuntimeError # Expected
+regress/issue_36669: RuntimeError
 reject_generic_function_types_in_bounds: RuntimeError # Expected
 runtime_checks/implicit_downcast_constructor_initializer: RuntimeError # Test exercises strong mode semantics
 runtime_checks/implicit_downcast_do: RuntimeError # Test exercises strong mode semantics
@@ -126,6 +133,7 @@
 runtime_checks_new/stub_checked_via_target: RuntimeError # Test exercises strong mode semantics
 set_literals/disambiguation_rule: RuntimeError
 spread_collection: RuntimeError
+type_parameter_type_named_int: RuntimeError # Expected
 type_variable_as_super: Fail
 uninitialized_fields: Fail # Fasta and dartk disagree on static initializers
 void_methods: Fail # Bad return from setters.
diff --git a/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect b/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect
index fb518e4..c22e364 100644
--- a/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect
+++ b/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect
@@ -8,11 +8,11 @@
     ;
 }
 class C<T extends self::A = dynamic> extends core::Object {
-  field self::C::T _field = null;
+  generic-covariant-impl field self::C::T _field = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method foo(self::C::T x) → dynamic {
+  method foo(generic-covariant-impl self::C::T x) → dynamic {
     this.{self::C::_field} = x;
   }
 }
diff --git a/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect b/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect
index 9db2af2..b5de22c 100644
--- a/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect
+++ b/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect
@@ -8,11 +8,11 @@
     ;
 }
 class C<T extends self::A = dynamic> extends core::Object {
-  field self::C::T _field = null;
+  generic-covariant-impl field self::C::T _field = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method foo(self::C::T x) → dynamic {
+  method foo(generic-covariant-impl self::C::T x) → dynamic {
     this.{self::C::_field} = x;
   }
 }
@@ -22,11 +22,11 @@
     ;
 }
 abstract class _Foo&Object&C extends core::Object implements self::C<self::B> {
-  field self::B _field = null;
+  generic-covariant-impl field self::B _field = null;
   synthetic constructor •() → self::_Foo&Object&C
     : super core::Object::•()
     ;
-  method foo(self::B x) → dynamic {
+  method foo(generic-covariant-impl self::B x) → dynamic {
     this.{self::C::_field} = x;
   }
 }
diff --git a/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect b/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
index 1d0284c..340756e 100644
--- a/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
+++ b/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
@@ -7,10 +7,10 @@
     ;
 }
 class C<T extends self::A = dynamic> extends core::Object {
-  field self::C::T _field;
+  generic-covariant-impl field self::C::T _field;
   synthetic constructor •() → self::C<self::C::T>
     ;
-  method foo(self::C::T x) → dynamic
+  method foo(generic-covariant-impl self::C::T x) → dynamic
     ;
 }
 class D extends self::C<self::B> {
diff --git a/front_end/testcases/named_function_scope.dart b/front_end/testcases/named_function_scope.dart
index 97888e3..25c77b1 100644
--- a/front_end/testcases/named_function_scope.dart
+++ b/front_end/testcases/named_function_scope.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error,warning,context*/
-
 class T {}
 
 class V {}
@@ -25,64 +23,51 @@
     T t;
     // This doesn't cause a scope error as the named function expression has
     // its own scope.
-    var x = /*@error=NamedFunctionExpression*/ T() {};
+    var x = T() {};
   }
   {
-    /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
+    V v;
     // This causes an error, V is already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V;
+    var V;
   }
   {
-    /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
+    V v;
     // This causes an error, V is already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
+    var V = null;
   }
   {
     // This causes a scope error as T is already used in the function-type
     // scope (the return type).
-    var x =
-        /*@context=DuplicatedNamePreviouslyUsedCause*/
-        T
-        /*@error=NamedFunctionExpression*/
-        /*@error=DuplicatedNamePreviouslyUsed*/
-        T() {};
+    var x = T T() {};
   }
   {
     // This causes a scope error: using the outer definition of `V` as a type
     // when defining `V`.
-    /*@context=DuplicatedNamePreviouslyUsedCause*/
-    V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+
+    V V;
   }
   {
     // This causes a scope error as T is already defined as a type variable in
     // the function-type scope.
-    var x =
-        /*@error=NamedFunctionExpression*/
-        /*@error=DuplicatedDeclaration*/
-        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+    var x = T<T>() {};
   }
   {
-    /*@context=DuplicatedNamePreviouslyUsedCause*/
     T t;
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+    T T() {}
   }
   {
-    /*@context=DuplicatedNamePreviouslyUsedCause*/
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+    T T() {}
   }
   {
-    /*@context=DuplicatedNamePreviouslyUsedCause*/
     T t;
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+    T T(T t) {}
   }
   {
-    /*@context=DuplicatedNamePreviouslyUsedCause*/
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+    T T(T t) {}
   }
   {
-    void T(/*@error=NotAType*/ T t) {}
+    void T(T t) {}
   }
 }
 
-void main() {
-}
+void main() {}
diff --git a/front_end/testcases/named_function_scope.dart.legacy.expect b/front_end/testcases/named_function_scope.dart.legacy.expect
index 5bc6572..69b1086 100644
--- a/front_end/testcases/named_function_scope.dart.legacy.expect
+++ b/front_end/testcases/named_function_scope.dart.legacy.expect
@@ -2,84 +2,84 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
-//     var x = /*@error=NamedFunctionExpression*/ T() {};
-//                                                ^
+// pkg/front_end/testcases/named_function_scope.dart:26:13: Error: A function expression can't have a name.
+//     var x = T() {};
+//             ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
-//     var /*@error=DuplicatedNamePreviouslyUsed*/ V;
-//                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:31:52: Context: Previous use of 'V'.
-//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
-//                                                    ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
-//     var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
-//                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:36:52: Context: Previous use of 'V'.
-//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
-//                                                    ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
-//         T() {};
+// pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
+//     var V;
 //         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
-//         T() {};
-//         ^
-// pkg/front_end/testcases/named_function_scope.dart:45:9: Context: Previous use of 'T'.
-//         T
-//         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
-//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:54:5: Context: Previous use of 'V'.
-//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+// pkg/front_end/testcases/named_function_scope.dart:29:5: Context: Previous use of 'V'.
+//     V v;
 //     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+// pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
+//     var V = null;
 //         ^
+// pkg/front_end/testcases/named_function_scope.dart:34:5: Context: Previous use of 'V'.
+//     V v;
+//     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//         ^
-// pkg/front_end/testcases/named_function_scope.dart:62:52: Context: Previous declaration of 'T'.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//                                                    ^
+// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: A function expression can't have a name.
+//     var x = T T() {};
+//               ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+//     var x = T T() {};
+//               ^
+// pkg/front_end/testcases/named_function_scope.dart:41:13: Context: Previous use of 'T'.
+//     var x = T T() {};
+//             ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
+//     V V;
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:47:5: Context: Previous use of 'V'.
+//     V V;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: A function expression can't have a name.
+//     var x = T<T>() {};
+//             ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+//     var x = T<T>() {};
+//             ^
+// pkg/front_end/testcases/named_function_scope.dart:52:15: Context: Previous declaration of 'T'.
+//     var x = T<T>() {};
+//               ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T() {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:55:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T() {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:59:5: Context: Previous use of 'T'.
+//     T T() {}
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T(T t) {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:62:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T(T t) {}
+//       ^
 // pkg/front_end/testcases/named_function_scope.dart:66:5: Context: Previous use of 'T'.
-//     T t;
+//     T T(T t) {}
 //     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:71:5: Context: Previous use of 'T'.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:75:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:80:5: Context: Previous use of 'T'.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:83:32: Warning: 'T' isn't a type.
-//     void T(/*@error=NotAType*/ T t) {}
-//                                ^
+// pkg/front_end/testcases/named_function_scope.dart:69:12: Warning: 'T' isn't a type.
+//     void T(T t) {}
+//            ^
 //
 import self as self;
 import "dart:core" as core;
@@ -109,62 +109,62 @@
   }
   {
     self::V v;
-    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                                ^";
+    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
+    var V;
+        ^";
   }
   {
     self::V v;
-    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
-                                                ^" in null;
+    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
+    var V = null;
+        ^" in null;
   }
   {
-    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
-        T() {};
-        ^" in let final () → self::T T = () → self::T {} in T;
+    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+    var x = T T() {};
+              ^" in let final () → self::T T = () → self::T {} in T;
   }
   {
-    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
-    V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                              ^";
+    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
+    V V;
+      ^";
   }
   {
-    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
+    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+    var x = T<T>() {};
+            ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
     self::T t;
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T() {}
+      ^";
       function T() → self::T {}
     }
   }
   {
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T() {}
+      ^";
       function T() → self::T {}
     }
   }
   {
     self::T t;
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T(T t) {}
+      ^";
       function T(self::T t) → self::T {}
     }
   }
   {
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T(T t) {}
+      ^";
       function T(self::T t) → self::T {}
     }
   }
diff --git a/front_end/testcases/named_function_scope.dart.legacy.transformed.expect b/front_end/testcases/named_function_scope.dart.legacy.transformed.expect
index 5bc6572..69b1086 100644
--- a/front_end/testcases/named_function_scope.dart.legacy.transformed.expect
+++ b/front_end/testcases/named_function_scope.dart.legacy.transformed.expect
@@ -2,84 +2,84 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
-//     var x = /*@error=NamedFunctionExpression*/ T() {};
-//                                                ^
+// pkg/front_end/testcases/named_function_scope.dart:26:13: Error: A function expression can't have a name.
+//     var x = T() {};
+//             ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
-//     var /*@error=DuplicatedNamePreviouslyUsed*/ V;
-//                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:31:52: Context: Previous use of 'V'.
-//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
-//                                                    ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
-//     var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
-//                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:36:52: Context: Previous use of 'V'.
-//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
-//                                                    ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
-//         T() {};
+// pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
+//     var V;
 //         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
-//         T() {};
-//         ^
-// pkg/front_end/testcases/named_function_scope.dart:45:9: Context: Previous use of 'T'.
-//         T
-//         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
-//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:54:5: Context: Previous use of 'V'.
-//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+// pkg/front_end/testcases/named_function_scope.dart:29:5: Context: Previous use of 'V'.
+//     V v;
 //     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+// pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
+//     var V = null;
 //         ^
+// pkg/front_end/testcases/named_function_scope.dart:34:5: Context: Previous use of 'V'.
+//     V v;
+//     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//         ^
-// pkg/front_end/testcases/named_function_scope.dart:62:52: Context: Previous declaration of 'T'.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//                                                    ^
+// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: A function expression can't have a name.
+//     var x = T T() {};
+//               ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+//     var x = T T() {};
+//               ^
+// pkg/front_end/testcases/named_function_scope.dart:41:13: Context: Previous use of 'T'.
+//     var x = T T() {};
+//             ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
+//     V V;
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:47:5: Context: Previous use of 'V'.
+//     V V;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: A function expression can't have a name.
+//     var x = T<T>() {};
+//             ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+//     var x = T<T>() {};
+//             ^
+// pkg/front_end/testcases/named_function_scope.dart:52:15: Context: Previous declaration of 'T'.
+//     var x = T<T>() {};
+//               ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T() {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:55:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T() {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:59:5: Context: Previous use of 'T'.
+//     T T() {}
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T(T t) {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:62:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T(T t) {}
+//       ^
 // pkg/front_end/testcases/named_function_scope.dart:66:5: Context: Previous use of 'T'.
-//     T t;
+//     T T(T t) {}
 //     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:71:5: Context: Previous use of 'T'.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:75:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:80:5: Context: Previous use of 'T'.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:83:32: Warning: 'T' isn't a type.
-//     void T(/*@error=NotAType*/ T t) {}
-//                                ^
+// pkg/front_end/testcases/named_function_scope.dart:69:12: Warning: 'T' isn't a type.
+//     void T(T t) {}
+//            ^
 //
 import self as self;
 import "dart:core" as core;
@@ -109,62 +109,62 @@
   }
   {
     self::V v;
-    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                                ^";
+    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
+    var V;
+        ^";
   }
   {
     self::V v;
-    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
-                                                ^" in null;
+    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
+    var V = null;
+        ^" in null;
   }
   {
-    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
-        T() {};
-        ^" in let final () → self::T T = () → self::T {} in T;
+    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+    var x = T T() {};
+              ^" in let final () → self::T T = () → self::T {} in T;
   }
   {
-    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
-    V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                              ^";
+    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
+    V V;
+      ^";
   }
   {
-    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
+    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+    var x = T<T>() {};
+            ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
     self::T t;
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T() {}
+      ^";
       function T() → self::T {}
     }
   }
   {
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T() {}
+      ^";
       function T() → self::T {}
     }
   }
   {
     self::T t;
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T(T t) {}
+      ^";
       function T(self::T t) → self::T {}
     }
   }
   {
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T(T t) {}
+      ^";
       function T(self::T t) → self::T {}
     }
   }
diff --git a/front_end/testcases/named_function_scope.dart.strong.expect b/front_end/testcases/named_function_scope.dart.strong.expect
index d898d98..ec10637 100644
--- a/front_end/testcases/named_function_scope.dart.strong.expect
+++ b/front_end/testcases/named_function_scope.dart.strong.expect
@@ -2,84 +2,84 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
-//     var x = /*@error=NamedFunctionExpression*/ T() {};
-//                                                ^
+// pkg/front_end/testcases/named_function_scope.dart:26:13: Error: A function expression can't have a name.
+//     var x = T() {};
+//             ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
-//     var /*@error=DuplicatedNamePreviouslyUsed*/ V;
-//                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:31:52: Context: Previous use of 'V'.
-//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
-//                                                    ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
-//     var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
-//                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:36:52: Context: Previous use of 'V'.
-//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
-//                                                    ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
-//         T() {};
+// pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
+//     var V;
 //         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
-//         T() {};
-//         ^
-// pkg/front_end/testcases/named_function_scope.dart:45:9: Context: Previous use of 'T'.
-//         T
-//         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
-//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:54:5: Context: Previous use of 'V'.
-//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+// pkg/front_end/testcases/named_function_scope.dart:29:5: Context: Previous use of 'V'.
+//     V v;
 //     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+// pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
+//     var V = null;
 //         ^
+// pkg/front_end/testcases/named_function_scope.dart:34:5: Context: Previous use of 'V'.
+//     V v;
+//     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//         ^
-// pkg/front_end/testcases/named_function_scope.dart:62:52: Context: Previous declaration of 'T'.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//                                                    ^
+// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: A function expression can't have a name.
+//     var x = T T() {};
+//               ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+//     var x = T T() {};
+//               ^
+// pkg/front_end/testcases/named_function_scope.dart:41:13: Context: Previous use of 'T'.
+//     var x = T T() {};
+//             ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
+//     V V;
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:47:5: Context: Previous use of 'V'.
+//     V V;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: A function expression can't have a name.
+//     var x = T<T>() {};
+//             ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+//     var x = T<T>() {};
+//             ^
+// pkg/front_end/testcases/named_function_scope.dart:52:15: Context: Previous declaration of 'T'.
+//     var x = T<T>() {};
+//               ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T() {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:55:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T() {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:59:5: Context: Previous use of 'T'.
+//     T T() {}
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T(T t) {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:62:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T(T t) {}
+//       ^
 // pkg/front_end/testcases/named_function_scope.dart:66:5: Context: Previous use of 'T'.
-//     T t;
+//     T T(T t) {}
 //     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:71:5: Context: Previous use of 'T'.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:75:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:80:5: Context: Previous use of 'T'.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:83:32: Error: 'T' isn't a type.
-//     void T(/*@error=NotAType*/ T t) {}
-//                                ^
+// pkg/front_end/testcases/named_function_scope.dart:69:12: Error: 'T' isn't a type.
+//     void T(T t) {}
+//            ^
 //
 import self as self;
 import "dart:core" as core;
@@ -109,62 +109,62 @@
   }
   {
     self::V v;
-    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                                ^";
+    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
+    var V;
+        ^";
   }
   {
     self::V v;
-    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
-                                                ^" in null;
+    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
+    var V = null;
+        ^" in null;
   }
   {
-    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
-        T() {};
-        ^" in let final () → self::T T = () → self::T {} in T;
+    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+    var x = T T() {};
+              ^" in let final () → self::T T = () → self::T {} in T;
   }
   {
-    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
-    V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                              ^" as{TypeError} self::V;
+    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
+    V V;
+      ^" as{TypeError} self::V;
   }
   {
-    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
+    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+    var x = T<T>() {};
+            ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
     self::T t;
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T() {}
+      ^";
       function T() → self::T {}
     }
   }
   {
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T() {}
+      ^";
       function T() → self::T {}
     }
   }
   {
     self::T t;
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T(T t) {}
+      ^";
       function T(self::T t) → self::T {}
     }
   }
   {
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T(T t) {}
+      ^";
       function T(self::T t) → self::T {}
     }
   }
diff --git a/front_end/testcases/named_function_scope.dart.strong.transformed.expect b/front_end/testcases/named_function_scope.dart.strong.transformed.expect
index d898d98..ec10637 100644
--- a/front_end/testcases/named_function_scope.dart.strong.transformed.expect
+++ b/front_end/testcases/named_function_scope.dart.strong.transformed.expect
@@ -2,84 +2,84 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
-//     var x = /*@error=NamedFunctionExpression*/ T() {};
-//                                                ^
+// pkg/front_end/testcases/named_function_scope.dart:26:13: Error: A function expression can't have a name.
+//     var x = T() {};
+//             ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
-//     var /*@error=DuplicatedNamePreviouslyUsed*/ V;
-//                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:31:52: Context: Previous use of 'V'.
-//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
-//                                                    ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
-//     var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
-//                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:36:52: Context: Previous use of 'V'.
-//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
-//                                                    ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
-//         T() {};
+// pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
+//     var V;
 //         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
-//         T() {};
-//         ^
-// pkg/front_end/testcases/named_function_scope.dart:45:9: Context: Previous use of 'T'.
-//         T
-//         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
-//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:54:5: Context: Previous use of 'V'.
-//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+// pkg/front_end/testcases/named_function_scope.dart:29:5: Context: Previous use of 'V'.
+//     V v;
 //     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+// pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
+//     var V = null;
 //         ^
+// pkg/front_end/testcases/named_function_scope.dart:34:5: Context: Previous use of 'V'.
+//     V v;
+//     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//         ^
-// pkg/front_end/testcases/named_function_scope.dart:62:52: Context: Previous declaration of 'T'.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//                                                    ^
+// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: A function expression can't have a name.
+//     var x = T T() {};
+//               ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+//     var x = T T() {};
+//               ^
+// pkg/front_end/testcases/named_function_scope.dart:41:13: Context: Previous use of 'T'.
+//     var x = T T() {};
+//             ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
+//     V V;
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:47:5: Context: Previous use of 'V'.
+//     V V;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: A function expression can't have a name.
+//     var x = T<T>() {};
+//             ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+//     var x = T<T>() {};
+//             ^
+// pkg/front_end/testcases/named_function_scope.dart:52:15: Context: Previous declaration of 'T'.
+//     var x = T<T>() {};
+//               ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T() {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:55:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T() {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:59:5: Context: Previous use of 'T'.
+//     T T() {}
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T(T t) {}
+//       ^
+// pkg/front_end/testcases/named_function_scope.dart:62:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T(T t) {}
+//       ^
 // pkg/front_end/testcases/named_function_scope.dart:66:5: Context: Previous use of 'T'.
-//     T t;
+//     T T(T t) {}
 //     ^
 //
-// pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:71:5: Context: Previous use of 'T'.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:75:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:80:5: Context: Previous use of 'T'.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:83:32: Error: 'T' isn't a type.
-//     void T(/*@error=NotAType*/ T t) {}
-//                                ^
+// pkg/front_end/testcases/named_function_scope.dart:69:12: Error: 'T' isn't a type.
+//     void T(T t) {}
+//            ^
 //
 import self as self;
 import "dart:core" as core;
@@ -109,62 +109,62 @@
   }
   {
     self::V v;
-    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                                ^";
+    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
+    var V;
+        ^";
   }
   {
     self::V v;
-    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
-                                                ^" in null;
+    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
+    var V = null;
+        ^" in null;
   }
   {
-    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
-        T() {};
-        ^" in let final () → self::T T = () → self::T {} in T;
+    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+    var x = T T() {};
+              ^" in let final () → self::T T = () → self::T {} in T;
   }
   {
-    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
-    V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                              ^" as{TypeError} self::V;
+    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
+    V V;
+      ^" as{TypeError} self::V;
   }
   {
-    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
+    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+    var x = T<T>() {};
+            ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
   {
     self::T t;
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T() {}
+      ^";
       function T() → self::T {}
     }
   }
   {
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T() {}
+      ^";
       function T() → self::T {}
     }
   }
   {
     self::T t;
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T(T t) {}
+      ^";
       function T(self::T t) → self::T {}
     }
   }
   {
     {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T(T t) {}
+      ^";
       function T(self::T t) → self::T {}
     }
   }
diff --git a/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.expect b/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.expect
index 828a1c2..ed949f6 100644
--- a/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.expect
+++ b/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A<X extends core::Object = dynamic> extends core::Object {
-  field core::List<self::A::X> foo = null;
+  generic-covariant-impl field core::List<self::A::X> foo = null;
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.transformed.expect b/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.transformed.expect
index 828a1c2..ed949f6 100644
--- a/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.transformed.expect
+++ b/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A<X extends core::Object = dynamic> extends core::Object {
-  field core::List<self::A::X> foo = null;
+  generic-covariant-impl field core::List<self::A::X> foo = null;
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect b/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
index c6492de..9679fbf 100644
--- a/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
+++ b/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class A<X extends core::Object = dynamic> extends core::Object {
-  field core::List<self::A::X> foo;
+  generic-covariant-impl field core::List<self::A::X> foo;
   synthetic constructor •() → self::A<self::A::X>
     ;
 }
diff --git a/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect b/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect
index 214711b..3afff4b 100644
--- a/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect
+++ b/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/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect b/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect
index 214711b..3afff4b 100644
--- a/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect b/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
index 6270b7f..518a7f4 100644
--- a/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
+++ b/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/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect b/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
index 214711b..3afff4b 100644
--- a/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
+++ b/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/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect b/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
index 214711b..3afff4b 100644
--- a/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
+++ b/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/front_end/testcases/no_such_method_private_setter.dart.legacy.expect b/front_end/testcases/no_such_method_private_setter.dart.legacy.expect
index 52f88c4..a545e64 100644
--- a/front_end/testcases/no_such_method_private_setter.dart.legacy.expect
+++ b/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/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect b/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect
index 52f88c4..a545e64 100644
--- a/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/no_such_method_private_setter.dart.outline.expect b/front_end/testcases/no_such_method_private_setter.dart.outline.expect
index 78df3aa..099c2ab 100644
--- a/front_end/testcases/no_such_method_private_setter.dart.outline.expect
+++ b/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/front_end/testcases/no_such_method_private_setter.dart.strong.expect b/front_end/testcases/no_such_method_private_setter.dart.strong.expect
index 52f88c4..a545e64 100644
--- a/front_end/testcases/no_such_method_private_setter.dart.strong.expect
+++ b/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/front_end/testcases/no_such_method_private_setter.dart.strong.transformed.expect b/front_end/testcases/no_such_method_private_setter.dart.strong.transformed.expect
index 52f88c4..a545e64 100644
--- a/front_end/testcases/no_such_method_private_setter.dart.strong.transformed.expect
+++ b/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/front_end/testcases/operator_method_not_found.dart b/front_end/testcases/operator_method_not_found.dart
new file mode 100644
index 0000000..c54c358
--- /dev/null
+++ b/front_end/testcases/operator_method_not_found.dart
@@ -0,0 +1,55 @@
+// 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.
+
+class Foo {
+}
+
+main() {
+  Foo foo = new Foo();
+
+  // Not defined, but given right arity.
+  print(foo < 2);
+  print(foo > 2);
+  print(foo <= 2);
+  print(foo >= 2);
+  print(foo == 2);
+  print(foo - 2);
+  print(foo + 2);
+  print(foo / 2);
+  print(foo ~/ 2);
+  print(foo * 2);
+  print(foo % 2);
+  print(foo | 2);
+  print(foo ^ 2);
+  print(foo & 2);
+  print(foo << 2);
+  print(foo >> 2);
+  // print(foo >>> 2); // triple shift not enabled by default at the moment.
+  print(foo[2] = 2);
+  print(foo[2]);
+  print(~foo);
+  print(-foo);
+
+  // Not defined, and given wrong arity.
+  // Should be binary.
+  print(<foo);
+  print(>foo);
+  print(<=foo);
+  print(>=foo);
+  print(==foo);
+  print(+foo);
+  print(/foo);
+  print(~/foo);
+  print(*foo);
+  print(%foo);
+  print(|foo);
+  print(^foo);
+  print(&foo);
+  print(<<foo);
+  print(>>foo);
+  // print(>>>foo); // triple shift not enabled by default at the moment.
+
+  // Should be unary.
+  print(foo ~ 2);
+}
\ No newline at end of file
diff --git a/front_end/testcases/operator_method_not_found.dart.hierarchy.expect b/front_end/testcases/operator_method_not_found.dart.hierarchy.expect
new file mode 100644
index 0000000..6dc6110
--- /dev/null
+++ b/front_end/testcases/operator_method_not_found.dart.hierarchy.expect
@@ -0,0 +1,36 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Foo:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/front_end/testcases/operator_method_not_found.dart.legacy.expect b/front_end/testcases/operator_method_not_found.dart.legacy.expect
new file mode 100644
index 0000000..0abf9ef
--- /dev/null
+++ b/front_end/testcases/operator_method_not_found.dart.legacy.expect
@@ -0,0 +1,154 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: Expected '>' after this.
+//   print(<foo);
+//          ^^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:13: Error: Expected '[' before this.
+//   print(<foo);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Warning: 'foo' isn't a type.
+//   print(<foo);
+//          ^^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: Expected an identifier, but got '>'.
+//   print(>foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
+//   print(<=foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
+//   print(>=foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
+//   print(==foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//   print(+foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: Expected an identifier, but got '/'.
+//   print(/foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
+//   print(~/foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
+//   print(*foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
+//   print(%foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
+//   print(|foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
+//   print(^foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
+//   print(&foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
+//   print(<<foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
+//   print(>>foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+//   print(foo ~ 2);
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo foo = new self::Foo::•();
+  core::print(foo.<(2));
+  core::print(foo.>(2));
+  core::print(foo.<=(2));
+  core::print(foo.>=(2));
+  core::print(foo.==(2));
+  core::print(foo.-(2));
+  core::print(foo.+(2));
+  core::print(foo./(2));
+  core::print(foo.~/(2));
+  core::print(foo.*(2));
+  core::print(foo.%(2));
+  core::print(foo.|(2));
+  core::print(foo.^(2));
+  core::print(foo.&(2));
+  core::print(foo.<<(2));
+  core::print(foo.>>(2));
+  core::print(let final dynamic #t1 = foo in let final dynamic #t2 = 2 in let final dynamic #t3 = 2 in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3);
+  core::print(foo.[](2));
+  core::print(foo.~());
+  core::print(foo.unary-());
+  core::print(<invalid-type>[]);
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: This couldn't be parsed.
+  print(>foo);
+        ^".>(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: This couldn't be parsed.
+  print(<=foo);
+        ^".<=(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: This couldn't be parsed.
+  print(>=foo);
+        ^".>=(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: This couldn't be parsed.
+  print(==foo);
+        ^".==(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: This couldn't be parsed.
+  print(+foo);
+        ^".+(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: This couldn't be parsed.
+  print(/foo);
+        ^"./(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: This couldn't be parsed.
+  print(~/foo);
+        ^".~/(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: This couldn't be parsed.
+  print(*foo);
+        ^".*(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: This couldn't be parsed.
+  print(%foo);
+        ^".%(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: This couldn't be parsed.
+  print(|foo);
+        ^".|(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: This couldn't be parsed.
+  print(^foo);
+        ^".^(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: This couldn't be parsed.
+  print(&foo);
+        ^".&(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: This couldn't be parsed.
+  print(<<foo);
+        ^".<<(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: This couldn't be parsed.
+  print(>>foo);
+        ^".>>(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+  print(foo ~ 2);
+            ^");
+}
diff --git a/front_end/testcases/operator_method_not_found.dart.legacy.transformed.expect b/front_end/testcases/operator_method_not_found.dart.legacy.transformed.expect
new file mode 100644
index 0000000..0abf9ef
--- /dev/null
+++ b/front_end/testcases/operator_method_not_found.dart.legacy.transformed.expect
@@ -0,0 +1,154 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: Expected '>' after this.
+//   print(<foo);
+//          ^^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:13: Error: Expected '[' before this.
+//   print(<foo);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Warning: 'foo' isn't a type.
+//   print(<foo);
+//          ^^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: Expected an identifier, but got '>'.
+//   print(>foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
+//   print(<=foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
+//   print(>=foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
+//   print(==foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//   print(+foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: Expected an identifier, but got '/'.
+//   print(/foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
+//   print(~/foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
+//   print(*foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
+//   print(%foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
+//   print(|foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
+//   print(^foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
+//   print(&foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
+//   print(<<foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
+//   print(>>foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+//   print(foo ~ 2);
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo foo = new self::Foo::•();
+  core::print(foo.<(2));
+  core::print(foo.>(2));
+  core::print(foo.<=(2));
+  core::print(foo.>=(2));
+  core::print(foo.==(2));
+  core::print(foo.-(2));
+  core::print(foo.+(2));
+  core::print(foo./(2));
+  core::print(foo.~/(2));
+  core::print(foo.*(2));
+  core::print(foo.%(2));
+  core::print(foo.|(2));
+  core::print(foo.^(2));
+  core::print(foo.&(2));
+  core::print(foo.<<(2));
+  core::print(foo.>>(2));
+  core::print(let final dynamic #t1 = foo in let final dynamic #t2 = 2 in let final dynamic #t3 = 2 in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3);
+  core::print(foo.[](2));
+  core::print(foo.~());
+  core::print(foo.unary-());
+  core::print(<invalid-type>[]);
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: This couldn't be parsed.
+  print(>foo);
+        ^".>(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: This couldn't be parsed.
+  print(<=foo);
+        ^".<=(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: This couldn't be parsed.
+  print(>=foo);
+        ^".>=(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: This couldn't be parsed.
+  print(==foo);
+        ^".==(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: This couldn't be parsed.
+  print(+foo);
+        ^".+(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: This couldn't be parsed.
+  print(/foo);
+        ^"./(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: This couldn't be parsed.
+  print(~/foo);
+        ^".~/(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: This couldn't be parsed.
+  print(*foo);
+        ^".*(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: This couldn't be parsed.
+  print(%foo);
+        ^".%(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: This couldn't be parsed.
+  print(|foo);
+        ^".|(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: This couldn't be parsed.
+  print(^foo);
+        ^".^(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: This couldn't be parsed.
+  print(&foo);
+        ^".&(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: This couldn't be parsed.
+  print(<<foo);
+        ^".<<(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: This couldn't be parsed.
+  print(>>foo);
+        ^".>>(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+  print(foo ~ 2);
+            ^");
+}
diff --git a/front_end/testcases/operator_method_not_found.dart.outline.expect b/front_end/testcases/operator_method_not_found.dart.outline.expect
new file mode 100644
index 0000000..7835c54
--- /dev/null
+++ b/front_end/testcases/operator_method_not_found.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/front_end/testcases/operator_method_not_found.dart.strong.expect b/front_end/testcases/operator_method_not_found.dart.strong.expect
new file mode 100644
index 0000000..ec89d36
--- /dev/null
+++ b/front_end/testcases/operator_method_not_found.dart.strong.expect
@@ -0,0 +1,344 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: Expected '>' after this.
+//   print(<foo);
+//          ^^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:13: Error: Expected '[' before this.
+//   print(<foo);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: 'foo' isn't a type.
+//   print(<foo);
+//          ^^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: Expected an identifier, but got '>'.
+//   print(>foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
+//   print(<=foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
+//   print(>=foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
+//   print(==foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//   print(+foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: Expected an identifier, but got '/'.
+//   print(/foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
+//   print(~/foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
+//   print(*foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
+//   print(%foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
+//   print(|foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
+//   print(^foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
+//   print(&foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
+//   print(<<foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
+//   print(>>foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+//   print(foo ~ 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<'.
+//   print(foo < 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>'.
+//   print(foo > 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<='.
+//   print(foo <= 2);
+//             ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>='.
+//   print(foo >= 2);
+//             ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '-'.
+//   print(foo - 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//   print(foo + 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '/'.
+//   print(foo / 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+//   print(foo ~/ 2);
+//             ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '*'.
+//   print(foo * 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '%'.
+//   print(foo % 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '|'.
+//   print(foo | 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '^'.
+//   print(foo ^ 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '&'.
+//   print(foo & 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+//   print(foo << 2);
+//             ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+//   print(foo >> 2);
+//             ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+//   print(foo[2] = 2);
+//            ^^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+//   print(foo[2]);
+//            ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '~'.
+//   print(~foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+//   print(-foo);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo foo = new self::Foo::•();
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+  print(foo < 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>'.
+  print(foo > 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<='.
+  print(foo <= 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>='.
+  print(foo >= 2);
+            ^^");
+  core::print(foo.{core::Object::==}(2));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '-'.
+  print(foo - 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '+'.
+  print(foo + 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '/'.
+  print(foo / 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '~/'.
+  print(foo ~/ 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '*'.
+  print(foo * 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '%'.
+  print(foo % 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '|'.
+  print(foo | 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '^'.
+  print(foo ^ 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '&'.
+  print(foo & 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<<'.
+  print(foo << 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>>'.
+  print(foo >> 2);
+            ^^");
+  core::print(let final self::Foo #t1 = foo in let final core::int #t2 = 2 in let final core::int #t3 = 2 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '[]='.
+  print(foo[2] = 2);
+           ^^^" in #t3);
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '[]'.
+  print(foo[2]);
+           ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '~'.
+  print(~foo);
+        ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+  print(-foo);
+        ^");
+  core::print(<invalid-type>[]);
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: This couldn't be parsed.
+  print(>foo);
+        ^".>(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: This couldn't be parsed.
+  print(<=foo);
+        ^".<=(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: This couldn't be parsed.
+  print(>=foo);
+        ^".>=(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: This couldn't be parsed.
+  print(==foo);
+        ^".{core::Object::==}(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: This couldn't be parsed.
+  print(+foo);
+        ^".+(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: This couldn't be parsed.
+  print(/foo);
+        ^"./(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: This couldn't be parsed.
+  print(~/foo);
+        ^".~/(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: This couldn't be parsed.
+  print(*foo);
+        ^".*(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: This couldn't be parsed.
+  print(%foo);
+        ^".%(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: This couldn't be parsed.
+  print(|foo);
+        ^".|(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: This couldn't be parsed.
+  print(^foo);
+        ^".^(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: This couldn't be parsed.
+  print(&foo);
+        ^".&(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: This couldn't be parsed.
+  print(<<foo);
+        ^".<<(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: This couldn't be parsed.
+  print(>>foo);
+        ^".>>(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+  print(foo ~ 2);
+            ^");
+}
diff --git a/front_end/testcases/operator_method_not_found.dart.strong.transformed.expect b/front_end/testcases/operator_method_not_found.dart.strong.transformed.expect
new file mode 100644
index 0000000..ec89d36
--- /dev/null
+++ b/front_end/testcases/operator_method_not_found.dart.strong.transformed.expect
@@ -0,0 +1,344 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: Expected '>' after this.
+//   print(<foo);
+//          ^^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:13: Error: Expected '[' before this.
+//   print(<foo);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: 'foo' isn't a type.
+//   print(<foo);
+//          ^^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: Expected an identifier, but got '>'.
+//   print(>foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
+//   print(<=foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
+//   print(>=foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
+//   print(==foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//   print(+foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: Expected an identifier, but got '/'.
+//   print(/foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
+//   print(~/foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
+//   print(*foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
+//   print(%foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
+//   print(|foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
+//   print(^foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
+//   print(&foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
+//   print(<<foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
+//   print(>>foo);
+//         ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+//   print(foo ~ 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<'.
+//   print(foo < 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>'.
+//   print(foo > 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<='.
+//   print(foo <= 2);
+//             ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>='.
+//   print(foo >= 2);
+//             ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '-'.
+//   print(foo - 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//   print(foo + 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '/'.
+//   print(foo / 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+//   print(foo ~/ 2);
+//             ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '*'.
+//   print(foo * 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '%'.
+//   print(foo % 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '|'.
+//   print(foo | 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '^'.
+//   print(foo ^ 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '&'.
+//   print(foo & 2);
+//             ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+//   print(foo << 2);
+//             ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+//   print(foo >> 2);
+//             ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+//   print(foo[2] = 2);
+//            ^^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+//   print(foo[2]);
+//            ^^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '~'.
+//   print(~foo);
+//         ^
+//
+// pkg/front_end/testcases/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+//   print(-foo);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo foo = new self::Foo::•();
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+  print(foo < 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>'.
+  print(foo > 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<='.
+  print(foo <= 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>='.
+  print(foo >= 2);
+            ^^");
+  core::print(foo.{core::Object::==}(2));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '-'.
+  print(foo - 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '+'.
+  print(foo + 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '/'.
+  print(foo / 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '~/'.
+  print(foo ~/ 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '*'.
+  print(foo * 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '%'.
+  print(foo % 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '|'.
+  print(foo | 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '^'.
+  print(foo ^ 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '&'.
+  print(foo & 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<<'.
+  print(foo << 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>>'.
+  print(foo >> 2);
+            ^^");
+  core::print(let final self::Foo #t1 = foo in let final core::int #t2 = 2 in let final core::int #t3 = 2 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '[]='.
+  print(foo[2] = 2);
+           ^^^" in #t3);
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '[]'.
+  print(foo[2]);
+           ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '~'.
+  print(~foo);
+        ^");
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+  print(-foo);
+        ^");
+  core::print(<invalid-type>[]);
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: This couldn't be parsed.
+  print(>foo);
+        ^".>(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: This couldn't be parsed.
+  print(<=foo);
+        ^".<=(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: This couldn't be parsed.
+  print(>=foo);
+        ^".>=(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: This couldn't be parsed.
+  print(==foo);
+        ^".{core::Object::==}(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: This couldn't be parsed.
+  print(+foo);
+        ^".+(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: This couldn't be parsed.
+  print(/foo);
+        ^"./(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: This couldn't be parsed.
+  print(~/foo);
+        ^".~/(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: This couldn't be parsed.
+  print(*foo);
+        ^".*(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: This couldn't be parsed.
+  print(%foo);
+        ^".%(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: This couldn't be parsed.
+  print(|foo);
+        ^".|(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: This couldn't be parsed.
+  print(^foo);
+        ^".^(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: This couldn't be parsed.
+  print(&foo);
+        ^".&(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: This couldn't be parsed.
+  print(<<foo);
+        ^".<<(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: This couldn't be parsed.
+  print(>>foo);
+        ^".>>(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+  print(foo ~ 2);
+            ^");
+}
diff --git a/front_end/testcases/override_check_accessor_after_inference.dart b/front_end/testcases/override_check_accessor_after_inference.dart
index 94bf861..7d43fe9 100644
--- a/front_end/testcases/override_check_accessor_after_inference.dart
+++ b/front_end/testcases/override_check_accessor_after_inference.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class A {}
 
 class B extends A {}
@@ -24,8 +22,8 @@
 }
 
 class F extends D {
-  void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
-  A get /*@error=OverrideTypeMismatchReturnType*/ y => null;
+  void set x(B value) {}
+  A get y => null;
 }
 
 main() {}
diff --git a/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect b/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
index 1f70d42..b932a13 100644
--- a/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
+++ b/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/override_check_accessor_after_inference.dart:28:51: Error: The return type of the method 'F.y' is 'A', which does not match the return type, 'B', of the overridden method, 'D.y'.
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:26:9: Error: The return type of the method 'F.y' is 'A', which does not match the return type, 'B', of the overridden method, 'D.y'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
 // Change to a subtype of 'B'.
-//   A get /*@error=OverrideTypeMismatchReturnType*/ y => null;
-//                                                   ^
-// pkg/front_end/testcases/override_check_accessor_after_inference.dart:18:7: Context: This is the overridden method ('y').
+//   A get y => null;
+//         ^
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:16:7: Context: This is the overridden method ('y').
 //   get y => null; // Inferred type: B
 //       ^
 //
-// pkg/front_end/testcases/override_check_accessor_after_inference.dart:27:57: Error: The parameter 'value' of the method 'F.x' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'D.x'.
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:25:16: Error: The parameter 'value' of the method 'F.x' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'D.x'.
 //  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
 // Change to a supertype of 'A', or, for a covariant parameter, a subtype.
-//   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
-//                                                         ^
-// pkg/front_end/testcases/override_check_accessor_after_inference.dart:17:12: Context: This is the overridden method ('x').
+//   void set x(B value) {}
+//                ^
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:15:12: Context: This is the overridden method ('x').
 //   void set x(value) {} // Inferred type: A
 //            ^
 //
diff --git a/front_end/testcases/override_check_accessor_basic.dart b/front_end/testcases/override_check_accessor_basic.dart
index a5391b2..a61e5c5 100644
--- a/front_end/testcases/override_check_accessor_basic.dart
+++ b/front_end/testcases/override_check_accessor_basic.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class A {}
 
 class B extends A {}
@@ -19,8 +17,8 @@
 }
 
 class E extends C {
-  void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
-  Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;
+  void set x(B value) {}
+  Object get y => null;
 }
 
 main() {}
diff --git a/front_end/testcases/override_check_accessor_basic.dart.strong.expect b/front_end/testcases/override_check_accessor_basic.dart.strong.expect
index 3407e98..5fc117f 100644
--- a/front_end/testcases/override_check_accessor_basic.dart.strong.expect
+++ b/front_end/testcases/override_check_accessor_basic.dart.strong.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E.y' is 'Object', which does not match the return type, 'A', of the overridden method, 'C.y'.
+// pkg/front_end/testcases/override_check_accessor_basic.dart:21:14: Error: The return type of the method 'E.y' is 'Object', which does not match the return type, 'A', of the overridden method, 'C.y'.
 //  - 'Object' is from 'dart:core'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
 // Change to a subtype of 'A'.
-//   Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;
-//                                                        ^
-// pkg/front_end/testcases/override_check_accessor_basic.dart:13:9: Context: This is the overridden method ('y').
+//   Object get y => null;
+//              ^
+// pkg/front_end/testcases/override_check_accessor_basic.dart:11:9: Context: This is the overridden method ('y').
 //   A get y => null;
 //         ^
 //
-// pkg/front_end/testcases/override_check_accessor_basic.dart:22:57: Error: The parameter 'value' of the method 'E.x' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.x'.
+// pkg/front_end/testcases/override_check_accessor_basic.dart:20:16: Error: The parameter 'value' of the method 'E.x' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.x'.
 //  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
 // Change to a supertype of 'A', or, for a covariant parameter, a subtype.
-//   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
-//                                                         ^
-// pkg/front_end/testcases/override_check_accessor_basic.dart:12:12: Context: This is the overridden method ('x').
+//   void set x(B value) {}
+//                ^
+// pkg/front_end/testcases/override_check_accessor_basic.dart:10:12: Context: This is the overridden method ('x').
 //   void set x(A value) {}
 //            ^
 //
diff --git a/front_end/testcases/override_check_accessor_with_covariant_modifier.dart b/front_end/testcases/override_check_accessor_with_covariant_modifier.dart
index a679cb1..69ca3c0 100644
--- a/front_end/testcases/override_check_accessor_with_covariant_modifier.dart
+++ b/front_end/testcases/override_check_accessor_with_covariant_modifier.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class A {}
 
 class B extends A {}
@@ -21,10 +19,8 @@
   void set x1(B value) {} // Ok because covariant is inherited
   void set x2(covariant B value) {} // Ok because covariant
   void set x3(covariant B value) {} // Ok because covariant
-  void set x4(
-      B /*@error=OverrideTypeMismatchParameter*/ value) {} // Not covariant
-  void set x5(
-      covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}
+  void set x4(B value) {} // Not covariant
+  void set x5(covariant String value) {}
   void set x6(covariant A value) {} // Always ok
 }
 
diff --git a/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect b/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
index 2b08b5a..765bd58 100644
--- a/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
+++ b/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
@@ -2,22 +2,22 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D.x4' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.x4'.
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:22:17: Error: The parameter 'value' of the method 'D.x4' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.x4'.
 //  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart'.
 // Change to a supertype of 'A', or, for a covariant parameter, a subtype.
-//       B /*@error=OverrideTypeMismatchParameter*/ value) {} // Not covariant
-//                                                  ^
-// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:15:12: Context: This is the overridden method ('x4').
+//   void set x4(B value) {} // Not covariant
+//                 ^
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:13:12: Context: This is the overridden method ('x4').
 //   void set x4(A value) {}
 //            ^
 //
-// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:27:65: Error: The parameter 'value' of the method 'D.x5' has type 'String', which does not match the corresponding type, 'A', in the overridden method, 'C.x5'.
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:23:32: Error: The parameter 'value' of the method 'D.x5' has type 'String', which does not match the corresponding type, 'A', in the overridden method, 'C.x5'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart'.
 // Change to a supertype of 'A', or, for a covariant parameter, a subtype.
-//       covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}
-//                                                                 ^
-// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:16:12: Context: This is the overridden method ('x5').
+//   void set x5(covariant String value) {}
+//                                ^
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:14:12: Context: This is the overridden method ('x5').
 //   void set x5(covariant A value) {}
 //            ^
 //
diff --git a/front_end/testcases/override_check_after_inference.dart b/front_end/testcases/override_check_after_inference.dart
index 9777a7e..e818940 100644
--- a/front_end/testcases/override_check_after_inference.dart
+++ b/front_end/testcases/override_check_after_inference.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class A {}
 
 class B extends A {}
@@ -21,7 +19,7 @@
 }
 
 class F extends D {
-  void f(B /*@error=OverrideTypeMismatchParameter*/ x) {}
+  void f(B x) {}
 }
 
 main() {}
diff --git a/front_end/testcases/override_check_after_inference.dart.strong.expect b/front_end/testcases/override_check_after_inference.dart.strong.expect
index 0cfd406..c6fbf23 100644
--- a/front_end/testcases/override_check_after_inference.dart.strong.expect
+++ b/front_end/testcases/override_check_after_inference.dart.strong.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/override_check_after_inference.dart:24:53: Error: The parameter 'x' of the method 'F.f' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'D.f'.
+// pkg/front_end/testcases/override_check_after_inference.dart:22:12: Error: The parameter 'x' of the method 'F.f' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'D.f'.
 //  - 'B' is from 'pkg/front_end/testcases/override_check_after_inference.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_after_inference.dart'.
 // Change to a supertype of 'A', or, for a covariant parameter, a subtype.
-//   void f(B /*@error=OverrideTypeMismatchParameter*/ x) {}
-//                                                     ^
-// pkg/front_end/testcases/override_check_after_inference.dart:16:8: Context: This is the overridden method ('f').
+//   void f(B x) {}
+//            ^
+// pkg/front_end/testcases/override_check_after_inference.dart:14:8: Context: This is the overridden method ('f').
 //   void f(x) {} // Inferred type: (A) -> void
 //        ^
 //
diff --git a/front_end/testcases/override_check_basic.dart b/front_end/testcases/override_check_basic.dart
index 70134a6..69c1593 100644
--- a/front_end/testcases/override_check_basic.dart
+++ b/front_end/testcases/override_check_basic.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class A {}
 
 class B extends A {}
@@ -23,10 +21,10 @@
 }
 
 class E extends C {
-  void f1(B /*@error=OverrideTypeMismatchParameter*/ x) {}
-  void f2([B /*@error=OverrideTypeMismatchParameter*/ x]) {}
-  void f3({B /*@error=OverrideTypeMismatchParameter*/ x}) {}
-  Object /*@error=OverrideTypeMismatchReturnType*/ f4() {}
+  void f1(B x) {}
+  void f2([B x]) {}
+  void f3({B x}) {}
+  Object f4() {}
 }
 
 main() {}
diff --git a/front_end/testcases/override_check_basic.dart.strong.expect b/front_end/testcases/override_check_basic.dart.strong.expect
index b7a5ddb..e767515 100644
--- a/front_end/testcases/override_check_basic.dart.strong.expect
+++ b/front_end/testcases/override_check_basic.dart.strong.expect
@@ -2,43 +2,43 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/override_check_basic.dart:29:52: Error: The return type of the method 'E.f4' is 'Object', which does not match the return type, 'A', of the overridden method, 'C.f4'.
+// pkg/front_end/testcases/override_check_basic.dart:27:10: Error: The return type of the method 'E.f4' is 'Object', which does not match the return type, 'A', of the overridden method, 'C.f4'.
 //  - 'Object' is from 'dart:core'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
 // Change to a subtype of 'A'.
-//   Object /*@error=OverrideTypeMismatchReturnType*/ f4() {}
-//                                                    ^
-// pkg/front_end/testcases/override_check_basic.dart:15:5: Context: This is the overridden method ('f4').
+//   Object f4() {}
+//          ^
+// pkg/front_end/testcases/override_check_basic.dart:13:5: Context: This is the overridden method ('f4').
 //   A f4() {}
 //     ^
 //
-// pkg/front_end/testcases/override_check_basic.dart:28:55: Error: The parameter 'x' of the method 'E.f3' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f3'.
+// pkg/front_end/testcases/override_check_basic.dart:26:14: Error: The parameter 'x' of the method 'E.f3' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f3'.
 //  - 'B' is from 'pkg/front_end/testcases/override_check_basic.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
 // Change to a supertype of 'A', or, for a covariant parameter, a subtype.
-//   void f3({B /*@error=OverrideTypeMismatchParameter*/ x}) {}
-//                                                       ^
-// pkg/front_end/testcases/override_check_basic.dart:14:8: Context: This is the overridden method ('f3').
+//   void f3({B x}) {}
+//              ^
+// pkg/front_end/testcases/override_check_basic.dart:12:8: Context: This is the overridden method ('f3').
 //   void f3({A x}) {}
 //        ^
 //
-// pkg/front_end/testcases/override_check_basic.dart:26:54: Error: The parameter 'x' of the method 'E.f1' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f1'.
+// pkg/front_end/testcases/override_check_basic.dart:24:13: Error: The parameter 'x' of the method 'E.f1' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f1'.
 //  - 'B' is from 'pkg/front_end/testcases/override_check_basic.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
 // Change to a supertype of 'A', or, for a covariant parameter, a subtype.
-//   void f1(B /*@error=OverrideTypeMismatchParameter*/ x) {}
-//                                                      ^
-// pkg/front_end/testcases/override_check_basic.dart:12:8: Context: This is the overridden method ('f1').
+//   void f1(B x) {}
+//             ^
+// pkg/front_end/testcases/override_check_basic.dart:10:8: Context: This is the overridden method ('f1').
 //   void f1(A x) {}
 //        ^
 //
-// pkg/front_end/testcases/override_check_basic.dart:27:55: Error: The parameter 'x' of the method 'E.f2' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f2'.
+// pkg/front_end/testcases/override_check_basic.dart:25:14: Error: The parameter 'x' of the method 'E.f2' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f2'.
 //  - 'B' is from 'pkg/front_end/testcases/override_check_basic.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
 // Change to a supertype of 'A', or, for a covariant parameter, a subtype.
-//   void f2([B /*@error=OverrideTypeMismatchParameter*/ x]) {}
-//                                                       ^
-// pkg/front_end/testcases/override_check_basic.dart:13:8: Context: This is the overridden method ('f2').
+//   void f2([B x]) {}
+//              ^
+// pkg/front_end/testcases/override_check_basic.dart:11:8: Context: This is the overridden method ('f2').
 //   void f2([A x]) {}
 //        ^
 //
diff --git a/front_end/testcases/override_check_two_substitutions.dart b/front_end/testcases/override_check_two_substitutions.dart
index 98ab523..5f5ea0f 100644
--- a/front_end/testcases/override_check_two_substitutions.dart
+++ b/front_end/testcases/override_check_two_substitutions.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class A<T> {
   void f<U>(Map<T, U> m) {}
 }
diff --git a/front_end/testcases/override_check_two_substitutions.dart.legacy.expect b/front_end/testcases/override_check_two_substitutions.dart.legacy.expect
index dfd8d78..dd0c4d5 100644
--- a/front_end/testcases/override_check_two_substitutions.dart.legacy.expect
+++ b/front_end/testcases/override_check_two_substitutions.dart.legacy.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
-  method f<U extends core::Object = dynamic>(core::Map<self::A::T, self::A::f::U> m) → void {}
+  method f<U extends core::Object = dynamic>(generic-covariant-impl core::Map<self::A::T, self::A::f::U> m) → void {}
 }
 class B extends self::A<core::String> {
   synthetic constructor •() → self::B
diff --git a/front_end/testcases/override_check_two_substitutions.dart.legacy.transformed.expect b/front_end/testcases/override_check_two_substitutions.dart.legacy.transformed.expect
index dfd8d78..dd0c4d5 100644
--- a/front_end/testcases/override_check_two_substitutions.dart.legacy.transformed.expect
+++ b/front_end/testcases/override_check_two_substitutions.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
-  method f<U extends core::Object = dynamic>(core::Map<self::A::T, self::A::f::U> m) → void {}
+  method f<U extends core::Object = dynamic>(generic-covariant-impl core::Map<self::A::T, self::A::f::U> m) → void {}
 }
 class B extends self::A<core::String> {
   synthetic constructor •() → self::B
diff --git a/front_end/testcases/override_check_two_substitutions.dart.outline.expect b/front_end/testcases/override_check_two_substitutions.dart.outline.expect
index 2f0107f..e836ac4 100644
--- a/front_end/testcases/override_check_two_substitutions.dart.outline.expect
+++ b/front_end/testcases/override_check_two_substitutions.dart.outline.expect
@@ -5,7 +5,7 @@
 class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::T>
     ;
-  method f<U extends core::Object = dynamic>(core::Map<self::A::T, self::A::f::U> m) → void
+  method f<U extends core::Object = dynamic>(generic-covariant-impl core::Map<self::A::T, self::A::f::U> m) → void
     ;
 }
 class B extends self::A<core::String> {
diff --git a/front_end/testcases/override_check_with_covariant_modifier.dart b/front_end/testcases/override_check_with_covariant_modifier.dart
index 715a685..09df2e3 100644
--- a/front_end/testcases/override_check_with_covariant_modifier.dart
+++ b/front_end/testcases/override_check_with_covariant_modifier.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class A {}
 
 class B extends A {}
@@ -21,8 +19,8 @@
   void f1(B x) {} // Ok because covariant is inherited
   void f2(covariant B x) {} // Ok because covariant
   void f3(covariant B x) {} // Ok because covariant
-  void f4(B /*@error=OverrideTypeMismatchParameter*/ x) {} // Not covariant
-  void f5(covariant String /*@error=OverrideTypeMismatchParameter*/ x) {}
+  void f4(B x) {} // Not covariant
+  void f5(covariant String x) {}
   void f6(covariant A x) {} // Always ok
 }
 
diff --git a/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect b/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
index d008fb9..25f16c4 100644
--- a/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
+++ b/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
@@ -2,22 +2,22 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:25:69: Error: The parameter 'x' of the method 'D.f5' has type 'String', which does not match the corresponding type, 'A', in the overridden method, 'C.f5'.
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:23:28: Error: The parameter 'x' of the method 'D.f5' has type 'String', which does not match the corresponding type, 'A', in the overridden method, 'C.f5'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_with_covariant_modifier.dart'.
 // Change to a supertype of 'A', or, for a covariant parameter, a subtype.
-//   void f5(covariant String /*@error=OverrideTypeMismatchParameter*/ x) {}
-//                                                                     ^
-// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:16:8: Context: This is the overridden method ('f5').
+//   void f5(covariant String x) {}
+//                            ^
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:14:8: Context: This is the overridden method ('f5').
 //   void f5(covariant A x) {}
 //        ^
 //
-// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:24:54: Error: The parameter 'x' of the method 'D.f4' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f4'.
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:22:13: Error: The parameter 'x' of the method 'D.f4' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f4'.
 //  - 'B' is from 'pkg/front_end/testcases/override_check_with_covariant_modifier.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/override_check_with_covariant_modifier.dart'.
 // Change to a supertype of 'A', or, for a covariant parameter, a subtype.
-//   void f4(B /*@error=OverrideTypeMismatchParameter*/ x) {} // Not covariant
-//                                                      ^
-// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:15:8: Context: This is the overridden method ('f4').
+//   void f4(B x) {} // Not covariant
+//             ^
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:13:8: Context: This is the overridden method ('f4').
 //   void f4(A x) {}
 //        ^
 //
diff --git a/front_end/testcases/part_not_part_of.dart.legacy.expect b/front_end/testcases/part_not_part_of.dart.legacy.expect
index a057f8b..b9dac32 100644
--- a/front_end/testcases/part_not_part_of.dart.legacy.expect
+++ b/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/front_end/testcases/part_not_part_of.dart.legacy.transformed.expect b/front_end/testcases/part_not_part_of.dart.legacy.transformed.expect
index a057f8b..b9dac32 100644
--- a/front_end/testcases/part_not_part_of.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/part_not_part_of.dart.strong.expect b/front_end/testcases/part_not_part_of.dart.strong.expect
index a057f8b..b9dac32 100644
--- a/front_end/testcases/part_not_part_of.dart.strong.expect
+++ b/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/front_end/testcases/part_not_part_of.dart.strong.transformed.expect b/front_end/testcases/part_not_part_of.dart.strong.transformed.expect
index a057f8b..b9dac32 100644
--- a/front_end/testcases/part_not_part_of.dart.strong.transformed.expect
+++ b/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/front_end/testcases/private_method_tearoff.dart.legacy.expect b/front_end/testcases/private_method_tearoff.dart.legacy.expect
index 2355e10..3e521af 100644
--- a/front_end/testcases/private_method_tearoff.dart.legacy.expect
+++ b/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/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect b/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect
index 2355e10..3e521af 100644
--- a/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/private_method_tearoff.dart.outline.expect b/front_end/testcases/private_method_tearoff.dart.outline.expect
index d1c7b20..dc1a5ae 100644
--- a/front_end/testcases/private_method_tearoff.dart.outline.expect
+++ b/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/front_end/testcases/private_method_tearoff.dart.strong.expect b/front_end/testcases/private_method_tearoff.dart.strong.expect
index cb76ba8..1422ece 100644
--- a/front_end/testcases/private_method_tearoff.dart.strong.expect
+++ b/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/front_end/testcases/private_method_tearoff.dart.strong.transformed.expect b/front_end/testcases/private_method_tearoff.dart.strong.transformed.expect
index cb76ba8..1422ece 100644
--- a/front_end/testcases/private_method_tearoff.dart.strong.transformed.expect
+++ b/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/front_end/testcases/public_method_tearoff.dart.legacy.expect b/front_end/testcases/public_method_tearoff.dart.legacy.expect
index f4aa6fe..4e942b2 100644
--- a/front_end/testcases/public_method_tearoff.dart.legacy.expect
+++ b/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/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect b/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect
index f4aa6fe..4e942b2 100644
--- a/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/public_method_tearoff.dart.outline.expect b/front_end/testcases/public_method_tearoff.dart.outline.expect
index 2df3cac..7648db6 100644
--- a/front_end/testcases/public_method_tearoff.dart.outline.expect
+++ b/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/front_end/testcases/public_method_tearoff.dart.strong.expect b/front_end/testcases/public_method_tearoff.dart.strong.expect
index a7c45ab..32ce75e 100644
--- a/front_end/testcases/public_method_tearoff.dart.strong.expect
+++ b/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/front_end/testcases/public_method_tearoff.dart.strong.transformed.expect b/front_end/testcases/public_method_tearoff.dart.strong.transformed.expect
index a7c45ab..32ce75e 100644
--- a/front_end/testcases/public_method_tearoff.dart.strong.transformed.expect
+++ b/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/front_end/testcases/qualified.dart.legacy.expect b/front_end/testcases/qualified.dart.legacy.expect
index 9abbf6a..bd70509 100644
--- a/front_end/testcases/qualified.dart.legacy.expect
+++ b/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/front_end/testcases/qualified.dart.legacy.transformed.expect b/front_end/testcases/qualified.dart.legacy.transformed.expect
index 6f18b56..df06d18 100644
--- a/front_end/testcases/qualified.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/qualified.dart.outline.expect b/front_end/testcases/qualified.dart.outline.expect
index a8b09cd..0fca5f9 100644
--- a/front_end/testcases/qualified.dart.outline.expect
+++ b/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/front_end/testcases/qualified.dart.strong.expect b/front_end/testcases/qualified.dart.strong.expect
index 2844fc6..9bc943f 100644
--- a/front_end/testcases/qualified.dart.strong.expect
+++ b/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/front_end/testcases/qualified.dart.strong.transformed.expect b/front_end/testcases/qualified.dart.strong.transformed.expect
index 807fc74..197c0d8 100644
--- a/front_end/testcases/qualified.dart.strong.transformed.expect
+++ b/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/front_end/testcases/rasta/bad_default_constructor.dart.strong.expect b/front_end/testcases/rasta/bad_default_constructor.dart.strong.expect
new file mode 100644
index 0000000..8ea402c
--- /dev/null
+++ b/front_end/testcases/rasta/bad_default_constructor.dart.strong.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_default_constructor.dart:13:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/rasta/bad_default_constructor.dart:9:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  invalid-expression "pkg/front_end/testcases/rasta/bad_default_constructor.dart:13:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const B();
+        ^";
+}
diff --git a/front_end/testcases/rasta/bad_default_constructor.dart.strong.transformed.expect b/front_end/testcases/rasta/bad_default_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..8ea402c
--- /dev/null
+++ b/front_end/testcases/rasta/bad_default_constructor.dart.strong.transformed.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_default_constructor.dart:13:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/rasta/bad_default_constructor.dart:9:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  invalid-expression "pkg/front_end/testcases/rasta/bad_default_constructor.dart:13:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const B();
+        ^";
+}
diff --git a/front_end/testcases/rasta/export.dart.legacy.expect b/front_end/testcases/rasta/export.dart.legacy.expect
index 467d2a4..b0410f4 100644
--- a/front_end/testcases/rasta/export.dart.legacy.expect
+++ b/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/front_end/testcases/rasta/export.dart.legacy.transformed.expect b/front_end/testcases/rasta/export.dart.legacy.transformed.expect
index 467d2a4..b0410f4 100644
--- a/front_end/testcases/rasta/export.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/rasta/export.dart.outline.expect b/front_end/testcases/rasta/export.dart.outline.expect
index 7c8cd4d..2314e9e 100644
--- a/front_end/testcases/rasta/export.dart.outline.expect
+++ b/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/front_end/testcases/rasta/export.dart.strong.expect b/front_end/testcases/rasta/export.dart.strong.expect
index 467d2a4..b0410f4 100644
--- a/front_end/testcases/rasta/export.dart.strong.expect
+++ b/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/front_end/testcases/rasta/export.dart.strong.transformed.expect b/front_end/testcases/rasta/export.dart.strong.transformed.expect
index 467d2a4..b0410f4 100644
--- a/front_end/testcases/rasta/export.dart.strong.transformed.expect
+++ b/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/front_end/testcases/rasta/import_export.dart.legacy.expect b/front_end/testcases/rasta/import_export.dart.legacy.expect
index 33c77ad..e4794e6 100644
--- a/front_end/testcases/rasta/import_export.dart.legacy.expect
+++ b/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/front_end/testcases/rasta/import_export.dart.legacy.transformed.expect b/front_end/testcases/rasta/import_export.dart.legacy.transformed.expect
index 33c77ad..e4794e6 100644
--- a/front_end/testcases/rasta/import_export.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/rasta/import_export.dart.outline.expect b/front_end/testcases/rasta/import_export.dart.outline.expect
index d1a411b..42bbbc3 100644
--- a/front_end/testcases/rasta/import_export.dart.outline.expect
+++ b/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/front_end/testcases/rasta/import_export.dart.strong.expect b/front_end/testcases/rasta/import_export.dart.strong.expect
index 33c77ad..e4794e6 100644
--- a/front_end/testcases/rasta/import_export.dart.strong.expect
+++ b/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/front_end/testcases/rasta/import_export.dart.strong.transformed.expect b/front_end/testcases/rasta/import_export.dart.strong.transformed.expect
index 33c77ad..e4794e6 100644
--- a/front_end/testcases/rasta/import_export.dart.strong.transformed.expect
+++ b/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/front_end/testcases/rasta/issue_000039.dart.strong.expect b/front_end/testcases/rasta/issue_000039.dart.strong.expect
new file mode 100644
index 0000000..564c718
--- /dev/null
+++ b/front_end/testcases/rasta/issue_000039.dart.strong.expect
@@ -0,0 +1,37 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:10:3: Error: Expected an identifier, but got '}'.
+//   }
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:10:3: Error: Expected an identifier, but got ''.
+//   }
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:10:3: Error: Expected ';' after this.
+//   }
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:13:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic a = null;
+  constructor •(dynamic x) → self::A
+    : super core::Object::•() {
+    this.{self::A::a} = invalid-expression "pkg/front_end/testcases/rasta/issue_000039.dart:10:3: Error: Expected an identifier, but got ''.
+  }
+  ^";
+  }
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
diff --git a/front_end/testcases/rasta/issue_000039.dart.strong.transformed.expect b/front_end/testcases/rasta/issue_000039.dart.strong.transformed.expect
new file mode 100644
index 0000000..564c718
--- /dev/null
+++ b/front_end/testcases/rasta/issue_000039.dart.strong.transformed.expect
@@ -0,0 +1,37 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:10:3: Error: Expected an identifier, but got '}'.
+//   }
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:10:3: Error: Expected an identifier, but got ''.
+//   }
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:10:3: Error: Expected ';' after this.
+//   }
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:13:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic a = null;
+  constructor •(dynamic x) → self::A
+    : super core::Object::•() {
+    this.{self::A::a} = invalid-expression "pkg/front_end/testcases/rasta/issue_000039.dart:10:3: Error: Expected an identifier, but got ''.
+  }
+  ^";
+  }
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
diff --git a/front_end/testcases/rasta/issue_000042.dart.strong.expect b/front_end/testcases/rasta/issue_000042.dart.strong.expect
index 356e6a0..da8f0c6 100644
--- a/front_end/testcases/rasta/issue_000042.dart.strong.expect
+++ b/front_end/testcases/rasta/issue_000042.dart.strong.expect
@@ -34,7 +34,6 @@
        ^^^";
       dynamic x;
       dynamic y;
-      {}
     }
   }
   #L1:
diff --git a/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect b/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
index 356e6a0..da8f0c6 100644
--- a/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
+++ b/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
@@ -34,7 +34,6 @@
        ^^^";
       dynamic x;
       dynamic y;
-      {}
     }
   }
   #L1:
diff --git a/front_end/testcases/rasta/issue_000070.dart.legacy.expect b/front_end/testcases/rasta/issue_000070.dart.legacy.expect
index cb5054f..1deecbc 100644
--- a/front_end/testcases/rasta/issue_000070.dart.legacy.expect
+++ b/front_end/testcases/rasta/issue_000070.dart.legacy.expect
@@ -24,7 +24,7 @@
   get getter() → core::List<self::A::U> {
     return this.{self::A::field};
   }
-  set setter(self::A::S s) → void {}
+  set setter(generic-covariant-impl self::A::S s) → void {}
 }
 abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::J<self::J::Aa, self::J::B>
diff --git a/front_end/testcases/rasta/issue_000070.dart.legacy.transformed.expect b/front_end/testcases/rasta/issue_000070.dart.legacy.transformed.expect
index 24788b5..6f8f772 100644
--- a/front_end/testcases/rasta/issue_000070.dart.legacy.transformed.expect
+++ b/front_end/testcases/rasta/issue_000070.dart.legacy.transformed.expect
@@ -24,7 +24,7 @@
   get getter() → core::List<self::A::U> {
     return this.{self::A::field};
   }
-  set setter(self::A::S s) → void {}
+  set setter(generic-covariant-impl self::A::S s) → void {}
 }
 abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::J<self::J::Aa, self::J::B>
diff --git a/front_end/testcases/rasta/issue_000070.dart.outline.expect b/front_end/testcases/rasta/issue_000070.dart.outline.expect
index 3f08fac..89051be 100644
--- a/front_end/testcases/rasta/issue_000070.dart.outline.expect
+++ b/front_end/testcases/rasta/issue_000070.dart.outline.expect
@@ -16,7 +16,7 @@
     ;
   get getter() → core::List<self::A::U>
     ;
-  set setter(self::A::S s) → void
+  set setter(generic-covariant-impl self::A::S s) → void
     ;
 }
 abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
diff --git a/front_end/testcases/rasta/mixin_library.dart.outline.expect b/front_end/testcases/rasta/mixin_library.dart.outline.expect
index 62d6389..47e7cdf 100644
--- a/front_end/testcases/rasta/mixin_library.dart.outline.expect
+++ b/front_end/testcases/rasta/mixin_library.dart.outline.expect
@@ -6,12 +6,12 @@
   field dynamic x;
   field dynamic y;
   field dynamic z;
-  field self::Mixin::T t;
+  generic-covariant-impl field self::Mixin::T t;
   synthetic constructor •() → self::Mixin<self::Mixin::T>
     ;
   method foo() → dynamic
     ;
-  method g(self::Mixin::T a) → self::Mixin::T
+  method g(generic-covariant-impl self::Mixin::T a) → self::Mixin::T
     ;
   method h() → dynamic
     ;
diff --git a/front_end/testcases/rasta/previsit_deferred.dart.legacy.expect b/front_end/testcases/rasta/previsit_deferred.dart.legacy.expect
index a4ac799..0a16b0d 100644
--- a/front_end/testcases/rasta/previsit_deferred.dart.legacy.expect
+++ b/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/front_end/testcases/rasta/previsit_deferred.dart.legacy.transformed.expect b/front_end/testcases/rasta/previsit_deferred.dart.legacy.transformed.expect
index a4ac799..0a16b0d 100644
--- a/front_end/testcases/rasta/previsit_deferred.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/rasta/previsit_deferred.dart.strong.expect b/front_end/testcases/rasta/previsit_deferred.dart.strong.expect
index a4ac799..0a16b0d 100644
--- a/front_end/testcases/rasta/previsit_deferred.dart.strong.expect
+++ b/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/front_end/testcases/rasta/previsit_deferred.dart.strong.transformed.expect b/front_end/testcases/rasta/previsit_deferred.dart.strong.transformed.expect
index 52df70f..601cdae 100644
--- a/front_end/testcases/rasta/previsit_deferred.dart.strong.transformed.expect
+++ b/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/front_end/testcases/rasta/super_mixin.dart.legacy.expect b/front_end/testcases/rasta/super_mixin.dart.legacy.expect
index bf05d13..bbd2127 100644
--- a/front_end/testcases/rasta/super_mixin.dart.legacy.expect
+++ b/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";
 
@@ -64,13 +64,13 @@
   field dynamic x = mix::f();
   field dynamic y = null;
   field dynamic z = null;
-  field mix::Mixin::T t = null;
+  generic-covariant-impl field mix::Mixin::T t = null;
   synthetic constructor •() → mix::Mixin<mix::Mixin::T>
     : super core::Object::•()
     ;
   method foo() → dynamic
     return super.foo().+(mix::f());
-  method g(mix::Mixin::T a) → mix::Mixin::T
+  method g(generic-covariant-impl mix::Mixin::T a) → mix::Mixin::T
     return null;
   method h() → dynamic
     return mix::V();
diff --git a/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect b/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect
index f68ab12..90e3685 100644
--- a/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect
+++ b/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";
 
@@ -18,13 +18,13 @@
   field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field self::_C&Super&Mixin::V t = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  generic-covariant-impl field self::_C&Super&Mixin::V t = null /* from org-dartlang-testcase:///mixin_library.dart */;
   synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V>
     : super self::Super::•()
     ;
   method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
     return super.foo().+(mix::f());
-  method /* from org-dartlang-testcase:///mixin_library.dart */ g(self::_C&Super&Mixin::V a) → self::_C&Super&Mixin::V
+  method /* from org-dartlang-testcase:///mixin_library.dart */ g(generic-covariant-impl self::_C&Super&Mixin::V a) → self::_C&Super&Mixin::V
     return null;
   method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
     return mix::V();
@@ -44,13 +44,13 @@
   field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic t = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  generic-covariant-impl field dynamic t = null /* from org-dartlang-testcase:///mixin_library.dart */;
   synthetic constructor •() → self::_D&Super&Mixin
     : super self::Super::•()
     ;
   method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
     return super.foo().+(mix::f());
-  method /* from org-dartlang-testcase:///mixin_library.dart */ g(dynamic a) → dynamic
+  method /* from org-dartlang-testcase:///mixin_library.dart */ g(generic-covariant-impl dynamic a) → dynamic
     return null;
   method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
     return mix::V();
@@ -70,13 +70,13 @@
   field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field self::C2::V t = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  generic-covariant-impl field self::C2::V t = null /* from org-dartlang-testcase:///mixin_library.dart */;
   synthetic constructor •() → self::C2<self::C2::V>
     : super self::Super::•()
     ;
   method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
     return super.foo().+(mix::f());
-  method /* from org-dartlang-testcase:///mixin_library.dart */ g(self::C2::V a) → self::C2::V
+  method /* from org-dartlang-testcase:///mixin_library.dart */ g(generic-covariant-impl self::C2::V a) → self::C2::V
     return null;
   method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
     return mix::V();
@@ -91,13 +91,13 @@
   field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic t = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  generic-covariant-impl field dynamic t = null /* from org-dartlang-testcase:///mixin_library.dart */;
   synthetic constructor •() → self::D2
     : super self::Super::•()
     ;
   method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
     return super.foo().+(mix::f());
-  method /* from org-dartlang-testcase:///mixin_library.dart */ g(dynamic a) → dynamic
+  method /* from org-dartlang-testcase:///mixin_library.dart */ g(generic-covariant-impl dynamic a) → dynamic
     return null;
   method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
     return mix::V();
@@ -128,13 +128,13 @@
   field dynamic x = mix::f();
   field dynamic y = null;
   field dynamic z = null;
-  field mix::Mixin::T t = null;
+  generic-covariant-impl field mix::Mixin::T t = null;
   synthetic constructor •() → mix::Mixin<mix::Mixin::T>
     : super core::Object::•()
     ;
   method foo() → dynamic
     return super.foo().+(mix::f());
-  method g(mix::Mixin::T a) → mix::Mixin::T
+  method g(generic-covariant-impl mix::Mixin::T a) → mix::Mixin::T
     return null;
   method h() → dynamic
     return mix::V();
diff --git a/front_end/testcases/rasta/super_mixin.dart.outline.expect b/front_end/testcases/rasta/super_mixin.dart.outline.expect
index 3463b57..f8efb4c 100644
--- a/front_end/testcases/rasta/super_mixin.dart.outline.expect
+++ b/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";
 
@@ -52,12 +52,12 @@
   field dynamic x;
   field dynamic y;
   field dynamic z;
-  field mix::Mixin::T t;
+  generic-covariant-impl field mix::Mixin::T t;
   synthetic constructor •() → mix::Mixin<mix::Mixin::T>
     ;
   method foo() → dynamic
     ;
-  method g(mix::Mixin::T a) → mix::Mixin::T
+  method g(generic-covariant-impl mix::Mixin::T a) → mix::Mixin::T
     ;
   method h() → dynamic
     ;
diff --git a/front_end/testcases/rasta/super_mixin.dart.strong.expect b/front_end/testcases/rasta/super_mixin.dart.strong.expect
index 5ecf3b5..aba8974 100644
--- a/front_end/testcases/rasta/super_mixin.dart.strong.expect
+++ b/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/front_end/testcases/redirecting_factory_const_inference.dart.legacy.expect b/front_end/testcases/redirecting_factory_const_inference.dart.legacy.expect
index afbcf0c..97f89e1 100644
--- a/front_end/testcases/redirecting_factory_const_inference.dart.legacy.expect
+++ b/front_end/testcases/redirecting_factory_const_inference.dart.legacy.expect
@@ -13,7 +13,7 @@
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
-  field self::_X<self::A::T> x;
+  generic-covariant-impl field self::_X<self::A::T> x;
   constructor •(self::_X<self::A::T> x) → self::A<self::A::T>
     : self::A::x = x, super core::Object::•()
     ;
diff --git a/front_end/testcases/redirecting_factory_const_inference.dart.legacy.transformed.expect b/front_end/testcases/redirecting_factory_const_inference.dart.legacy.transformed.expect
index afbcf0c..97f89e1 100644
--- a/front_end/testcases/redirecting_factory_const_inference.dart.legacy.transformed.expect
+++ b/front_end/testcases/redirecting_factory_const_inference.dart.legacy.transformed.expect
@@ -13,7 +13,7 @@
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
-  field self::_X<self::A::T> x;
+  generic-covariant-impl field self::_X<self::A::T> x;
   constructor •(self::_X<self::A::T> x) → self::A<self::A::T>
     : self::A::x = x, super core::Object::•()
     ;
diff --git a/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect b/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect
index a111baf..25ec287 100644
--- a/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect
+++ b/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect
@@ -12,7 +12,7 @@
     ;
 }
 class A<T extends core::Object = dynamic> extends core::Object {
-  field self::_X<self::A::T> x;
+  generic-covariant-impl field self::_X<self::A::T> x;
   constructor •(self::_X<self::A::T> x) → self::A<self::A::T>
     ;
 }
diff --git a/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.expect b/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.expect
index dd1e103..f3bfb14 100644
--- a/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.expect
+++ b/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.expect
@@ -8,7 +8,7 @@
     ;
 }
 class Foo<T extends self::X = dynamic> extends core::Object {
-  field self::Foo::T x;
+  generic-covariant-impl field self::Foo::T x;
   constructor fromX(self::X _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
diff --git a/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect b/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect
index dd1e103..f3bfb14 100644
--- a/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect
+++ b/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect
@@ -8,7 +8,7 @@
     ;
 }
 class Foo<T extends self::X = dynamic> extends core::Object {
-  field self::Foo::T x;
+  generic-covariant-impl field self::Foo::T x;
   constructor fromX(self::X _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
diff --git a/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.outline.expect b/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.outline.expect
index fdfee1c..ba06dee 100644
--- a/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.outline.expect
+++ b/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.outline.expect
@@ -7,7 +7,7 @@
     ;
 }
 class Foo<T extends self::X = dynamic> extends core::Object {
-  field self::Foo::T x;
+  generic-covariant-impl field self::Foo::T x;
   constructor fromX(self::X _init) → self::Foo<self::Foo::T>
     ;
   constructor fromT(self::Foo::T _init) → self::Foo<self::Foo::T>
diff --git a/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.expect b/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.expect
index c18e8e1..b36d718 100644
--- a/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.expect
+++ b/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo<T extends core::Object = dynamic> extends core::Object {
-  field self::Foo::T x;
+  generic-covariant-impl field self::Foo::T x;
   constructor from(core::String _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
diff --git a/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.transformed.expect b/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.transformed.expect
index c18e8e1..b36d718 100644
--- a/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.transformed.expect
+++ b/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo<T extends core::Object = dynamic> extends core::Object {
-  field self::Foo::T x;
+  generic-covariant-impl field self::Foo::T x;
   constructor from(core::String _init) → self::Foo<self::Foo::T>
     : this self::Foo::_internal(x: _init)
     ;
diff --git a/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect b/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect
index 1655fc6..36894d5 100644
--- a/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect
+++ b/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo<T extends core::Object = dynamic> extends core::Object {
-  field self::Foo::T x;
+  generic-covariant-impl field self::Foo::T x;
   constructor from(core::String _init) → self::Foo<self::Foo::T>
     ;
   constructor _internal({self::Foo::T x}) → self::Foo<self::Foo::T>
diff --git a/front_end/testcases/regress/issue_31155.dart.legacy.expect b/front_end/testcases/regress/issue_31155.dart.legacy.expect
index 8130bfc..35b1ddf 100644
--- a/front_end/testcases/regress/issue_31155.dart.legacy.expect
+++ b/front_end/testcases/regress/issue_31155.dart.legacy.expect
@@ -6,7 +6,7 @@
 //   var f = Map<A, B> {};
 //                  ^
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceded by the keyword 'operator'.
 // Try adding the keyword 'operator'.
 //   var f = Map<A, B> {};
 //                   ^
diff --git a/front_end/testcases/regress/issue_31155.dart.legacy.transformed.expect b/front_end/testcases/regress/issue_31155.dart.legacy.transformed.expect
index 8130bfc..35b1ddf 100644
--- a/front_end/testcases/regress/issue_31155.dart.legacy.transformed.expect
+++ b/front_end/testcases/regress/issue_31155.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
 //   var f = Map<A, B> {};
 //                  ^
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceded by the keyword 'operator'.
 // Try adding the keyword 'operator'.
 //   var f = Map<A, B> {};
 //                   ^
diff --git a/front_end/testcases/regress/issue_31155.dart.outline.expect b/front_end/testcases/regress/issue_31155.dart.outline.expect
index 31866e5..368d30d 100644
--- a/front_end/testcases/regress/issue_31155.dart.outline.expect
+++ b/front_end/testcases/regress/issue_31155.dart.outline.expect
@@ -6,7 +6,7 @@
 //   var f = Map<A, B> {};
 //                  ^
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceded by the keyword 'operator'.
 // Try adding the keyword 'operator'.
 //   var f = Map<A, B> {};
 //                   ^
diff --git a/front_end/testcases/regress/issue_31155.dart.strong.expect b/front_end/testcases/regress/issue_31155.dart.strong.expect
index f9e661a..e6f0d60 100644
--- a/front_end/testcases/regress/issue_31155.dart.strong.expect
+++ b/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -6,7 +6,7 @@
 //   var f = Map<A, B> {};
 //                  ^
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceded by the keyword 'operator'.
 // Try adding the keyword 'operator'.
 //   var f = Map<A, B> {};
 //                   ^
diff --git a/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect b/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
index f9e661a..e6f0d60 100644
--- a/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
+++ b/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 //   var f = Map<A, B> {};
 //                  ^
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceded by the keyword 'operator'.
 // Try adding the keyword 'operator'.
 //   var f = Map<A, B> {};
 //                   ^
diff --git a/front_end/testcases/regress/issue_32200.dart.strong.expect b/front_end/testcases/regress/issue_32200.dart.strong.expect
index 3316d53..667cb8d 100644
--- a/front_end/testcases/regress/issue_32200.dart.strong.expect
+++ b/front_end/testcases/regress/issue_32200.dart.strong.expect
@@ -6,12 +6,6 @@
 //   self.Foo self;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/regress/issue_32200.dart:13:19: Error: A value of type 'Foo' can't be assigned to a variable of type 'invalid-type'.
-//  - 'Foo' is from 'pkg/front_end/testcases/regress/issue_32200.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
-//   instance.self = instance;
-//                   ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -25,9 +19,5 @@
 }
 static method main() → dynamic {
   self::Foo instance = new self::Foo::•();
-  instance.{self::Foo::self} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_32200.dart:13:19: Error: A value of type 'Foo' can't be assigned to a variable of type 'invalid-type'.
- - 'Foo' is from 'pkg/front_end/testcases/regress/issue_32200.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
-  instance.self = instance;
-                  ^" in instance as{TypeError} invalid-type;
+  instance.{self::Foo::self} = instance as{TypeError} invalid-type;
 }
diff --git a/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect b/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
index 3316d53..667cb8d 100644
--- a/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
+++ b/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
@@ -6,12 +6,6 @@
 //   self.Foo self;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/regress/issue_32200.dart:13:19: Error: A value of type 'Foo' can't be assigned to a variable of type 'invalid-type'.
-//  - 'Foo' is from 'pkg/front_end/testcases/regress/issue_32200.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
-//   instance.self = instance;
-//                   ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -25,9 +19,5 @@
 }
 static method main() → dynamic {
   self::Foo instance = new self::Foo::•();
-  instance.{self::Foo::self} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_32200.dart:13:19: Error: A value of type 'Foo' can't be assigned to a variable of type 'invalid-type'.
- - 'Foo' is from 'pkg/front_end/testcases/regress/issue_32200.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
-  instance.self = instance;
-                  ^" in instance as{TypeError} invalid-type;
+  instance.{self::Foo::self} = instance as{TypeError} invalid-type;
 }
diff --git a/front_end/testcases/regress/issue_34291.dart.legacy.expect b/front_end/testcases/regress/issue_34291.dart.legacy.expect
index b75366e..16fd29e 100644
--- a/front_end/testcases/regress/issue_34291.dart.legacy.expect
+++ b/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/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect b/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect
index b75366e..16fd29e 100644
--- a/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/regress/issue_34291.dart.outline.expect b/front_end/testcases/regress/issue_34291.dart.outline.expect
index a72a23c..7e0d3a3 100644
--- a/front_end/testcases/regress/issue_34291.dart.outline.expect
+++ b/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/front_end/testcases/regress/issue_34403.dart.legacy.expect b/front_end/testcases/regress/issue_34403.dart.legacy.expect
index 4bc0e99..6411f4c 100644
--- a/front_end/testcases/regress/issue_34403.dart.legacy.expect
+++ b/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/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect b/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect
index 4bc0e99..6411f4c 100644
--- a/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect
+++ b/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/front_end/testcases/regress/issue_34403.dart.strong.expect b/front_end/testcases/regress/issue_34403.dart.strong.expect
index 67776e6..ae029a9 100644
--- a/front_end/testcases/regress/issue_34403.dart.strong.expect
+++ b/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/front_end/testcases/regress/issue_34403.dart.strong.transformed.expect b/front_end/testcases/regress/issue_34403.dart.strong.transformed.expect
index 67776e6..ae029a9 100644
--- a/front_end/testcases/regress/issue_34403.dart.strong.transformed.expect
+++ b/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/front_end/testcases/regress/issue_36400.dart b/front_end/testcases/regress/issue_36400.dart
new file mode 100644
index 0000000..33c29d6
--- /dev/null
+++ b/front_end/testcases/regress/issue_36400.dart
@@ -0,0 +1,10 @@
+// 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.
+
+class Test {
+  Test factory Test() {
+    return null;
+  }
+}
+
diff --git a/front_end/testcases/regress/issue_36400.dart.hierarchy.expect b/front_end/testcases/regress/issue_36400.dart.hierarchy.expect
new file mode 100644
index 0000000..6dc337c
--- /dev/null
+++ b/front_end/testcases/regress/issue_36400.dart.hierarchy.expect
@@ -0,0 +1,36 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Test:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/front_end/testcases/regress/issue_36400.dart.legacy.expect b/front_end/testcases/regress/issue_36400.dart.legacy.expect
new file mode 100644
index 0000000..e63b720
--- /dev/null
+++ b/front_end/testcases/regress/issue_36400.dart.legacy.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36400.dart:6:3: Error: Factory constructors cannot have a return type.
+// Try removing the type appearing before 'factory'.
+//   Test factory Test() {
+//   ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Test extends core::Object {
+  static factory •() → self::Test {
+    return null;
+  }
+}
diff --git a/front_end/testcases/regress/issue_36400.dart.legacy.transformed.expect b/front_end/testcases/regress/issue_36400.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e63b720
--- /dev/null
+++ b/front_end/testcases/regress/issue_36400.dart.legacy.transformed.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36400.dart:6:3: Error: Factory constructors cannot have a return type.
+// Try removing the type appearing before 'factory'.
+//   Test factory Test() {
+//   ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Test extends core::Object {
+  static factory •() → self::Test {
+    return null;
+  }
+}
diff --git a/front_end/testcases/regress/issue_36400.dart.outline.expect b/front_end/testcases/regress/issue_36400.dart.outline.expect
new file mode 100644
index 0000000..2f39e53
--- /dev/null
+++ b/front_end/testcases/regress/issue_36400.dart.outline.expect
@@ -0,0 +1,16 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36400.dart:6:3: Error: Factory constructors cannot have a return type.
+// Try removing the type appearing before 'factory'.
+//   Test factory Test() {
+//   ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Test extends core::Object {
+  static factory •() → self::Test
+    ;
+}
diff --git a/front_end/testcases/regress/issue_36400.dart.strong.expect b/front_end/testcases/regress/issue_36400.dart.strong.expect
new file mode 100644
index 0000000..e63b720
--- /dev/null
+++ b/front_end/testcases/regress/issue_36400.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36400.dart:6:3: Error: Factory constructors cannot have a return type.
+// Try removing the type appearing before 'factory'.
+//   Test factory Test() {
+//   ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Test extends core::Object {
+  static factory •() → self::Test {
+    return null;
+  }
+}
diff --git a/front_end/testcases/regress/issue_36400.dart.strong.transformed.expect b/front_end/testcases/regress/issue_36400.dart.strong.transformed.expect
new file mode 100644
index 0000000..e63b720
--- /dev/null
+++ b/front_end/testcases/regress/issue_36400.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36400.dart:6:3: Error: Factory constructors cannot have a return type.
+// Try removing the type appearing before 'factory'.
+//   Test factory Test() {
+//   ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Test extends core::Object {
+  static factory •() → self::Test {
+    return null;
+  }
+}
diff --git a/front_end/testcases/regress/issue_36647.dart b/front_end/testcases/regress/issue_36647.dart
new file mode 100644
index 0000000..3fcff27
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647.dart
@@ -0,0 +1,5 @@
+// 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 'issue_36647_lib1.dart';
diff --git a/front_end/testcases/regress/issue_36647.dart.hierarchy.expect b/front_end/testcases/regress/issue_36647.dart.hierarchy.expect
new file mode 100644
index 0000000..f111e00
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647.dart.hierarchy.expect
@@ -0,0 +1,36 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+xxx:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/front_end/testcases/regress/issue_36647.dart.legacy.expect b/front_end/testcases/regress/issue_36647.dart.legacy.expect
new file mode 100644
index 0000000..9199ba0
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647.dart.legacy.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///issue_36647_lib1.dart";
+
+
+library;
+import self as self2;
+import "issue_36647_lib2.dart" as iss;
+additionalExports = (iss::xxx)
+, iss::XXX)
+, iss::extends)
+
+
+export "org-dartlang-testcase:///issue_36647_lib2.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: Expected a class or mixin body, but got 'xx'.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Expected an identifier, but got 'extends'.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: 'XXX' is already declared in this scope.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Context: Previous declaration of 'XXX'.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Warning: Type 'xx' not found.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Warning: 'xx' isn't a type.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+import self as iss;
+import "dart:core" as core;
+
+class xxx extends core::Object {
+  synthetic constructor •() → iss::xxx
+    : super core::Object::•()
+    ;
+}
+static field invalid-type XXX;
+static field dynamic extends;
diff --git a/front_end/testcases/regress/issue_36647.dart.legacy.transformed.expect b/front_end/testcases/regress/issue_36647.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9199ba0
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647.dart.legacy.transformed.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///issue_36647_lib1.dart";
+
+
+library;
+import self as self2;
+import "issue_36647_lib2.dart" as iss;
+additionalExports = (iss::xxx)
+, iss::XXX)
+, iss::extends)
+
+
+export "org-dartlang-testcase:///issue_36647_lib2.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: Expected a class or mixin body, but got 'xx'.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Expected an identifier, but got 'extends'.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: 'XXX' is already declared in this scope.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Context: Previous declaration of 'XXX'.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Warning: Type 'xx' not found.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Warning: 'xx' isn't a type.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+import self as iss;
+import "dart:core" as core;
+
+class xxx extends core::Object {
+  synthetic constructor •() → iss::xxx
+    : super core::Object::•()
+    ;
+}
+static field invalid-type XXX;
+static field dynamic extends;
diff --git a/front_end/testcases/regress/issue_36647.dart.outline.expect b/front_end/testcases/regress/issue_36647.dart.outline.expect
new file mode 100644
index 0000000..0a38be0
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647.dart.outline.expect
@@ -0,0 +1,67 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///issue_36647_lib1.dart";
+
+
+library;
+import self as self2;
+import "issue_36647_lib2.dart" as iss;
+additionalExports = (iss::xxx)
+, iss::XXX)
+, iss::extends)
+
+
+export "org-dartlang-testcase:///issue_36647_lib2.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: Expected a class or mixin body, but got 'xx'.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Expected an identifier, but got 'extends'.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: 'XXX' is already declared in this scope.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Context: Previous declaration of 'XXX'.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Warning: Type 'xx' not found.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+import self as iss;
+import "dart:core" as core;
+
+class xxx extends core::Object {
+  synthetic constructor •() → iss::xxx
+    ;
+}
+static field invalid-type XXX;
+static field dynamic extends;
diff --git a/front_end/testcases/regress/issue_36647.dart.strong.expect b/front_end/testcases/regress/issue_36647.dart.strong.expect
new file mode 100644
index 0000000..2e470e5
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647.dart.strong.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///issue_36647_lib1.dart";
+
+
+library;
+import self as self2;
+import "issue_36647_lib2.dart" as iss;
+additionalExports = (iss::xxx)
+, iss::XXX)
+, iss::extends)
+
+
+export "org-dartlang-testcase:///issue_36647_lib2.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: Expected a class or mixin body, but got 'xx'.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Expected an identifier, but got 'extends'.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: 'XXX' is already declared in this scope.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Context: Previous declaration of 'XXX'.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: Type 'xx' not found.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: 'xx' isn't a type.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+import self as iss;
+import "dart:core" as core;
+
+class xxx extends core::Object {
+  synthetic constructor •() → iss::xxx
+    : super core::Object::•()
+    ;
+}
+static field invalid-type XXX;
+static field dynamic extends;
diff --git a/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect b/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect
new file mode 100644
index 0000000..2e470e5
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///issue_36647_lib1.dart";
+
+
+library;
+import self as self2;
+import "issue_36647_lib2.dart" as iss;
+additionalExports = (iss::xxx)
+, iss::XXX)
+, iss::extends)
+
+
+export "org-dartlang-testcase:///issue_36647_lib2.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: Expected a class or mixin body, but got 'xx'.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Expected an identifier, but got 'extends'.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: 'XXX' is already declared in this scope.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Context: Previous declaration of 'XXX'.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: Type 'xx' not found.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: 'xx' isn't a type.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+import self as iss;
+import "dart:core" as core;
+
+class xxx extends core::Object {
+  synthetic constructor •() → iss::xxx
+    : super core::Object::•()
+    ;
+}
+static field invalid-type XXX;
+static field dynamic extends;
diff --git a/front_end/testcases/regress/issue_36647_2.dart b/front_end/testcases/regress/issue_36647_2.dart
new file mode 100644
index 0000000..4096e59
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647_2.dart
@@ -0,0 +1,5 @@
+// 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.
+
+export 'issue_36647_2_lib1.dart';
diff --git a/front_end/testcases/regress/issue_36647_2.dart.legacy.expect b/front_end/testcases/regress/issue_36647_2.dart.legacy.expect
new file mode 100644
index 0000000..e040789
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647_2.dart.legacy.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "issue_36647_2_lib1.dart" as iss;
+additionalExports = (iss::foo)
+, iss::bar)
+, iss::baz)
+
+
+export "org-dartlang-testcase:///issue_36647_2_lib1.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:6:5: Error: 'foo' is already declared in this scope.
+// int foo = 43;
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:5:5: Context: Previous declaration of 'foo'.
+// int foo = 42;
+//     ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:8:14: Error: 'bar' is already declared in this scope.
+// typedef bool bar();
+//              ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:7:14: Context: Previous declaration of 'bar'.
+// typedef bool bar();
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:13:5: Error: 'baz' is already declared in this scope.
+// int baz() {
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:9:5: Context: Previous declaration of 'baz'.
+// int baz() {
+//     ^^^
+//
+import self as iss;
+import "dart:core" as core;
+
+typedef bar = () → core::bool;
+static field core::int foo;
+static method baz() → core::int {
+  return 42;
+}
diff --git a/front_end/testcases/regress/issue_36647_2.dart.legacy.transformed.expect b/front_end/testcases/regress/issue_36647_2.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e040789
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647_2.dart.legacy.transformed.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "issue_36647_2_lib1.dart" as iss;
+additionalExports = (iss::foo)
+, iss::bar)
+, iss::baz)
+
+
+export "org-dartlang-testcase:///issue_36647_2_lib1.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:6:5: Error: 'foo' is already declared in this scope.
+// int foo = 43;
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:5:5: Context: Previous declaration of 'foo'.
+// int foo = 42;
+//     ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:8:14: Error: 'bar' is already declared in this scope.
+// typedef bool bar();
+//              ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:7:14: Context: Previous declaration of 'bar'.
+// typedef bool bar();
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:13:5: Error: 'baz' is already declared in this scope.
+// int baz() {
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:9:5: Context: Previous declaration of 'baz'.
+// int baz() {
+//     ^^^
+//
+import self as iss;
+import "dart:core" as core;
+
+typedef bar = () → core::bool;
+static field core::int foo;
+static method baz() → core::int {
+  return 42;
+}
diff --git a/front_end/testcases/regress/issue_36647_2.dart.outline.expect b/front_end/testcases/regress/issue_36647_2.dart.outline.expect
new file mode 100644
index 0000000..af81823
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647_2.dart.outline.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "issue_36647_2_lib1.dart" as iss;
+additionalExports = (iss::foo)
+, iss::bar)
+, iss::baz)
+
+
+export "org-dartlang-testcase:///issue_36647_2_lib1.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:6:5: Error: 'foo' is already declared in this scope.
+// int foo = 43;
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:5:5: Context: Previous declaration of 'foo'.
+// int foo = 42;
+//     ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:8:14: Error: 'bar' is already declared in this scope.
+// typedef bool bar();
+//              ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:7:14: Context: Previous declaration of 'bar'.
+// typedef bool bar();
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:13:5: Error: 'baz' is already declared in this scope.
+// int baz() {
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:9:5: Context: Previous declaration of 'baz'.
+// int baz() {
+//     ^^^
+//
+import self as iss;
+import "dart:core" as core;
+
+typedef bar = () → core::bool;
+static field core::int foo;
+static method baz() → core::int
+  ;
diff --git a/front_end/testcases/regress/issue_36647_2.dart.strong.expect b/front_end/testcases/regress/issue_36647_2.dart.strong.expect
new file mode 100644
index 0000000..e040789
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647_2.dart.strong.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "issue_36647_2_lib1.dart" as iss;
+additionalExports = (iss::foo)
+, iss::bar)
+, iss::baz)
+
+
+export "org-dartlang-testcase:///issue_36647_2_lib1.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:6:5: Error: 'foo' is already declared in this scope.
+// int foo = 43;
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:5:5: Context: Previous declaration of 'foo'.
+// int foo = 42;
+//     ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:8:14: Error: 'bar' is already declared in this scope.
+// typedef bool bar();
+//              ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:7:14: Context: Previous declaration of 'bar'.
+// typedef bool bar();
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:13:5: Error: 'baz' is already declared in this scope.
+// int baz() {
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:9:5: Context: Previous declaration of 'baz'.
+// int baz() {
+//     ^^^
+//
+import self as iss;
+import "dart:core" as core;
+
+typedef bar = () → core::bool;
+static field core::int foo;
+static method baz() → core::int {
+  return 42;
+}
diff --git a/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect b/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect
new file mode 100644
index 0000000..e040789
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "issue_36647_2_lib1.dart" as iss;
+additionalExports = (iss::foo)
+, iss::bar)
+, iss::baz)
+
+
+export "org-dartlang-testcase:///issue_36647_2_lib1.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:6:5: Error: 'foo' is already declared in this scope.
+// int foo = 43;
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:5:5: Context: Previous declaration of 'foo'.
+// int foo = 42;
+//     ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:8:14: Error: 'bar' is already declared in this scope.
+// typedef bool bar();
+//              ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:7:14: Context: Previous declaration of 'bar'.
+// typedef bool bar();
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:13:5: Error: 'baz' is already declared in this scope.
+// int baz() {
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:9:5: Context: Previous declaration of 'baz'.
+// int baz() {
+//     ^^^
+//
+import self as iss;
+import "dart:core" as core;
+
+typedef bar = () → core::bool;
+static field core::int foo;
+static method baz() → core::int {
+  return 42;
+}
diff --git a/front_end/testcases/regress/issue_36647_2_lib1.dart b/front_end/testcases/regress/issue_36647_2_lib1.dart
new file mode 100644
index 0000000..b2d8d4b
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647_2_lib1.dart
@@ -0,0 +1,15 @@
+// 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.
+
+int foo = 42;
+int foo = 43;
+typedef bool bar();
+typedef bool bar();
+int baz() {
+  return 42;
+}
+
+int baz() {
+  return 43;
+}
diff --git a/front_end/testcases/regress/issue_36647_lib1.dart b/front_end/testcases/regress/issue_36647_lib1.dart
new file mode 100644
index 0000000..4aef191
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647_lib1.dart
@@ -0,0 +1,5 @@
+// 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.
+
+export 'issue_36647_lib2.dart';
diff --git a/front_end/testcases/regress/issue_36647_lib2.dart b/front_end/testcases/regress/issue_36647_lib2.dart
new file mode 100644
index 0000000..3960141
--- /dev/null
+++ b/front_end/testcases/regress/issue_36647_lib2.dart
@@ -0,0 +1,6 @@
+// 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.
+
+class xxx xx XXX extends XXX {
+}
diff --git a/front_end/testcases/regress/issue_36669.dart b/front_end/testcases/regress/issue_36669.dart
new file mode 100644
index 0000000..5aba8e6
--- /dev/null
+++ b/front_end/testcases/regress/issue_36669.dart
@@ -0,0 +1,11 @@
+// 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.
+
+class NoUnnamedConstuctor {
+  NoUnnamedConstuctor._();
+}
+
+class MixMeIn {}
+
+class Foo extends NoUnnamedConstuctor with MixMeIn {}
diff --git a/front_end/testcases/regress/issue_36669.dart.hierarchy.expect b/front_end/testcases/regress/issue_36669.dart.hierarchy.expect
new file mode 100644
index 0000000..b7c594c
--- /dev/null
+++ b/front_end/testcases/regress/issue_36669.dart.hierarchy.expect
@@ -0,0 +1,114 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+NoUnnamedConstuctor:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+MixMeIn:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+NoUnnamedConstuctor with MixMeIn:
+  superclasses:
+    Object
+      -> NoUnnamedConstuctor
+  interfaces: MixMeIn
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+  interfaceMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  interfaceSetters:
+
+Foo:
+  superclasses:
+    Object
+      -> NoUnnamedConstuctor
+        -> _Foo&NoUnnamedConstuctor&MixMeIn
+  interfaces: MixMeIn
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+  interfaceMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  interfaceSetters:
diff --git a/front_end/testcases/regress/issue_36669.dart.legacy.expect b/front_end/testcases/regress/issue_36669.dart.legacy.expect
new file mode 100644
index 0000000..104dfea
--- /dev/null
+++ b/front_end/testcases/regress/issue_36669.dart.legacy.expect
@@ -0,0 +1,31 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36669.dart:11:7: Error: The superclass, 'NoUnnamedConstuctor with MixMeIn', has no unnamed constructor that takes no arguments.
+// class Foo extends NoUnnamedConstuctor with MixMeIn {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class NoUnnamedConstuctor extends core::Object {
+  constructor _() → self::NoUnnamedConstuctor
+    : super core::Object::•()
+    ;
+}
+class MixMeIn extends core::Object {
+  synthetic constructor •() → self::MixMeIn
+    : super core::Object::•()
+    ;
+}
+abstract class _Foo&NoUnnamedConstuctor&MixMeIn = self::NoUnnamedConstuctor with self::MixMeIn {
+  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn
+    : super self::NoUnnamedConstuctor::_()
+    ;
+}
+class Foo extends self::_Foo&NoUnnamedConstuctor&MixMeIn {
+  synthetic constructor •() → self::Foo
+    : invalid-initializer
+    ;
+}
diff --git a/front_end/testcases/regress/issue_36669.dart.legacy.transformed.expect b/front_end/testcases/regress/issue_36669.dart.legacy.transformed.expect
new file mode 100644
index 0000000..25e5cab
--- /dev/null
+++ b/front_end/testcases/regress/issue_36669.dart.legacy.transformed.expect
@@ -0,0 +1,31 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36669.dart:11:7: Error: The superclass, 'NoUnnamedConstuctor with MixMeIn', has no unnamed constructor that takes no arguments.
+// class Foo extends NoUnnamedConstuctor with MixMeIn {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class NoUnnamedConstuctor extends core::Object {
+  constructor _() → self::NoUnnamedConstuctor
+    : super core::Object::•()
+    ;
+}
+class MixMeIn extends core::Object {
+  synthetic constructor •() → self::MixMeIn
+    : super core::Object::•()
+    ;
+}
+abstract class _Foo&NoUnnamedConstuctor&MixMeIn extends self::NoUnnamedConstuctor implements self::MixMeIn {
+  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn
+    : super self::NoUnnamedConstuctor::_()
+    ;
+}
+class Foo extends self::_Foo&NoUnnamedConstuctor&MixMeIn {
+  synthetic constructor •() → self::Foo
+    : invalid-initializer
+    ;
+}
diff --git a/front_end/testcases/regress/issue_36669.dart.outline.expect b/front_end/testcases/regress/issue_36669.dart.outline.expect
new file mode 100644
index 0000000..ea21227
--- /dev/null
+++ b/front_end/testcases/regress/issue_36669.dart.outline.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class NoUnnamedConstuctor extends core::Object {
+  constructor _() → self::NoUnnamedConstuctor
+    ;
+}
+class MixMeIn extends core::Object {
+  synthetic constructor •() → self::MixMeIn
+    ;
+}
+abstract class _Foo&NoUnnamedConstuctor&MixMeIn = self::NoUnnamedConstuctor with self::MixMeIn {
+  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn
+    : super self::NoUnnamedConstuctor::_()
+    ;
+}
+class Foo extends self::_Foo&NoUnnamedConstuctor&MixMeIn {
+  synthetic constructor •() → self::Foo
+    ;
+}
diff --git a/front_end/testcases/regress/issue_36669.dart.strong.expect b/front_end/testcases/regress/issue_36669.dart.strong.expect
new file mode 100644
index 0000000..104dfea
--- /dev/null
+++ b/front_end/testcases/regress/issue_36669.dart.strong.expect
@@ -0,0 +1,31 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36669.dart:11:7: Error: The superclass, 'NoUnnamedConstuctor with MixMeIn', has no unnamed constructor that takes no arguments.
+// class Foo extends NoUnnamedConstuctor with MixMeIn {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class NoUnnamedConstuctor extends core::Object {
+  constructor _() → self::NoUnnamedConstuctor
+    : super core::Object::•()
+    ;
+}
+class MixMeIn extends core::Object {
+  synthetic constructor •() → self::MixMeIn
+    : super core::Object::•()
+    ;
+}
+abstract class _Foo&NoUnnamedConstuctor&MixMeIn = self::NoUnnamedConstuctor with self::MixMeIn {
+  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn
+    : super self::NoUnnamedConstuctor::_()
+    ;
+}
+class Foo extends self::_Foo&NoUnnamedConstuctor&MixMeIn {
+  synthetic constructor •() → self::Foo
+    : invalid-initializer
+    ;
+}
diff --git a/front_end/testcases/regress/issue_36669.dart.strong.transformed.expect b/front_end/testcases/regress/issue_36669.dart.strong.transformed.expect
new file mode 100644
index 0000000..25e5cab
--- /dev/null
+++ b/front_end/testcases/regress/issue_36669.dart.strong.transformed.expect
@@ -0,0 +1,31 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36669.dart:11:7: Error: The superclass, 'NoUnnamedConstuctor with MixMeIn', has no unnamed constructor that takes no arguments.
+// class Foo extends NoUnnamedConstuctor with MixMeIn {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class NoUnnamedConstuctor extends core::Object {
+  constructor _() → self::NoUnnamedConstuctor
+    : super core::Object::•()
+    ;
+}
+class MixMeIn extends core::Object {
+  synthetic constructor •() → self::MixMeIn
+    : super core::Object::•()
+    ;
+}
+abstract class _Foo&NoUnnamedConstuctor&MixMeIn extends self::NoUnnamedConstuctor implements self::MixMeIn {
+  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn
+    : super self::NoUnnamedConstuctor::_()
+    ;
+}
+class Foo extends self::_Foo&NoUnnamedConstuctor&MixMeIn {
+  synthetic constructor •() → self::Foo
+    : invalid-initializer
+    ;
+}
diff --git a/front_end/testcases/regress/issue_36793.dart b/front_end/testcases/regress/issue_36793.dart
new file mode 100644
index 0000000..1601a23
--- /dev/null
+++ b/front_end/testcases/regress/issue_36793.dart
@@ -0,0 +1,14 @@
+// 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.
+
+const int y = 42;
+
+@y
+int x = 1;
+@y
+int x = 2;
+
+main() {
+  print(y);
+}
\ No newline at end of file
diff --git a/front_end/testcases/regress/issue_36793.dart.legacy.expect b/front_end/testcases/regress/issue_36793.dart.legacy.expect
new file mode 100644
index 0000000..4735cfe
--- /dev/null
+++ b/front_end/testcases/regress/issue_36793.dart.legacy.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36793.dart:10:5: Error: 'x' is already declared in this scope.
+// int x = 2;
+//     ^
+// pkg/front_end/testcases/regress/issue_36793.dart:8:5: Context: Previous declaration of 'x'.
+// int x = 1;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int y = 42;
+static field core::int x;
+static method main() → dynamic {
+  core::print(self::y);
+}
diff --git a/front_end/testcases/regress/issue_36793.dart.legacy.transformed.expect b/front_end/testcases/regress/issue_36793.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4735cfe
--- /dev/null
+++ b/front_end/testcases/regress/issue_36793.dart.legacy.transformed.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36793.dart:10:5: Error: 'x' is already declared in this scope.
+// int x = 2;
+//     ^
+// pkg/front_end/testcases/regress/issue_36793.dart:8:5: Context: Previous declaration of 'x'.
+// int x = 1;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int y = 42;
+static field core::int x;
+static method main() → dynamic {
+  core::print(self::y);
+}
diff --git a/front_end/testcases/regress/issue_36793.dart.outline.expect b/front_end/testcases/regress/issue_36793.dart.outline.expect
new file mode 100644
index 0000000..659526a
--- /dev/null
+++ b/front_end/testcases/regress/issue_36793.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36793.dart:10:5: Error: 'x' is already declared in this scope.
+// int x = 2;
+//     ^
+// pkg/front_end/testcases/regress/issue_36793.dart:8:5: Context: Previous declaration of 'x'.
+// int x = 1;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int y;
+static field core::int x;
+static method main() → dynamic
+  ;
diff --git a/front_end/testcases/regress/issue_36793.dart.strong.expect b/front_end/testcases/regress/issue_36793.dart.strong.expect
new file mode 100644
index 0000000..4735cfe
--- /dev/null
+++ b/front_end/testcases/regress/issue_36793.dart.strong.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36793.dart:10:5: Error: 'x' is already declared in this scope.
+// int x = 2;
+//     ^
+// pkg/front_end/testcases/regress/issue_36793.dart:8:5: Context: Previous declaration of 'x'.
+// int x = 1;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int y = 42;
+static field core::int x;
+static method main() → dynamic {
+  core::print(self::y);
+}
diff --git a/front_end/testcases/regress/issue_36793.dart.strong.transformed.expect b/front_end/testcases/regress/issue_36793.dart.strong.transformed.expect
new file mode 100644
index 0000000..4735cfe
--- /dev/null
+++ b/front_end/testcases/regress/issue_36793.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36793.dart:10:5: Error: 'x' is already declared in this scope.
+// int x = 2;
+//     ^
+// pkg/front_end/testcases/regress/issue_36793.dart:8:5: Context: Previous declaration of 'x'.
+// int x = 1;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int y = 42;
+static field core::int x;
+static method main() → dynamic {
+  core::print(self::y);
+}
diff --git a/front_end/testcases/runtime_checks/contravariant_getter.dart b/front_end/testcases/runtime_checks/contravariant_getter.dart
index 4cb62d5..b8ff15c 100644
--- a/front_end/testcases/runtime_checks/contravariant_getter.dart
+++ b/front_end/testcases/runtime_checks/contravariant_getter.dart
@@ -9,7 +9,7 @@
 
 class C<T> {
   F<T> y;
-  void f(T /*@covariance=genericImpl*/ value) {
+  void f(T value) {
     this.y(value);
   }
 }
diff --git a/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.expect b/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.expect
index d75022d..79b167b 100644
--- a/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.expect
@@ -8,7 +8,7 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f(self::C::T value) → void {
+  method f(generic-covariant-impl self::C::T value) → void {
     this.{self::C::y}(value);
   }
 }
diff --git a/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.transformed.expect
index d75022d..79b167b 100644
--- a/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.transformed.expect
@@ -8,7 +8,7 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f(self::C::T value) → void {
+  method f(generic-covariant-impl self::C::T value) → void {
     this.{self::C::y}(value);
   }
 }
diff --git a/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect b/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect
index 5cb4a3a..7657ab7 100644
--- a/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect
@@ -7,7 +7,7 @@
   field (self::C::T) → void y;
   synthetic constructor •() → self::C<self::C::T>
     ;
-  method f(self::C::T value) → void
+  method f(generic-covariant-impl self::C::T value) → void
     ;
 }
 static method g(self::C<core::num> c) → void
diff --git a/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart b/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart
index bbe2c24..ec30f9e 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart
+++ b/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart
@@ -6,8 +6,8 @@
 library test;
 
 class C<T> {
-  void f< /*@covariance=genericImpl*/ U extends T>(U x) {}
-  void g1< /*@covariance=genericImpl*/ U extends T>() {
+  void f<U extends T>(U x) {}
+  void g1<U extends T>() {
     this.f<U>(1.5);
   }
 }
diff --git a/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.expect b/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.expect
index b8aa4df..f6a34fb 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.expect
@@ -6,8 +6,8 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void {}
-  method g1<U extends self::C::T = dynamic>() → void {
+  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void {}
+  method g1<generic-covariant-impl U extends self::C::T = dynamic>() → void {
     this.{self::C::f}<self::C::g1::U>(1.5);
   }
 }
diff --git a/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.transformed.expect
index b8aa4df..f6a34fb 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.transformed.expect
@@ -6,8 +6,8 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void {}
-  method g1<U extends self::C::T = dynamic>() → void {
+  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void {}
+  method g1<generic-covariant-impl U extends self::C::T = dynamic>() → void {
     this.{self::C::f}<self::C::g1::U>(1.5);
   }
 }
diff --git a/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect b/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
index 6a94b0f..9f98ab1 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
@@ -5,9 +5,9 @@
 class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     ;
-  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void
+  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void
     ;
-  method g1<U extends self::C::T = dynamic>() → void
+  method g1<generic-covariant-impl U extends self::C::T = dynamic>() → void
     ;
 }
 static method g2(self::C<core::Object> c) → void
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter.dart b/front_end/testcases/runtime_checks/covariant_generic_parameter.dart
index f263624..d5cfa14 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter.dart
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C<T> {
-  void f(T /*@covariance=genericImpl*/ x) {}
+  void f(T x) {}
 }
 
 void g1(C<num> c) {
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.expect
index 11fed34..35df363 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f(self::C::T x) → void {}
+  method f(generic-covariant-impl self::C::T x) → void {}
 }
 static method g1(self::C<core::num> c) → void {
   c.f(1.5);
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.transformed.expect
index 11fed34..35df363 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f(self::C::T x) → void {}
+  method f(generic-covariant-impl self::C::T x) → void {}
 }
 static method g1(self::C<core::num> c) → void {
   c.f(1.5);
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect
index af07f90..755eea6 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect
@@ -5,7 +5,7 @@
 class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     ;
-  method f(self::C::T x) → void
+  method f(generic-covariant-impl self::C::T x) → void
     ;
 }
 static method g1(self::C<core::num> c) → void
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart b/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart
index f8341a0..6cb0061 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart
@@ -7,13 +7,13 @@
 
 class C<T> {
   // List<T> is covariant in T so it needs checking
-  void f1(List<T> /*@covariance=genericImpl*/ x) {}
+  void f1(List<T> x) {}
 
   // () -> T is covariant in T so it needs checking
-  void f2(T /*@covariance=genericImpl*/ callback()) {}
+  void f2(T callback()) {}
 
   // (T) -> T is partially covariant in T so it needs checking
-  void f3(T /*@covariance=genericImpl*/ callback(T x)) {}
+  void f3(T callback(T x)) {}
 
   // (T) -> void is contravariant in T so it doesn't need checking
   void f4(void callback(T x)) {}
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.expect
index 072d922..d0cf71d 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.expect
@@ -6,9 +6,9 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f1(core::List<self::C::T> x) → void {}
-  method f2(() → self::C::T callback) → void {}
-  method f3((self::C::T) → self::C::T callback) → void {}
+  method f1(generic-covariant-impl core::List<self::C::T> x) → void {}
+  method f2(generic-covariant-impl () → self::C::T callback) → void {}
+  method f3(generic-covariant-impl (self::C::T) → self::C::T callback) → void {}
   method f4((self::C::T) → void callback) → void {}
 }
 static method g1(self::C<core::num> c, core::List<core::num> l) → void {
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.transformed.expect
index 072d922..d0cf71d 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.transformed.expect
@@ -6,9 +6,9 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f1(core::List<self::C::T> x) → void {}
-  method f2(() → self::C::T callback) → void {}
-  method f3((self::C::T) → self::C::T callback) → void {}
+  method f1(generic-covariant-impl core::List<self::C::T> x) → void {}
+  method f2(generic-covariant-impl () → self::C::T callback) → void {}
+  method f3(generic-covariant-impl (self::C::T) → self::C::T callback) → void {}
   method f4((self::C::T) → void callback) → void {}
 }
 static method g1(self::C<core::num> c, core::List<core::num> l) → void {
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect
index 831387d..49d3ebd 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect
@@ -5,11 +5,11 @@
 class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     ;
-  method f1(core::List<self::C::T> x) → void
+  method f1(generic-covariant-impl core::List<self::C::T> x) → void
     ;
-  method f2(() → self::C::T callback) → void
+  method f2(generic-covariant-impl () → self::C::T callback) → void
     ;
-  method f3((self::C::T) → self::C::T callback) → void
+  method f3(generic-covariant-impl (self::C::T) → self::C::T callback) → void
     ;
   method f4((self::C::T) → void callback) → void
     ;
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart
index 67ebc4d..3ec2d07 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart
@@ -6,20 +6,18 @@
 library test;
 
 abstract class I<T> {
-  void f1(T /*@covariance=genericImpl*/ x);
-  void f2(T /*@covariance=genericImpl*/ x);
+  void f1(T x);
+  void f2(T x);
 }
 
 class C<U> implements I<int> {
-  void f1(int /*@covariance=genericImpl*/ x) {}
-  void f2(int /*@covariance=genericImpl*/ x,
-      [U /*@covariance=genericImpl*/ y]) {}
+  void f1(int x) {}
+  void f2(int x, [U y]) {}
 }
 
 class D<U> extends C<U> {
-  void f1(int /*@covariance=genericImpl*/ x) {}
-  void f2(int /*@covariance=genericImpl*/ x,
-      [U /*@covariance=genericImpl*/ y]) {}
+  void f1(int x) {}
+  void f2(int x, [U y]) {}
 }
 
 void g1(C<num> c) {
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.expect
index fc22b45..96700b1 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.expect
@@ -6,22 +6,22 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f1(self::I::T x) → void;
-  abstract method f2(self::I::T x) → void;
+  abstract method f1(generic-covariant-impl self::I::T x) → void;
+  abstract method f2(generic-covariant-impl self::I::T x) → void;
 }
 class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
   synthetic constructor •() → self::C<self::C::U>
     : super core::Object::•()
     ;
   method f1(core::int x) → void {}
-  method f2(core::int x, [self::C::U y = null]) → void {}
+  method f2(core::int x, [generic-covariant-impl self::C::U y = null]) → void {}
 }
 class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
   synthetic constructor •() → self::D<self::D::U>
     : super self::C::•()
     ;
   method f1(core::int x) → void {}
-  method f2(core::int x, [self::D::U y = null]) → void {}
+  method f2(core::int x, [generic-covariant-impl self::D::U y = null]) → void {}
 }
 static method g1(self::C<core::num> c) → void {
   c.f1(1);
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.transformed.expect
index fc22b45..96700b1 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.transformed.expect
@@ -6,22 +6,22 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f1(self::I::T x) → void;
-  abstract method f2(self::I::T x) → void;
+  abstract method f1(generic-covariant-impl self::I::T x) → void;
+  abstract method f2(generic-covariant-impl self::I::T x) → void;
 }
 class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
   synthetic constructor •() → self::C<self::C::U>
     : super core::Object::•()
     ;
   method f1(core::int x) → void {}
-  method f2(core::int x, [self::C::U y = null]) → void {}
+  method f2(core::int x, [generic-covariant-impl self::C::U y = null]) → void {}
 }
 class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
   synthetic constructor •() → self::D<self::D::U>
     : super self::C::•()
     ;
   method f1(core::int x) → void {}
-  method f2(core::int x, [self::D::U y = null]) → void {}
+  method f2(core::int x, [generic-covariant-impl self::D::U y = null]) → void {}
 }
 static method g1(self::C<core::num> c) → void {
   c.f1(1);
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.outline.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.outline.expect
index a268782..fe2f698 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.outline.expect
@@ -5,15 +5,15 @@
 abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::I<self::I::T>
     ;
-  abstract method f1(self::I::T x) → void;
-  abstract method f2(self::I::T x) → void;
+  abstract method f1(generic-covariant-impl self::I::T x) → void;
+  abstract method f2(generic-covariant-impl self::I::T x) → void;
 }
 class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
   synthetic constructor •() → self::C<self::C::U>
     ;
   method f1(core::int x) → void
     ;
-  method f2(core::int x, [self::C::U y]) → void
+  method f2(core::int x, [generic-covariant-impl self::C::U y]) → void
     ;
 }
 class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
@@ -21,7 +21,7 @@
     ;
   method f1(core::int x) → void
     ;
-  method f2(core::int x, [self::D::U y]) → void
+  method f2(core::int x, [generic-covariant-impl self::D::U y]) → void
     ;
 }
 static method g1(self::C<core::num> c) → void
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart
index 064a9d2..4da2532 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart
@@ -10,16 +10,14 @@
 }
 
 abstract class I<T> {
-  void f(T /*@covariance=genericImpl*/ x);
+  void f(T x);
 }
 
 class M {
   void f(int x) {}
 }
 
-class /*@forwardingStub=void f(covariance=(genericImpl) int x)*/ C = B
-    with M
-    implements I<int>;
+class C = B with M implements I<int>;
 void g1(C c) {
   c.f(1);
 }
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.expect
index 51518db..144807a 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class M extends core::Object {
   synthetic constructor •() → self::M
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.transformed.expect
index 8fe549e..20d3a2e 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.transformed.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class M extends core::Object {
   synthetic constructor •() → self::M
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect
index c96cbc1..10f6ea9 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect
@@ -11,7 +11,7 @@
 abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::I<self::I::T>
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class M extends core::Object {
   synthetic constructor •() → self::M
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart
index 84127a1..a869fd9 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart
@@ -10,11 +10,10 @@
 }
 
 abstract class I<T> {
-  void f(T /*@covariance=genericImpl*/ x);
+  void f(T x);
 }
 
-class /*@forwardingStub=void f(covariance=(genericImpl) int x)*/ C extends B
-    implements I<int> {}
+class C extends B implements I<int> {}
 
 void g1(C c) {
   c.f(1);
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.expect
index 67ecc72..ca44867 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::int> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.transformed.expect
index 67ecc72..ca44867 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.transformed.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::int> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect
index 2c50229..ee14e2c 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect
@@ -11,7 +11,7 @@
 abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::I<self::I::T>
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::int> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart
index ea42a43..8208926 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart
@@ -10,14 +10,12 @@
 }
 
 abstract class I<T> {
-  void f(T /*@covariance=genericImpl*/ x);
+  void f(T x);
 }
 
 class M {}
 
-class /*@forwardingStub=void f(covariance=(genericImpl) int x)*/ C = B
-    with M
-    implements I<int>;
+class C = B with M implements I<int>;
 void g1(C c) {
   c.f(1);
 }
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.expect
index fff4959..45abbbf 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class M extends core::Object {
   synthetic constructor •() → self::M
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.transformed.expect
index aca4225..0e61a92 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.transformed.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class M extends core::Object {
   synthetic constructor •() → self::M
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect
index 171a55f..926b281 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect
@@ -11,7 +11,7 @@
 abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::I<self::I::T>
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class M extends core::Object {
   synthetic constructor •() → self::M
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart b/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart
index 260dabe..8261613 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart
@@ -10,8 +10,8 @@
 typedef U G<T, U>(T x);
 
 class C<T> {
-  void f1(T /*@covariance=genericImpl*/ x) {}
-  T f2(List<T> /*@covariance=genericImpl*/ x) => x.first;
+  void f1(T x) {}
+  T f2(List<T> x) => x.first;
 }
 
 F<num> g1(C<num> c) {
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.expect
index cb4340c..173ea04 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.expect
@@ -8,8 +8,8 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f1(self::C::T x) → void {}
-  method f2(core::List<self::C::T> x) → self::C::T
+  method f1(generic-covariant-impl self::C::T x) → void {}
+  method f2(generic-covariant-impl core::List<self::C::T> x) → self::C::T
     return x.first;
 }
 static method g1(self::C<core::num> c) → (core::num) → void {
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.transformed.expect
index cb4340c..173ea04 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.transformed.expect
@@ -8,8 +8,8 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f1(self::C::T x) → void {}
-  method f2(core::List<self::C::T> x) → self::C::T
+  method f1(generic-covariant-impl self::C::T x) → void {}
+  method f2(generic-covariant-impl core::List<self::C::T> x) → self::C::T
     return x.first;
 }
 static method g1(self::C<core::num> c) → (core::num) → void {
diff --git a/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect b/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect
index d426ddb..3983048 100644
--- a/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect
@@ -7,9 +7,9 @@
 class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     ;
-  method f1(self::C::T x) → void
+  method f1(generic-covariant-impl self::C::T x) → void
     ;
-  method f2(core::List<self::C::T> x) → self::C::T
+  method f2(generic-covariant-impl core::List<self::C::T> x) → self::C::T
     ;
 }
 static method g1(self::C<core::num> c) → (core::num) → void
diff --git a/front_end/testcases/runtime_checks/covariant_keyword.dart b/front_end/testcases/runtime_checks/covariant_keyword.dart
index 1c44f18..02bfdcf 100644
--- a/front_end/testcases/runtime_checks/covariant_keyword.dart
+++ b/front_end/testcases/runtime_checks/covariant_keyword.dart
@@ -12,11 +12,11 @@
 }
 
 class D extends C {
-  void f(covariant int /*@covariance=explicit*/ x) {}
+  void f(covariant int x) {}
 }
 
 class E extends D {
-  void f(int /*@covariance=explicit*/ x) {}
+  void f(int x) {}
 }
 
 void g1(C c) {
diff --git a/front_end/testcases/runtime_checks/covariant_keyword_field.dart b/front_end/testcases/runtime_checks/covariant_keyword_field.dart
index 5756611..7c7f663 100644
--- a/front_end/testcases/runtime_checks/covariant_keyword_field.dart
+++ b/front_end/testcases/runtime_checks/covariant_keyword_field.dart
@@ -10,11 +10,11 @@
 }
 
 class D implements C {
-  covariant int /*@covariance=explicit*/ x;
+  covariant int x;
 }
 
 class E implements D {
-  int /*@covariance=explicit*/ x;
+  int x;
 }
 
 main() {}
diff --git a/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart b/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart
index 9ad2404..d8f1ceb 100644
--- a/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart
+++ b/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart
@@ -10,12 +10,12 @@
 }
 
 class D implements C {
-  covariant int /*@covariance=explicit*/ x;
+  covariant int x;
 }
 
 class E implements D {
   int get x => 0;
-  void set x(int /*@covariance=explicit*/ value) {}
+  void set x(int value) {}
 }
 
 main() {}
diff --git a/front_end/testcases/runtime_checks/covariant_keyword_setter.dart b/front_end/testcases/runtime_checks/covariant_keyword_setter.dart
index 0233e91..d9b8a30 100644
--- a/front_end/testcases/runtime_checks/covariant_keyword_setter.dart
+++ b/front_end/testcases/runtime_checks/covariant_keyword_setter.dart
@@ -10,11 +10,11 @@
 }
 
 class D extends C {
-  void set x(covariant int /*@covariance=explicit*/ value) {}
+  void set x(covariant int value) {}
 }
 
 class E extends D {
-  void set x(int /*@covariance=explicit*/ value) {}
+  void set x(int value) {}
 }
 
 main() {}
diff --git a/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart b/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart
index 3594b79..21bd63d 100644
--- a/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart
+++ b/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart
@@ -10,11 +10,11 @@
 }
 
 class D extends C {
-  void set x(covariant int /*@covariance=explicit*/ value) {}
+  void set x(covariant int value) {}
 }
 
 class E implements D {
-  int /*@covariance=explicit*/ x;
+  int x;
 }
 
 main() {}
diff --git a/front_end/testcases/runtime_checks/covariant_setter.dart b/front_end/testcases/runtime_checks/covariant_setter.dart
index fc2b4f1..029caad 100644
--- a/front_end/testcases/runtime_checks/covariant_setter.dart
+++ b/front_end/testcases/runtime_checks/covariant_setter.dart
@@ -8,9 +8,9 @@
 typedef void F<T>(T x);
 
 class C<T> {
-  T /*@covariance=genericImpl*/ x;
-  void set y(T /*@covariance=genericImpl*/ value) {}
-  void f(T /*@covariance=genericImpl*/ value) {
+  T x;
+  void set y(T value) {}
+  void f(T value) {
     this.x = value;
     this.y = value;
   }
diff --git a/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.expect b/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.expect
index fa9d6c9..3fb057f 100644
--- a/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.expect
@@ -4,12 +4,12 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T x = null;
+  generic-covariant-impl field self::C::T x = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  set y(self::C::T value) → void {}
-  method f(self::C::T value) → void {
+  set y(generic-covariant-impl self::C::T value) → void {}
+  method f(generic-covariant-impl self::C::T value) → void {
     this.{self::C::x} = value;
     this.{self::C::y} = value;
   }
diff --git a/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.transformed.expect
index fa9d6c9..3fb057f 100644
--- a/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.transformed.expect
@@ -4,12 +4,12 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T x = null;
+  generic-covariant-impl field self::C::T x = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  set y(self::C::T value) → void {}
-  method f(self::C::T value) → void {
+  set y(generic-covariant-impl self::C::T value) → void {}
+  method f(generic-covariant-impl self::C::T value) → void {
     this.{self::C::x} = value;
     this.{self::C::y} = value;
   }
diff --git a/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect b/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect
index edbba3a..034ccc0 100644
--- a/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect
@@ -4,12 +4,12 @@
 
 typedef F<T extends core::Object = dynamic> = (T) → void;
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T x;
+  generic-covariant-impl field self::C::T x;
   synthetic constructor •() → self::C<self::C::T>
     ;
-  set y(self::C::T value) → void
+  set y(generic-covariant-impl self::C::T value) → void
     ;
-  method f(self::C::T value) → void
+  method f(generic-covariant-impl self::C::T value) → void
     ;
 }
 static method g(self::C<core::num> c) → void
diff --git a/front_end/testcases/runtime_checks/dynamic_invocation.dart b/front_end/testcases/runtime_checks/dynamic_invocation.dart
index 279e3ba..790dff4 100644
--- a/front_end/testcases/runtime_checks/dynamic_invocation.dart
+++ b/front_end/testcases/runtime_checks/dynamic_invocation.dart
@@ -6,12 +6,12 @@
 library test;
 
 class C<T> {
-  void f1(T /*@covariance=genericImpl*/ x) {}
+  void f1(T x) {}
   void f2(int x) {}
 }
 
 class D extends C<num> {
-  void f1(covariant int /*@covariance=explicit*/ x) {}
+  void f1(covariant int x) {}
 }
 
 void g1(dynamic d) {
diff --git a/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.expect b/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.expect
index 92254e8..2efc919 100644
--- a/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f1(self::C::T x) → void {}
+  method f1(generic-covariant-impl self::C::T x) → void {}
   method f2(core::int x) → void {}
 }
 class D extends self::C<core::num> {
diff --git a/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.transformed.expect
index 92254e8..2efc919 100644
--- a/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f1(self::C::T x) → void {}
+  method f1(generic-covariant-impl self::C::T x) → void {}
   method f2(core::int x) → void {}
 }
 class D extends self::C<core::num> {
diff --git a/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect b/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect
index e6d2c0e..87b6f89 100644
--- a/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect
@@ -5,7 +5,7 @@
 class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     ;
-  method f1(self::C::T x) → void
+  method f1(generic-covariant-impl self::C::T x) → void
     ;
   method f2(core::int x) → void
     ;
diff --git a/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart b/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart
index 8f1f075..6206b0e 100644
--- a/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart
+++ b/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C<T> {
-  void f< /*@covariance=genericImpl*/ U extends T>(U x) {}
+  void f<U extends T>(U x) {}
 }
 
 void g1(dynamic d) {
diff --git a/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.expect b/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.expect
index 8fc21ae..205ca75 100644
--- a/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void {}
+  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void {}
 }
 static method g1(dynamic d) → void {
   d.f<core::num>(1.5);
diff --git a/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.transformed.expect
index 8fc21ae..205ca75 100644
--- a/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void {}
+  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void {}
 }
 static method g1(dynamic d) → void {
   d.f<core::num>(1.5);
diff --git a/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect b/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
index 195a9e4..65c7be8 100644
--- a/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
@@ -5,7 +5,7 @@
 class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     ;
-  method f<U extends self::C::T = dynamic>(self::C::f::U x) → void
+  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void
     ;
 }
 static method g1(dynamic d) → void
diff --git a/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart b/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart
index 554eeae..065bd4e 100644
--- a/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart
+++ b/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart
@@ -6,14 +6,13 @@
 library test;
 
 class B<T> {
-  T /*@covariance=genericImpl*/ x;
+  T x;
 }
 
 class C {
   num x;
 }
 
-class /*@forwardingStub=void set x(covariance=(genericImpl) num _)*/ D extends C
-    implements B<num> {}
+class D extends C implements B<num> {}
 
 void main() {}
diff --git a/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.expect b/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.expect
index 7f689fb..084024b 100644
--- a/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::B::T x = null;
+  generic-covariant-impl field self::B::T x = null;
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.transformed.expect
index 7f689fb..084024b 100644
--- a/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::B::T x = null;
+  generic-covariant-impl field self::B::T x = null;
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect b/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
index e67be67..d696974 100644
--- a/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::B::T x;
+  generic-covariant-impl field self::B::T x;
   synthetic constructor •() → self::B<self::B::T>
     ;
 }
diff --git a/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart b/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart
index b8607ea..816a396 100644
--- a/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart
+++ b/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart
@@ -23,14 +23,11 @@
 }
 
 abstract class I<T> {
-  void f([T /*@covariance=genericImpl*/ x]);
-  void g({T /*@covariance=genericImpl*/ x});
+  void f([T x]);
+  void g({T x});
 }
 
-class
-/*@forwardingStub=void f([covariance=(genericImpl) num x])*/
-/*@forwardingStub=void g({covariance=(genericImpl) num x})*/
-    C extends B implements I<num> {}
+class C extends B implements I<num> {}
 
 main() {
   C c = new C();
diff --git a/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.expect b/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.expect
index 01f712b..82a32ab 100644
--- a/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.expect
@@ -23,8 +23,8 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f([self::I::T x = null]) → void;
-  abstract method g({self::I::T x = null}) → void;
+  abstract method f([generic-covariant-impl self::I::T x = null]) → void;
+  abstract method g({generic-covariant-impl self::I::T x = null}) → void;
 }
 class C extends self::B implements self::I<core::num> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.transformed.expect
index 01f712b..82a32ab 100644
--- a/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.transformed.expect
@@ -23,8 +23,8 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f([self::I::T x = null]) → void;
-  abstract method g({self::I::T x = null}) → void;
+  abstract method f([generic-covariant-impl self::I::T x = null]) → void;
+  abstract method g({generic-covariant-impl self::I::T x = null}) → void;
 }
 class C extends self::B implements self::I<core::num> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect b/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect
index 596728c..5998e7f 100644
--- a/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect
@@ -16,8 +16,8 @@
 abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::I<self::I::T>
     ;
-  abstract method f([self::I::T x]) → void;
-  abstract method g({self::I::T x}) → void;
+  abstract method f([generic-covariant-impl self::I::T x]) → void;
+  abstract method g({generic-covariant-impl self::I::T x}) → void;
 }
 class C extends self::B implements self::I<core::num> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart b/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart
index 2b22cac..2cd0b19 100644
--- a/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart
+++ b/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart
@@ -10,10 +10,9 @@
 }
 
 abstract class I<T> {
-  void f(T /*@covariance=genericImpl*/ x, int y);
+  void f(T x, int y);
 }
 
-class /*@forwardingStub=void f(covariance=(genericImpl) int x, covariance=() int y)*/ C
-    extends B implements I<int> {}
+class C extends B implements I<int> {}
 
 void main() {}
diff --git a/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.expect b/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.expect
index 049bff0..5486a15 100644
--- a/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x, core::int y) → void;
+  abstract method f(generic-covariant-impl self::I::T x, core::int y) → void;
 }
 class C extends self::B implements self::I<core::int> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.transformed.expect
index 049bff0..5486a15 100644
--- a/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.transformed.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x, core::int y) → void;
+  abstract method f(generic-covariant-impl self::I::T x, core::int y) → void;
 }
 class C extends self::B implements self::I<core::int> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.outline.expect b/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.outline.expect
index e33d959..a0b2b04 100644
--- a/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.outline.expect
@@ -11,7 +11,7 @@
 abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::I<self::I::T>
     ;
-  abstract method f(self::I::T x, core::int y) → void;
+  abstract method f(generic-covariant-impl self::I::T x, core::int y) → void;
 }
 class C extends self::B implements self::I<core::int> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart b/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart
index b144c81..d9f6ffd 100644
--- a/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart
+++ b/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart
@@ -6,19 +6,19 @@
 library test;
 
 class C<T> {
-  void set x(T /*@covariance=genericImpl*/ t) {}
-  T /*@covariance=genericImpl*/ y;
+  void set x(T t) {}
+  T y;
 }
 
 class D implements C<num> {
-  num /*@covariance=genericImpl*/ x;
-  num /*@covariance=genericImpl*/ y;
+  num x;
+  num y;
 }
 
 class E implements C<num> {
-  void set x(num /*@covariance=genericImpl*/ t) {}
+  void set x(num t) {}
   num get y => null;
-  void set y(num /*@covariance=genericImpl*/ t) {}
+  void set y(num t) {}
 }
 
 void main() {}
diff --git a/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.expect b/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.expect
index 8874ff3..121a90b 100644
--- a/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T y = null;
+  generic-covariant-impl field self::C::T y = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  set x(self::C::T t) → void {}
+  set x(generic-covariant-impl self::C::T t) → void {}
 }
 class D extends core::Object implements self::C<core::num> {
   field core::num x = null;
diff --git a/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.transformed.expect
index 8874ff3..121a90b 100644
--- a/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T y = null;
+  generic-covariant-impl field self::C::T y = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  set x(self::C::T t) → void {}
+  set x(generic-covariant-impl self::C::T t) → void {}
 }
 class D extends core::Object implements self::C<core::num> {
   field core::num x = null;
diff --git a/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect b/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect
index f6ab6e3..bf98c8f 100644
--- a/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C::T y;
+  generic-covariant-impl field self::C::T y;
   synthetic constructor •() → self::C<self::C::T>
     ;
-  set x(self::C::T t) → void
+  set x(generic-covariant-impl self::C::T t) → void
     ;
 }
 class D extends core::Object implements self::C<core::num> {
diff --git a/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart b/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart
index 6558f2d..54358a5 100644
--- a/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart
+++ b/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart
@@ -6,17 +6,17 @@
 library test;
 
 abstract class A {
-  void set x(covariant Object /*@covariance=explicit*/ value);
+  void set x(covariant Object value);
 }
 
 class B implements A {
-  void f(covariant Object /*@covariance=explicit*/ x) {}
-  Object /*@covariance=explicit*/ x; // covariant
+  void f(covariant Object x) {}
+  Object x; // covariant
 }
 
 class C<T> implements B {
-  void f(T /*@covariance=explicit*/ x) {}
-  T /*@covariance=explicit*/ x;
+  void f(T x) {}
+  T x;
 }
 
 main() {}
diff --git a/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.expect b/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.expect
index 943bf76..fc559f4 100644
--- a/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.expect
@@ -16,10 +16,10 @@
   method f(covariant core::Object x) → void {}
 }
 class C<T extends core::Object = dynamic> extends core::Object implements self::B {
-  field self::C::T x = null;
+  generic-covariant-impl field self::C::T x = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f(self::C::T x) → void {}
+  method f(generic-covariant-impl self::C::T x) → void {}
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.transformed.expect
index 943bf76..fc559f4 100644
--- a/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.transformed.expect
@@ -16,10 +16,10 @@
   method f(covariant core::Object x) → void {}
 }
 class C<T extends core::Object = dynamic> extends core::Object implements self::B {
-  field self::C::T x = null;
+  generic-covariant-impl field self::C::T x = null;
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f(self::C::T x) → void {}
+  method f(generic-covariant-impl self::C::T x) → void {}
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect b/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect
index 89789e5..4ed0cca 100644
--- a/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect
+++ b/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect
@@ -15,10 +15,10 @@
     ;
 }
 class C<T extends core::Object = dynamic> extends core::Object implements self::B {
-  field self::C::T x;
+  generic-covariant-impl field self::C::T x;
   synthetic constructor •() → self::C<self::C::T>
     ;
-  method f(self::C::T x) → void
+  method f(generic-covariant-impl self::C::T x) → void
     ;
 }
 static method main() → dynamic
diff --git a/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart b/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart
index ce4aebd..4b4ea07 100644
--- a/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart
+++ b/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart
@@ -10,11 +10,11 @@
 }
 
 abstract class I<T> {
-  void f(T /*@covariance=genericImpl*/ x);
+  void f(T x);
 }
 
 class C extends B implements I<num> {
-  void /*@forwardingStub=semi-stub*/ f(num /*@covariance=genericImpl*/ x);
+  void /*@forwardingStub=semi-stub*/ f(num x);
 }
 
 main() {}
diff --git a/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.expect b/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.expect
index aea0463..95fdf8b 100644
--- a/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::num> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.transformed.expect
index aea0463..95fdf8b 100644
--- a/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.transformed.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::num> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect b/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect
index 8a400cf..8b7ff11 100644
--- a/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect
@@ -11,7 +11,7 @@
 abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::I<self::I::T>
     ;
-  abstract method f(self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T x) → void;
 }
 class C extends self::B implements self::I<core::num> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks_new/call_through_this.dart b/front_end/testcases/runtime_checks_new/call_through_this.dart
index 9cc0c47..fa5945b 100644
--- a/front_end/testcases/runtime_checks_new/call_through_this.dart
+++ b/front_end/testcases/runtime_checks_new/call_through_this.dart
@@ -8,16 +8,16 @@
 typedef F<T>(T x);
 
 class C<T> {
-  void f(T /*@covariance=genericImpl*/ x) {}
-  void g1(T /*@covariance=genericImpl*/ x) {
+  void f(T x) {}
+  void g1(T x) {
     this.f(x);
   }
 
-  void g2(T /*@covariance=genericImpl*/ x) {
+  void g2(T x) {
     f(x);
   }
 
-  void g3(C<T> /*@covariance=genericImpl*/ c, T /*@covariance=genericImpl*/ x) {
+  void g3(C<T> c, T x) {
     c.f(x);
   }
 
@@ -27,7 +27,7 @@
 class D extends C<int> {}
 
 class E extends C<num> {
-  void f(covariant int /*@covariance=explicit*/ x) {}
+  void f(covariant int x) {}
 }
 
 test() {
diff --git a/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.expect b/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.expect
index f02f1bc..f9eaac1 100644
--- a/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.expect
@@ -7,14 +7,14 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f(self::C::T x) → void {}
-  method g1(self::C::T x) → void {
+  method f(generic-covariant-impl self::C::T x) → void {}
+  method g1(generic-covariant-impl self::C::T x) → void {
     this.{self::C::f}(x);
   }
-  method g2(self::C::T x) → void {
+  method g2(generic-covariant-impl self::C::T x) → void {
     this.{self::C::f}(x);
   }
-  method g3(self::C<self::C::T> c, self::C::T x) → void {
+  method g3(generic-covariant-impl self::C<self::C::T> c, generic-covariant-impl self::C::T x) → void {
     c.f(x);
   }
   method g4() → (self::C::T) → dynamic
diff --git a/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.transformed.expect
index f02f1bc..f9eaac1 100644
--- a/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.transformed.expect
@@ -7,14 +7,14 @@
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
-  method f(self::C::T x) → void {}
-  method g1(self::C::T x) → void {
+  method f(generic-covariant-impl self::C::T x) → void {}
+  method g1(generic-covariant-impl self::C::T x) → void {
     this.{self::C::f}(x);
   }
-  method g2(self::C::T x) → void {
+  method g2(generic-covariant-impl self::C::T x) → void {
     this.{self::C::f}(x);
   }
-  method g3(self::C<self::C::T> c, self::C::T x) → void {
+  method g3(generic-covariant-impl self::C<self::C::T> c, generic-covariant-impl self::C::T x) → void {
     c.f(x);
   }
   method g4() → (self::C::T) → dynamic
diff --git a/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect b/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect
index 5b69334..0c9d1ca 100644
--- a/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect
@@ -6,13 +6,13 @@
 class C<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     ;
-  method f(self::C::T x) → void
+  method f(generic-covariant-impl self::C::T x) → void
     ;
-  method g1(self::C::T x) → void
+  method g1(generic-covariant-impl self::C::T x) → void
     ;
-  method g2(self::C::T x) → void
+  method g2(generic-covariant-impl self::C::T x) → void
     ;
-  method g3(self::C<self::C::T> c, self::C::T x) → void
+  method g3(generic-covariant-impl self::C<self::C::T> c, generic-covariant-impl self::C::T x) → void
     ;
   method g4() → (self::C::T) → dynamic
     ;
diff --git a/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart b/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart
index c88d47a..0aeccbf 100644
--- a/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart
+++ b/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart
@@ -8,7 +8,7 @@
 typedef void F<T>(T x);
 
 class B<T> {
-  B<T> operator +(B<T> /*@covariance=genericImpl*/ other) => null;
+  B<T> operator +(B<T> other) => null;
 }
 
 class C<T> {
diff --git a/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.expect b/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.expect
index 89d07f9..5b0622b 100644
--- a/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  operator +(self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
diff --git a/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.transformed.expect
index 89d07f9..5b0622b 100644
--- a/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.transformed.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  operator +(self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
diff --git a/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect b/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect
index c30ef22..2df9ad8 100644
--- a/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect
@@ -6,7 +6,7 @@
 class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T>
     ;
-  operator +(self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
     ;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
diff --git a/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart b/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart
index 47d0002..ea53d03 100644
--- a/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart
+++ b/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart
@@ -8,7 +8,7 @@
 typedef void F<T>(T x);
 
 class B<T> {
-  B<T> operator +(B<T> /*@covariance=genericImpl*/ other) => null;
+  B<T> operator +(B<T> other) => null;
 }
 
 class C<T> {
diff --git a/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.expect b/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.expect
index e7781b1..3345c98 100644
--- a/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  operator +(self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
diff --git a/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.transformed.expect
index e7781b1..3345c98 100644
--- a/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.transformed.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  operator +(self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
     return null;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
diff --git a/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect b/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect
index 5e2e915..bb5426d 100644
--- a/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect
@@ -6,7 +6,7 @@
 class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T>
     ;
-  operator +(self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
     ;
 }
 class C<T extends core::Object = dynamic> extends core::Object {
diff --git a/front_end/testcases/runtime_checks_new/derived_class_typed.dart b/front_end/testcases/runtime_checks_new/derived_class_typed.dart
index 0c73221..5d2400e 100644
--- a/front_end/testcases/runtime_checks_new/derived_class_typed.dart
+++ b/front_end/testcases/runtime_checks_new/derived_class_typed.dart
@@ -6,9 +6,9 @@
 library test;
 
 class B<T> {
-  void f(T /*@covariance=genericImpl*/ x) {}
-  void g({T /*@covariance=genericImpl*/ x}) {}
-  void h< /*@covariance=genericImpl*/ U extends T>() {}
+  void f(T x) {}
+  void g({T x}) {}
+  void h<U extends T>() {}
 }
 
 class C extends B<int> {}
diff --git a/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.expect b/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.expect
index 1fe58ed..9addeea 100644
--- a/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.expect
@@ -6,9 +6,9 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  method f(self::B::T x) → void {}
-  method g({self::B::T x = null}) → void {}
-  method h<U extends self::B::T = dynamic>() → void {}
+  method f(generic-covariant-impl self::B::T x) → void {}
+  method g({generic-covariant-impl self::B::T x = null}) → void {}
+  method h<generic-covariant-impl U extends self::B::T = dynamic>() → void {}
 }
 class C extends self::B<core::int> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.transformed.expect
index 1fe58ed..9addeea 100644
--- a/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.transformed.expect
@@ -6,9 +6,9 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  method f(self::B::T x) → void {}
-  method g({self::B::T x = null}) → void {}
-  method h<U extends self::B::T = dynamic>() → void {}
+  method f(generic-covariant-impl self::B::T x) → void {}
+  method g({generic-covariant-impl self::B::T x = null}) → void {}
+  method h<generic-covariant-impl U extends self::B::T = dynamic>() → void {}
 }
 class C extends self::B<core::int> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect b/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
index b4ae0e0..88a2113 100644
--- a/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
@@ -5,11 +5,11 @@
 class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T>
     ;
-  method f(self::B::T x) → void
+  method f(generic-covariant-impl self::B::T x) → void
     ;
-  method g({self::B::T x}) → void
+  method g({generic-covariant-impl self::B::T x}) → void
     ;
-  method h<U extends self::B::T = dynamic>() → void
+  method h<generic-covariant-impl U extends self::B::T = dynamic>() → void
     ;
 }
 class C extends self::B<core::int> {
diff --git a/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart b/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart
index 7b9e86e..e454c40 100644
--- a/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart
+++ b/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart
@@ -6,7 +6,7 @@
 library test;
 
 class B<T> {
-  T /*@covariance=genericImpl*/ x;
+  T x;
 }
 
 class C extends B<num> {}
diff --git a/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.expect b/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.expect
index 052b5bf..ff86372 100644
--- a/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::B::T x = null;
+  generic-covariant-impl field self::B::T x = null;
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.transformed.expect
index 052b5bf..ff86372 100644
--- a/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::B::T x = null;
+  generic-covariant-impl field self::B::T x = null;
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect b/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect
index 9318356..8403e2a 100644
--- a/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::B::T x;
+  generic-covariant-impl field self::B::T x;
   synthetic constructor •() → self::B<self::B::T>
     ;
 }
diff --git a/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart b/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart
index 5f52760..aa86636 100644
--- a/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart
+++ b/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart
@@ -6,14 +6,13 @@
 library test;
 
 class B {
-  covariant num /*@covariance=explicit*/ x;
+  covariant num x;
 }
 
 class C {
   int x;
 }
 
-class /*@forwardingStub=void set x(covariance=(explicit) num _)*/ D extends C
-    implements B {}
+class D extends C implements B {}
 
 void main() {}
diff --git a/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart b/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart
index 1df42eb..72eae8b 100644
--- a/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart
+++ b/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart
@@ -6,25 +6,25 @@
 library test;
 
 class B<T> {
-  T /*@covariance=genericImpl*/ x;
-  T /*@covariance=genericImpl*/ y;
+  T x;
+  T y;
 }
 
 // This class inherits genericImpl annotations from its superclass, but doesn't
 // have any members marked genericInterface because the inferred types of x and
 // y do not depend on the type parameter T.
 abstract class C<T> implements B<num> {
-  var /*@covariance=genericImpl*/ x;
+  var x;
   get y;
-  set y(/*@covariance=genericImpl*/ value);
+  set y(value);
 }
 
 // This class also has members marked genericInterface, since the inferred types
 // of x and y *do* depend on the type parameter T.
 abstract class D<T> implements B<T> {
-  var /*@covariance=genericImpl*/ x;
+  var x;
   get y;
-  set y(/*@covariance=genericImpl*/ value);
+  set y(value);
 }
 
 main() {}
diff --git a/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.expect b/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.expect
index 29d74ce..a959413 100644
--- a/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::B::T x = null;
-  field self::B::T y = null;
+  generic-covariant-impl field self::B::T x = null;
+  generic-covariant-impl field self::B::T y = null;
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.transformed.expect
index 29d74ce..a959413 100644
--- a/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::B::T x = null;
-  field self::B::T y = null;
+  generic-covariant-impl field self::B::T x = null;
+  generic-covariant-impl field self::B::T y = null;
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
diff --git a/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect b/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
index e9bcb8a..60525b9 100644
--- a/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class B<T extends core::Object = dynamic> extends core::Object {
-  field self::B::T x;
-  field self::B::T y;
+  generic-covariant-impl field self::B::T x;
+  generic-covariant-impl field self::B::T y;
   synthetic constructor •() → self::B<self::B::T>
     ;
 }
diff --git a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart
index f38c741..261d869 100644
--- a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart
+++ b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart
@@ -38,9 +38,9 @@
 
 abstract class I<T> {
   T get x;
-  void set x(T /*@covariance=genericImpl*/ value);
+  void set x(T value);
   Object get y;
-  void set y(covariant Object /*@covariance=explicit*/ value);
+  void set y(covariant Object value);
 }
 
 class M {
@@ -48,10 +48,7 @@
   int y;
 }
 
-class
-/*@forwardingStub=void set y(covariance=(explicit) Object value)*/
-/*@forwardingStub=void set x(covariance=(genericImpl) int _)*/
-    C = B with M implements I<int>;
+class C = B with M implements I<int>;
 
 void test(I<Object> i) {
   expectTypeError(() {
diff --git a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
index 2c1118b..4978034 100644
--- a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
@@ -18,7 +18,7 @@
   synthetic constructor •() → self::I<self::I::T>
     ;
   abstract get x() → self::I::T;
-  abstract set x(self::I::T value) → void;
+  abstract set x(generic-covariant-impl self::I::T value) → void;
   abstract get y() → core::Object;
   abstract set y(covariant core::Object value) → void;
 }
diff --git a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
index 5fceebe..79e85ab 100644
--- a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
+++ b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
@@ -8,11 +8,11 @@
 //   int y;
 //       ^
 // pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:43:12: Context: This is the overridden method ('y').
-//   void set y(covariant Object /*@covariance=explicit*/ value);
+//   void set y(covariant Object value);
 //            ^
-// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:54:5: Context: Override was introduced in the mixin application class 'C'.
-//     C = B with M implements I<int>;
-//     ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:51:7: Context: Override was introduced in the mixin application class 'C'.
+// class C = B with M implements I<int>;
+//       ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart
index 8eeb4d8..574153f 100644
--- a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart
+++ b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart
@@ -38,9 +38,9 @@
 
 abstract class I<T> {
   T get x;
-  void set x(T /*@covariance=genericImpl*/ value);
+  void set x(T value);
   Object get y;
-  void set y(covariant Object /*@covariance=explicit*/ value);
+  void set y(covariant Object value);
 }
 
 class M {
@@ -55,10 +55,7 @@
   }
 }
 
-class
-/*@forwardingStub=void set y(covariance=(explicit) Object value)*/
-/*@forwardingStub=void set x(covariance=(genericImpl) int value)*/
-    C = B with M implements I<int>;
+class C = B with M implements I<int>;
 
 void test(I<Object> i) {
   expectTypeError(() {
diff --git a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
index 4195710..4b6371a 100644
--- a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
@@ -18,7 +18,7 @@
   synthetic constructor •() → self::I<self::I::T>
     ;
   abstract get x() → self::I::T;
-  abstract set x(self::I::T value) → void;
+  abstract set x(generic-covariant-impl self::I::T value) → void;
   abstract get y() → core::Object;
   abstract set y(covariant core::Object value) → void;
 }
diff --git a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
index 5a1fc12..693230f 100644
--- a/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
+++ b/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
@@ -8,11 +8,11 @@
 //   void set y(int value) {
 //                  ^
 // pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:43:12: Context: This is the overridden method ('y').
-//   void set y(covariant Object /*@covariance=explicit*/ value);
+//   void set y(covariant Object value);
 //            ^
-// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:61:5: Context: Override was introduced in the mixin application class 'C'.
-//     C = B with M implements I<int>;
-//     ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:58:7: Context: Override was introduced in the mixin application class 'C'.
+// class C = B with M implements I<int>;
+//       ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart b/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart
index 0a8e34b..a4fc889 100644
--- a/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart
+++ b/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart
@@ -26,7 +26,7 @@
 }
 
 abstract class I {
-  int f(covariant Object /*@covariance=explicit*/ x);
+  int f(covariant Object x);
 }
 
 // Not a compile time error, because B.f satisfies the interface contract of I.f
@@ -35,8 +35,7 @@
 // Note that even though the forwarding stub's type is `(Object) -> int`, it
 // must check that `x` is an `int`, since it forwards to a method whose type is
 // `(int) -> int`.
-class /*@forwardingStub=int f(covariance=(explicit) Object x)*/ C extends B
-    implements I {}
+class C extends B implements I {}
 
 void g(C c) {
   // Not a compile time error, because C's interface inherits I.f (since it has
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart b/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart
index 4c3139d..fc4ec48 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart
@@ -15,8 +15,6 @@
   T f(Object x);
 }
 
-abstract class
-/*@forwardingStub=abstract (C::T) -> void f(covariance=() Object x)*/
-    C<T> extends B<F<T>> implements I<F<T>> {}
+abstract class C<T> extends B<F<T>> implements I<F<T>> {}
 
 void main() {}
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart
index ff360dc..bf9a66b 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart
@@ -15,8 +15,6 @@
   void f(F<T> x, Object y);
 }
 
-abstract class
-/*@forwardingStub=void f(covariance=(genericImpl) ((C::T) -> void) -> void x, covariance=() Object y)*/
-    C<T> extends B<F<T>> implements I<F<T>> {}
+abstract class C<T> extends B<F<T>> implements I<F<T>> {}
 
 void main() {}
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart
index dc1766a..ef67155 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart
@@ -10,11 +10,9 @@
 }
 
 abstract class I<T> {
-  void f(T /*@covariance=genericImpl*/ x, Object y);
+  void f(T x, Object y);
 }
 
-abstract class
-/*@forwardingStub=void f(covariance=(genericImpl) int x, covariance=() Object y)*/
-    C extends B implements I<int> {}
+abstract class C extends B implements I<int> {}
 
 void main() {}
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.expect b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.expect
index 083d277..3334045 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x, core::Object y) → void;
+  abstract method f(generic-covariant-impl self::I::T x, core::Object y) → void;
 }
 abstract class C extends self::B implements self::I<core::int> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.transformed.expect
index 083d277..3334045 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.transformed.expect
@@ -12,7 +12,7 @@
   synthetic constructor •() → self::I<self::I::T>
     : super core::Object::•()
     ;
-  abstract method f(self::I::T x, core::Object y) → void;
+  abstract method f(generic-covariant-impl self::I::T x, core::Object y) → void;
 }
 abstract class C extends self::B implements self::I<core::int> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect
index 2fd12fe..205776d 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect
@@ -11,7 +11,7 @@
 abstract class I<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::I<self::I::T>
     ;
-  abstract method f(self::I::T x, core::Object y) → void;
+  abstract method f(generic-covariant-impl self::I::T x, core::Object y) → void;
 }
 abstract class C extends self::B implements self::I<core::int> {
   synthetic constructor •() → self::C
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart
index 6c7a38e..4d1e82d 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart
@@ -6,15 +6,13 @@
 library test;
 
 class B<T> {
-  void f(T /*@covariance=genericImpl*/ x, int y) {}
+  void f(T x, int y) {}
 }
 
 abstract class I {
   void f(int x, Object y);
 }
 
-abstract class
-/*@forwardingStub=abstract void f(covariance=(genericImpl) int x, covariance=() Object y)*/
-    C extends B<int> implements I {}
+abstract class C extends B<int> implements I {}
 
 void main() {}
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.expect b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.expect
index c6e865f..3038f0e 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  method f(self::B::T x, core::int y) → void {}
+  method f(generic-covariant-impl self::B::T x, core::int y) → void {}
 }
 abstract class I extends core::Object {
   synthetic constructor •() → self::I
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.transformed.expect
index c6e865f..3038f0e 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::B<self::B::T>
     : super core::Object::•()
     ;
-  method f(self::B::T x, core::int y) → void {}
+  method f(generic-covariant-impl self::B::T x, core::int y) → void {}
 }
 abstract class I extends core::Object {
   synthetic constructor •() → self::I
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect
index a447e02..9e7de41 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect
@@ -5,7 +5,7 @@
 class B<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T>
     ;
-  method f(self::B::T x, core::int y) → void
+  method f(generic-covariant-impl self::B::T x, core::int y) → void
     ;
 }
 abstract class I extends core::Object {
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart
index 4b5e2b0..3b2bac1 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart
@@ -8,19 +8,17 @@
 typedef void F<T>(T t);
 
 abstract class A<T> {
-  void f(T /*@covariance=genericImpl*/ x, int y);
+  void f(T x, int y);
 }
 
 class B<T> implements A<F<T>> {
-  void f(F<T> /*@covariance=genericImpl*/ x, int y) {}
+  void f(F<T> x, int y) {}
 }
 
 abstract class I<T> implements A<F<T>> {
-  void f(F<T> /*@covariance=genericImpl*/ x, Object y);
+  void f(F<T> x, Object y);
 }
 
-abstract class
-/*@forwardingStub=abstract void f(covariance=(genericImpl) ((C::T) -> void) -> void x, covariance=() Object y)*/
-    C<T> extends B<F<T>> implements I<F<T>> {}
+abstract class C<T> extends B<F<T>> implements I<F<T>> {}
 
 void main() {}
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.expect b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.expect
index 8455164..df1249c 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.expect
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
-  abstract method f(self::A::T x, core::int y) → void;
+  abstract method f(generic-covariant-impl self::A::T x, core::int y) → void;
 }
 class B<T extends core::Object = dynamic> extends core::Object implements self::A<(self::B::T) → void> {
   synthetic constructor •() → self::B<self::B::T>
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.transformed.expect b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.transformed.expect
index 8455164..df1249c 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.transformed.expect
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.transformed.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
-  abstract method f(self::A::T x, core::int y) → void;
+  abstract method f(generic-covariant-impl self::A::T x, core::int y) → void;
 }
 class B<T extends core::Object = dynamic> extends core::Object implements self::A<(self::B::T) → void> {
   synthetic constructor •() → self::B<self::B::T>
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect
index 5313aae..c638537 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.outline.expect
@@ -6,7 +6,7 @@
 abstract class A<T extends core::Object = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::T>
     ;
-  abstract method f(self::A::T x, core::int y) → void;
+  abstract method f(generic-covariant-impl self::A::T x, core::int y) → void;
 }
 class B<T extends core::Object = dynamic> extends core::Object implements self::A<(self::B::T) → void> {
   synthetic constructor •() → self::B<self::B::T>
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart b/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart
index 2de34db..57a9f99 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart
@@ -10,11 +10,9 @@
 }
 
 abstract class I {
-  void f(covariant int /*@covariance=explicit*/ x, Object y);
+  void f(covariant int x, Object y);
 }
 
-abstract class
-/*@forwardingStub=void f(covariance=(explicit) int x, covariance=() Object y)*/
-    C extends B implements I {}
+abstract class C extends B implements I {}
 
 void main() {}
diff --git a/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart b/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart
index f6e26ca..3daf251 100644
--- a/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart
+++ b/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart
@@ -6,15 +6,13 @@
 library test;
 
 class B {
-  void f(covariant int /*@covariance=explicit*/ x, int y) {}
+  void f(covariant int x, int y) {}
 }
 
 abstract class I {
   void f(int x, Object y);
 }
 
-abstract class
-/*@forwardingStub=abstract void f(covariance=(explicit) int x, covariance=() Object y)*/
-    C extends B implements I {}
+abstract class C extends B implements I {}
 
 void main() {}
diff --git a/front_end/testcases/spread_collection_inference.dart b/front_end/testcases/spread_collection_inference.dart
index 6225eca..60c1032 100644
--- a/front_end/testcases/spread_collection_inference.dart
+++ b/front_end/testcases/spread_collection_inference.dart
@@ -5,13 +5,18 @@
 // This test case checks that inference works for spread collections, and that
 // the errors are reported when necessary.
 
-/*@testedFeatures=inference,error*/
+/*@testedFeatures=inference*/
 
-foo() {
+Map<K, V> bar<K, V>() => null;
+
+foo(dynamic dynVar) {
   List<int> spread = <int>[1, 2, 3];
   Map<String, int> mapSpread = <String, int>{"foo": 4, "bar": 2};
   int notSpreadInt = 42;
   int Function() notSpreadFunction = null;
+  // Note that all values are actually ints.
+  Map<int, num> mapIntNum = <int, num>{42: 42};
+  List<num> listNum = <num>[42];
 
   var /*@type=List<dynamic>*/ lhs10 = /*@typeArgs=dynamic*/ [...
     /*@typeArgs=dynamic*/ []];
@@ -45,7 +50,7 @@
   var /*@type=Map<dynamic, dynamic>*/ map21 = /*@typeArgs=dynamic, dynamic*/
     {...(mapSpread as dynamic), "baz": 42};
 
-  dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
+  dynamic map21ambiguous = {...
     (mapSpread as dynamic)};
 
   List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
@@ -69,60 +74,60 @@
   Map<String, List<int>> map23 = /*@typeArgs=String, List<int>*/
     {... /*@typeArgs=String, List<int>*/ {"baz": /*@typeArgs=int*/ []}};
 
-  dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
+  dynamic map24ambiguous = {...
     spread, ...mapSpread};
 
-  int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
+  int lhs30 = /*@typeArgs=int*/ [...spread];
 
-  int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
+  int set30 = /*@typeArgs=int*/ {...spread, 42};
 
-  int set30ambiguous = /*@error=InvalidAssignment*/ /*@typeArgs=int*/
+  int set30ambiguous = /*@typeArgs=int*/
     {...spread};
 
-  int map30 = /*@error=InvalidAssignment*/ /*@typeArgs=String, int*/
+  int map30 = /*@typeArgs=String, int*/
     {...mapSpread, "baz": 42};
 
-  int map30ambiguous = /*@error=InvalidAssignment*/ /*@typeArgs=String, int*/
+  int map30ambiguous = /*@typeArgs=String, int*/
     {...mapSpread};
 
-  List<dynamic> lhs40 = <dynamic>[... /*@error=SpreadTypeMismatch*/
+  List<dynamic> lhs40 = <dynamic>[...
     notSpreadInt];
 
-  Set<dynamic> set40 = <dynamic>{... /*@error=SpreadTypeMismatch*/
+  Set<dynamic> set40 = <dynamic>{...
     notSpreadInt};
 
   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...
-    /*@error=SpreadMapEntryTypeMismatch*/ notSpreadInt};
+ notSpreadInt};
 
-  List<dynamic> lhs50 = <dynamic> [... /*@error=SpreadTypeMismatch*/
+  List<dynamic> lhs50 = <dynamic> [...
     notSpreadFunction];
 
-  Set<dynamic> set50 = <dynamic> {... /*@error=SpreadTypeMismatch*/
+  Set<dynamic> set50 = <dynamic> {...
     notSpreadFunction};
 
   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...
-    /*@error=SpreadMapEntryTypeMismatch*/ notSpreadFunction};
+ notSpreadFunction};
 
-  List<String> lhs60 = <String>[... /*@error=SpreadElementTypeMismatch*/
+  List<String> lhs60 = <String>[...
     spread];
 
-  Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
+  Set<String> set60 = <String>{... spread};
 
   Map<int, int> map60 = <int, int>{...
-    /*@error=SpreadMapEntryElementKeyTypeMismatch*/ mapSpread};
+ mapSpread};
 
   Map<String, String> map61 = <String, String>{...
-    /*@error=SpreadMapEntryElementValueTypeMismatch*/ mapSpread};
+ mapSpread};
 
-  List<int> lhs70 = <int>[... /*@error=NonNullAwareSpreadIsNull*/ null];
+  List<int> lhs70 = <int>[... null];
 
-  Set<int> set70 = <int>{... /*@error=NonNullAwareSpreadIsNull*/ null};
+  Set<int> set70 = <int>{... null};
 
   var /*@type=Set<dynamic>*/ set71ambiguous = /*@typeArgs=dynamic*/
-    {... /*@error=NonNullAwareSpreadIsNull*/ null, ... /*@typeArgs=dynamic*/
+    {... null, ... /*@typeArgs=dynamic*/
       []};
 
-  Map<String, int> map70 = <String, int>{... /*@error=NonNullAwareSpreadIsNull*/
+  Map<String, int> map70 = <String, int>{...
     null};
 
   List<int> lhs80 = <int>[...?null];
@@ -133,6 +138,16 @@
     {...?null, ... /*@typeArgs=dynamic*/ []};
 
   Map<String, int> map80 = <String, int>{...?null};
+
+  var /*@type=Map<String, int>*/ map90 = <String, int>{... /*@typeArgs=String, int*/ bar()};
+
+  List<int> list100 = <int>[...listNum];
+
+  Map<num, int> map100 = <num, int>{...mapIntNum};
+
+  List<int> list110 = <int>[...dynVar];
+
+  Map<num, int> map110 = <num, int>{...dynVar};
 }
 
 main() {}
diff --git a/front_end/testcases/spread_collection_inference.dart.legacy.expect b/front_end/testcases/spread_collection_inference.dart.legacy.expect
index b419aeb..4eac9e2 100644
--- a/front_end/testcases/spread_collection_inference.dart.legacy.expect
+++ b/front_end/testcases/spread_collection_inference.dart.legacy.expect
@@ -2,206 +2,230 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:16:62: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:21:62: Error: Unexpected token '...'.
 //   var /*@type=List<dynamic>*/ lhs10 = /*@typeArgs=dynamic*/ [...
 //                                                              ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:19:48: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:24:48: Error: Unexpected token '...'.
 //   var /*@type=Set<dynamic>*/ set10 = <dynamic>{... /*@typeArgs=dynamic*/ []};
 //                                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:21:66: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:26:66: Error: Unexpected token '...'.
 //   var /*@type=Map<dynamic, dynamic>*/ map10 = <dynamic, dynamic>{...
 //                                                                  ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:25:37: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:30:37: Error: Unexpected token '...'.
 //     /*@typeArgs=dynamic, dynamic*/ {...  /*@typeArgs=dynamic, dynamic*/ {}};
 //                                     ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:27:54: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:32:54: Error: Unexpected token '...'.
 //   var /*@type=List<int>*/ lhs20 = /*@typeArgs=int*/ [...spread];
 //                                                      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:29:53: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:34:53: Error: Unexpected token '...'.
 //   var /*@type=Set<int>*/ set20 = /*@typeArgs=int*/ {...spread, 42};
 //                                                     ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:31:62: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:36:62: Error: Unexpected token '...'.
 //   var /*@type=Set<int>*/ set20ambiguous = /*@typeArgs=int*/ {...spread};
 //                                                              ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:34:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:39:6: Error: Unexpected token '...'.
 //     {...mapSpread, "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:37:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:42:6: Error: Unexpected token '...'.
 //     {...mapSpread};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:39:62: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:44:62: Error: Unexpected token '...'.
 //   var /*@type=List<dynamic>*/ lhs21 = /*@typeArgs=dynamic*/ [...(spread as
 //                                                              ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:42:61: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:47:61: Error: Unexpected token '...'.
 //   var /*@type=Set<dynamic>*/ set21 = /*@typeArgs=dynamic*/ {...(spread as
 //                                                             ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:46:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:51:6: Error: Unexpected token '...'.
 //     {...(mapSpread as dynamic), "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:48:77: Error: Unexpected token '...'.
-//   dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
-//                                                                             ^^^
+// pkg/front_end/testcases/spread_collection_inference.dart:53:29: Error: Unexpected token '...'.
+//   dynamic map21ambiguous = {...
+//                             ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:51:40: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:56:40: Error: Unexpected token '...'.
 //   List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
 //                                        ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:53:39: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:58:39: Error: Unexpected token '...'.
 //   Set<int> set22 = /*@typeArgs=int*/ {... /*@typeArgs=int*/ [], 42};
 //                                       ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:55:48: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:60:48: Error: Unexpected token '...'.
 //   Set<int> set22ambiguous = /*@typeArgs=int*/ {... /*@typeArgs=int*/ []};
 //                                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:58:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:63:6: Error: Unexpected token '...'.
 //     {... /*@typeArgs=String, int*/ {}};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:60:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:65:52: Error: Unexpected token '...'.
 //   List<List<int>> lhs23 = /*@typeArgs=List<int>*/ [... /*@typeArgs=List<int>*/
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:63:51: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:68:51: Error: Unexpected token '...'.
 //   Set<List<int>> set23 = /*@typeArgs=List<int>*/ {... /*@typeArgs=List<int>*/
 //                                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:67:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:72:6: Error: Unexpected token '...'.
 //     {... /*@typeArgs=List<int>*/ [/*@typeArgs=int*/ []]};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:70:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:75:6: Error: Unexpected token '...'.
 //     {... /*@typeArgs=String, List<int>*/ {"baz": /*@typeArgs=int*/ []}};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:72:77: Error: Unexpected token '...'.
-//   dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
-//                                                                             ^^^
+// pkg/front_end/testcases/spread_collection_inference.dart:77:29: Error: Unexpected token '...'.
+//   dynamic map24ambiguous = {...
+//                             ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:73:13: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:78:13: Error: Unexpected token '...'.
 //     spread, ...mapSpread};
 //             ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:75:63: Error: Unexpected token '...'.
-//   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
-//                                                               ^^^
+// pkg/front_end/testcases/spread_collection_inference.dart:80:34: Error: Unexpected token '...'.
+//   int lhs30 = /*@typeArgs=int*/ [...spread];
+//                                  ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:77:63: Error: Unexpected token '...'.
-//   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
-//                                                               ^^^
+// pkg/front_end/testcases/spread_collection_inference.dart:82:34: Error: Unexpected token '...'.
+//   int set30 = /*@typeArgs=int*/ {...spread, 42};
+//                                  ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:80:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:85:6: Error: Unexpected token '...'.
 //     {...spread};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:83:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:88:6: Error: Unexpected token '...'.
 //     {...mapSpread, "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:86:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:91:6: Error: Unexpected token '...'.
 //     {...mapSpread};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:88:35: Error: Unexpected token '...'.
-//   List<dynamic> lhs40 = <dynamic>[... /*@error=SpreadTypeMismatch*/
+// pkg/front_end/testcases/spread_collection_inference.dart:93:35: Error: Unexpected token '...'.
+//   List<dynamic> lhs40 = <dynamic>[...
 //                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:91:34: Error: Unexpected token '...'.
-//   Set<dynamic> set40 = <dynamic>{... /*@error=SpreadTypeMismatch*/
+// pkg/front_end/testcases/spread_collection_inference.dart:96:34: Error: Unexpected token '...'.
+//   Set<dynamic> set40 = <dynamic>{...
 //                                  ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:94:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:99:52: Error: Unexpected token '...'.
 //   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:97:36: Error: Unexpected token '...'.
-//   List<dynamic> lhs50 = <dynamic> [... /*@error=SpreadTypeMismatch*/
+// pkg/front_end/testcases/spread_collection_inference.dart:102:36: Error: Unexpected token '...'.
+//   List<dynamic> lhs50 = <dynamic> [...
 //                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:100:35: Error: Unexpected token '...'.
-//   Set<dynamic> set50 = <dynamic> {... /*@error=SpreadTypeMismatch*/
+// pkg/front_end/testcases/spread_collection_inference.dart:105:35: Error: Unexpected token '...'.
+//   Set<dynamic> set50 = <dynamic> {...
 //                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:103:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:108:52: Error: Unexpected token '...'.
 //   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:106:33: Error: Unexpected token '...'.
-//   List<String> lhs60 = <String>[... /*@error=SpreadElementTypeMismatch*/
+// pkg/front_end/testcases/spread_collection_inference.dart:111:33: Error: Unexpected token '...'.
+//   List<String> lhs60 = <String>[...
 //                                 ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:109:32: Error: Unexpected token '...'.
-//   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
+// pkg/front_end/testcases/spread_collection_inference.dart:114:32: Error: Unexpected token '...'.
+//   Set<String> set60 = <String>{... spread};
 //                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:111:36: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:116:36: Error: Unexpected token '...'.
 //   Map<int, int> map60 = <int, int>{...
 //                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:114:48: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:119:48: Error: Unexpected token '...'.
 //   Map<String, String> map61 = <String, String>{...
 //                                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:117:27: Error: Unexpected token '...'.
-//   List<int> lhs70 = <int>[... /*@error=NonNullAwareSpreadIsNull*/ null];
+// pkg/front_end/testcases/spread_collection_inference.dart:122:27: Error: Unexpected token '...'.
+//   List<int> lhs70 = <int>[... null];
 //                           ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:119:26: Error: Unexpected token '...'.
-//   Set<int> set70 = <int>{... /*@error=NonNullAwareSpreadIsNull*/ null};
+// pkg/front_end/testcases/spread_collection_inference.dart:124:26: Error: Unexpected token '...'.
+//   Set<int> set70 = <int>{... null};
 //                          ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:122:6: Error: Unexpected token '...'.
-//     {... /*@error=NonNullAwareSpreadIsNull*/ null, ... /*@typeArgs=dynamic*/
+// pkg/front_end/testcases/spread_collection_inference.dart:127:6: Error: Unexpected token '...'.
+//     {... null, ... /*@typeArgs=dynamic*/
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:122:52: Error: Unexpected token '...'.
-//     {... /*@error=NonNullAwareSpreadIsNull*/ null, ... /*@typeArgs=dynamic*/
-//                                                    ^^^
+// pkg/front_end/testcases/spread_collection_inference.dart:127:16: Error: Unexpected token '...'.
+//     {... null, ... /*@typeArgs=dynamic*/
+//                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:125:42: Error: Unexpected token '...'.
-//   Map<String, int> map70 = <String, int>{... /*@error=NonNullAwareSpreadIsNull*/
+// pkg/front_end/testcases/spread_collection_inference.dart:130:42: Error: Unexpected token '...'.
+//   Map<String, int> map70 = <String, int>{...
 //                                          ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:128:27: Error: Unexpected token '...?'.
+// pkg/front_end/testcases/spread_collection_inference.dart:133:27: Error: Unexpected token '...?'.
 //   List<int> lhs80 = <int>[...?null];
 //                           ^^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:130:26: Error: Unexpected token '...?'.
+// pkg/front_end/testcases/spread_collection_inference.dart:135:26: Error: Unexpected token '...?'.
 //   Set<int> set80 = <int>{...?null};
 //                          ^^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:133:6: Error: Unexpected token '...?'.
+// pkg/front_end/testcases/spread_collection_inference.dart:138:6: Error: Unexpected token '...?'.
 //     {...?null, ... /*@typeArgs=dynamic*/ []};
 //      ^^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:133:16: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:138:16: Error: Unexpected token '...'.
 //     {...?null, ... /*@typeArgs=dynamic*/ []};
 //                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:135:42: Error: Unexpected token '...?'.
+// pkg/front_end/testcases/spread_collection_inference.dart:140:42: Error: Unexpected token '...?'.
 //   Map<String, int> map80 = <String, int>{...?null};
 //                                          ^^^^
 //
+// pkg/front_end/testcases/spread_collection_inference.dart:142:56: Error: Unexpected token '...'.
+//   var /*@type=Map<String, int>*/ map90 = <String, int>{... /*@typeArgs=String, int*/ bar()};
+//                                                        ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:144:29: Error: Unexpected token '...'.
+//   List<int> list100 = <int>[...listNum];
+//                             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:146:37: Error: Unexpected token '...'.
+//   Map<num, int> map100 = <num, int>{...mapIntNum};
+//                                     ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:148:29: Error: Unexpected token '...'.
+//   List<int> list110 = <int>[...dynVar];
+//                             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:150:37: Error: Unexpected token '...'.
+//   Map<num, int> map110 = <num, int>{...dynVar};
+//                                     ^^^
+//
 import self as self;
 import "dart:core" as core;
 
-static method foo() → dynamic {
+static method bar<K extends core::Object = dynamic, V extends core::Object = dynamic>() → core::Map<self::bar::K, self::bar::V>
+  return null;
+static method foo(dynamic dynVar) → dynamic {
   core::List<core::int> spread = <core::int>[1, 2, 3];
   core::Map<core::String, core::int> mapSpread = <core::String, core::int>{"foo": 4, "bar": 2};
   core::int notSpreadInt = 42;
   () → core::int notSpreadFunction = null;
+  core::Map<core::int, core::num> mapIntNum = <core::int, core::num>{42: 42};
+  core::List<core::num> listNum = <core::num>[42];
   dynamic lhs10 = <dynamic>[];
   dynamic set10 = <dynamic>{};
   dynamic map10 = <dynamic, dynamic>{};
@@ -247,5 +271,10 @@
   core::Set<core::int> set80 = <core::int>{};
   dynamic set81ambiguous = <dynamic, dynamic>{};
   core::Map<core::String, core::int> map80 = <core::String, core::int>{};
+  dynamic map90 = <core::String, core::int>{};
+  core::List<core::int> list100 = <core::int>[];
+  core::Map<core::num, core::int> map100 = <core::num, core::int>{};
+  core::List<core::int> list110 = <core::int>[];
+  core::Map<core::num, core::int> map110 = <core::num, core::int>{};
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect b/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect
index b419aeb..4eac9e2 100644
--- a/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect
+++ b/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect
@@ -2,206 +2,230 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:16:62: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:21:62: Error: Unexpected token '...'.
 //   var /*@type=List<dynamic>*/ lhs10 = /*@typeArgs=dynamic*/ [...
 //                                                              ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:19:48: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:24:48: Error: Unexpected token '...'.
 //   var /*@type=Set<dynamic>*/ set10 = <dynamic>{... /*@typeArgs=dynamic*/ []};
 //                                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:21:66: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:26:66: Error: Unexpected token '...'.
 //   var /*@type=Map<dynamic, dynamic>*/ map10 = <dynamic, dynamic>{...
 //                                                                  ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:25:37: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:30:37: Error: Unexpected token '...'.
 //     /*@typeArgs=dynamic, dynamic*/ {...  /*@typeArgs=dynamic, dynamic*/ {}};
 //                                     ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:27:54: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:32:54: Error: Unexpected token '...'.
 //   var /*@type=List<int>*/ lhs20 = /*@typeArgs=int*/ [...spread];
 //                                                      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:29:53: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:34:53: Error: Unexpected token '...'.
 //   var /*@type=Set<int>*/ set20 = /*@typeArgs=int*/ {...spread, 42};
 //                                                     ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:31:62: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:36:62: Error: Unexpected token '...'.
 //   var /*@type=Set<int>*/ set20ambiguous = /*@typeArgs=int*/ {...spread};
 //                                                              ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:34:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:39:6: Error: Unexpected token '...'.
 //     {...mapSpread, "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:37:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:42:6: Error: Unexpected token '...'.
 //     {...mapSpread};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:39:62: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:44:62: Error: Unexpected token '...'.
 //   var /*@type=List<dynamic>*/ lhs21 = /*@typeArgs=dynamic*/ [...(spread as
 //                                                              ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:42:61: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:47:61: Error: Unexpected token '...'.
 //   var /*@type=Set<dynamic>*/ set21 = /*@typeArgs=dynamic*/ {...(spread as
 //                                                             ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:46:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:51:6: Error: Unexpected token '...'.
 //     {...(mapSpread as dynamic), "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:48:77: Error: Unexpected token '...'.
-//   dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
-//                                                                             ^^^
+// pkg/front_end/testcases/spread_collection_inference.dart:53:29: Error: Unexpected token '...'.
+//   dynamic map21ambiguous = {...
+//                             ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:51:40: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:56:40: Error: Unexpected token '...'.
 //   List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
 //                                        ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:53:39: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:58:39: Error: Unexpected token '...'.
 //   Set<int> set22 = /*@typeArgs=int*/ {... /*@typeArgs=int*/ [], 42};
 //                                       ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:55:48: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:60:48: Error: Unexpected token '...'.
 //   Set<int> set22ambiguous = /*@typeArgs=int*/ {... /*@typeArgs=int*/ []};
 //                                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:58:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:63:6: Error: Unexpected token '...'.
 //     {... /*@typeArgs=String, int*/ {}};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:60:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:65:52: Error: Unexpected token '...'.
 //   List<List<int>> lhs23 = /*@typeArgs=List<int>*/ [... /*@typeArgs=List<int>*/
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:63:51: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:68:51: Error: Unexpected token '...'.
 //   Set<List<int>> set23 = /*@typeArgs=List<int>*/ {... /*@typeArgs=List<int>*/
 //                                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:67:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:72:6: Error: Unexpected token '...'.
 //     {... /*@typeArgs=List<int>*/ [/*@typeArgs=int*/ []]};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:70:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:75:6: Error: Unexpected token '...'.
 //     {... /*@typeArgs=String, List<int>*/ {"baz": /*@typeArgs=int*/ []}};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:72:77: Error: Unexpected token '...'.
-//   dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
-//                                                                             ^^^
+// pkg/front_end/testcases/spread_collection_inference.dart:77:29: Error: Unexpected token '...'.
+//   dynamic map24ambiguous = {...
+//                             ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:73:13: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:78:13: Error: Unexpected token '...'.
 //     spread, ...mapSpread};
 //             ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:75:63: Error: Unexpected token '...'.
-//   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
-//                                                               ^^^
+// pkg/front_end/testcases/spread_collection_inference.dart:80:34: Error: Unexpected token '...'.
+//   int lhs30 = /*@typeArgs=int*/ [...spread];
+//                                  ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:77:63: Error: Unexpected token '...'.
-//   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
-//                                                               ^^^
+// pkg/front_end/testcases/spread_collection_inference.dart:82:34: Error: Unexpected token '...'.
+//   int set30 = /*@typeArgs=int*/ {...spread, 42};
+//                                  ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:80:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:85:6: Error: Unexpected token '...'.
 //     {...spread};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:83:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:88:6: Error: Unexpected token '...'.
 //     {...mapSpread, "baz": 42};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:86:6: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:91:6: Error: Unexpected token '...'.
 //     {...mapSpread};
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:88:35: Error: Unexpected token '...'.
-//   List<dynamic> lhs40 = <dynamic>[... /*@error=SpreadTypeMismatch*/
+// pkg/front_end/testcases/spread_collection_inference.dart:93:35: Error: Unexpected token '...'.
+//   List<dynamic> lhs40 = <dynamic>[...
 //                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:91:34: Error: Unexpected token '...'.
-//   Set<dynamic> set40 = <dynamic>{... /*@error=SpreadTypeMismatch*/
+// pkg/front_end/testcases/spread_collection_inference.dart:96:34: Error: Unexpected token '...'.
+//   Set<dynamic> set40 = <dynamic>{...
 //                                  ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:94:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:99:52: Error: Unexpected token '...'.
 //   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:97:36: Error: Unexpected token '...'.
-//   List<dynamic> lhs50 = <dynamic> [... /*@error=SpreadTypeMismatch*/
+// pkg/front_end/testcases/spread_collection_inference.dart:102:36: Error: Unexpected token '...'.
+//   List<dynamic> lhs50 = <dynamic> [...
 //                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:100:35: Error: Unexpected token '...'.
-//   Set<dynamic> set50 = <dynamic> {... /*@error=SpreadTypeMismatch*/
+// pkg/front_end/testcases/spread_collection_inference.dart:105:35: Error: Unexpected token '...'.
+//   Set<dynamic> set50 = <dynamic> {...
 //                                   ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:103:52: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:108:52: Error: Unexpected token '...'.
 //   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...
 //                                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:106:33: Error: Unexpected token '...'.
-//   List<String> lhs60 = <String>[... /*@error=SpreadElementTypeMismatch*/
+// pkg/front_end/testcases/spread_collection_inference.dart:111:33: Error: Unexpected token '...'.
+//   List<String> lhs60 = <String>[...
 //                                 ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:109:32: Error: Unexpected token '...'.
-//   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
+// pkg/front_end/testcases/spread_collection_inference.dart:114:32: Error: Unexpected token '...'.
+//   Set<String> set60 = <String>{... spread};
 //                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:111:36: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:116:36: Error: Unexpected token '...'.
 //   Map<int, int> map60 = <int, int>{...
 //                                    ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:114:48: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:119:48: Error: Unexpected token '...'.
 //   Map<String, String> map61 = <String, String>{...
 //                                                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:117:27: Error: Unexpected token '...'.
-//   List<int> lhs70 = <int>[... /*@error=NonNullAwareSpreadIsNull*/ null];
+// pkg/front_end/testcases/spread_collection_inference.dart:122:27: Error: Unexpected token '...'.
+//   List<int> lhs70 = <int>[... null];
 //                           ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:119:26: Error: Unexpected token '...'.
-//   Set<int> set70 = <int>{... /*@error=NonNullAwareSpreadIsNull*/ null};
+// pkg/front_end/testcases/spread_collection_inference.dart:124:26: Error: Unexpected token '...'.
+//   Set<int> set70 = <int>{... null};
 //                          ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:122:6: Error: Unexpected token '...'.
-//     {... /*@error=NonNullAwareSpreadIsNull*/ null, ... /*@typeArgs=dynamic*/
+// pkg/front_end/testcases/spread_collection_inference.dart:127:6: Error: Unexpected token '...'.
+//     {... null, ... /*@typeArgs=dynamic*/
 //      ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:122:52: Error: Unexpected token '...'.
-//     {... /*@error=NonNullAwareSpreadIsNull*/ null, ... /*@typeArgs=dynamic*/
-//                                                    ^^^
+// pkg/front_end/testcases/spread_collection_inference.dart:127:16: Error: Unexpected token '...'.
+//     {... null, ... /*@typeArgs=dynamic*/
+//                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:125:42: Error: Unexpected token '...'.
-//   Map<String, int> map70 = <String, int>{... /*@error=NonNullAwareSpreadIsNull*/
+// pkg/front_end/testcases/spread_collection_inference.dart:130:42: Error: Unexpected token '...'.
+//   Map<String, int> map70 = <String, int>{...
 //                                          ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:128:27: Error: Unexpected token '...?'.
+// pkg/front_end/testcases/spread_collection_inference.dart:133:27: Error: Unexpected token '...?'.
 //   List<int> lhs80 = <int>[...?null];
 //                           ^^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:130:26: Error: Unexpected token '...?'.
+// pkg/front_end/testcases/spread_collection_inference.dart:135:26: Error: Unexpected token '...?'.
 //   Set<int> set80 = <int>{...?null};
 //                          ^^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:133:6: Error: Unexpected token '...?'.
+// pkg/front_end/testcases/spread_collection_inference.dart:138:6: Error: Unexpected token '...?'.
 //     {...?null, ... /*@typeArgs=dynamic*/ []};
 //      ^^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:133:16: Error: Unexpected token '...'.
+// pkg/front_end/testcases/spread_collection_inference.dart:138:16: Error: Unexpected token '...'.
 //     {...?null, ... /*@typeArgs=dynamic*/ []};
 //                ^^^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:135:42: Error: Unexpected token '...?'.
+// pkg/front_end/testcases/spread_collection_inference.dart:140:42: Error: Unexpected token '...?'.
 //   Map<String, int> map80 = <String, int>{...?null};
 //                                          ^^^^
 //
+// pkg/front_end/testcases/spread_collection_inference.dart:142:56: Error: Unexpected token '...'.
+//   var /*@type=Map<String, int>*/ map90 = <String, int>{... /*@typeArgs=String, int*/ bar()};
+//                                                        ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:144:29: Error: Unexpected token '...'.
+//   List<int> list100 = <int>[...listNum];
+//                             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:146:37: Error: Unexpected token '...'.
+//   Map<num, int> map100 = <num, int>{...mapIntNum};
+//                                     ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:148:29: Error: Unexpected token '...'.
+//   List<int> list110 = <int>[...dynVar];
+//                             ^^^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:150:37: Error: Unexpected token '...'.
+//   Map<num, int> map110 = <num, int>{...dynVar};
+//                                     ^^^
+//
 import self as self;
 import "dart:core" as core;
 
-static method foo() → dynamic {
+static method bar<K extends core::Object = dynamic, V extends core::Object = dynamic>() → core::Map<self::bar::K, self::bar::V>
+  return null;
+static method foo(dynamic dynVar) → dynamic {
   core::List<core::int> spread = <core::int>[1, 2, 3];
   core::Map<core::String, core::int> mapSpread = <core::String, core::int>{"foo": 4, "bar": 2};
   core::int notSpreadInt = 42;
   () → core::int notSpreadFunction = null;
+  core::Map<core::int, core::num> mapIntNum = <core::int, core::num>{42: 42};
+  core::List<core::num> listNum = <core::num>[42];
   dynamic lhs10 = <dynamic>[];
   dynamic set10 = <dynamic>{};
   dynamic map10 = <dynamic, dynamic>{};
@@ -247,5 +271,10 @@
   core::Set<core::int> set80 = <core::int>{};
   dynamic set81ambiguous = <dynamic, dynamic>{};
   core::Map<core::String, core::int> map80 = <core::String, core::int>{};
+  dynamic map90 = <core::String, core::int>{};
+  core::List<core::int> list100 = <core::int>[];
+  core::Map<core::num, core::int> map100 = <core::num, core::int>{};
+  core::List<core::int> list110 = <core::int>[];
+  core::Map<core::num, core::int> map110 = <core::num, core::int>{};
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/spread_collection_inference.dart.outline.expect b/front_end/testcases/spread_collection_inference.dart.outline.expect
index 07ce31d..e8acddb 100644
--- a/front_end/testcases/spread_collection_inference.dart.outline.expect
+++ b/front_end/testcases/spread_collection_inference.dart.outline.expect
@@ -1,7 +1,10 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static method foo() → dynamic
+static method bar<K extends core::Object = dynamic, V extends core::Object = dynamic>() → core::Map<self::bar::K, self::bar::V>
+  ;
+static method foo(dynamic dynVar) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/front_end/testcases/spread_collection_inference.dart.strong.expect b/front_end/testcases/spread_collection_inference.dart.strong.expect
index fa9fa70..27a3664 100644
--- a/front_end/testcases/spread_collection_inference.dart.strong.expect
+++ b/front_end/testcases/spread_collection_inference.dart.strong.expect
@@ -2,104 +2,102 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:48:76: Error: Not enough type information to disambiguate between literal set and literal map.
+// pkg/front_end/testcases/spread_collection_inference.dart:53:28: Error: Not enough type information to disambiguate between literal set and literal map.
 // Try providing type arguments for the literal explicitly to disambiguate it.
-//   dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
-//                                                                            ^
+//   dynamic map21ambiguous = {...
+//                            ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:72:76: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
-//   dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
-//                                                                            ^
-// pkg/front_end/testcases/spread_collection_inference.dart:73:5: Context: Iterable spread.
-//     spread, ...mapSpread};
-//     ^
-// pkg/front_end/testcases/spread_collection_inference.dart:73:16: Context: Map spread.
-//     spread, ...mapSpread};
-//                ^
+// pkg/front_end/testcases/spread_collection_inference.dart:77:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   dynamic map24ambiguous = {...
+//                            ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:75:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:80:33: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
 //  - 'List' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
-//                                                              ^
+//   int lhs30 = /*@typeArgs=int*/ [...spread];
+//                                 ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:77:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:82:33: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
 //  - 'Set' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
-//                                                              ^
+//   int set30 = /*@typeArgs=int*/ {...spread, 42};
+//                                 ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:80:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:85:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
 //  - 'Set' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     {...spread};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:83:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:88:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
 //  - 'Map' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     {...mapSpread, "baz": 42};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:86:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:91:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
 //  - 'Map' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     {...mapSpread};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:89:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:94:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadInt];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:92:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:97:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadInt};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:95:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
-//     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadInt};
-//                                           ^
+// pkg/front_end/testcases/spread_collection_inference.dart:100:2: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+//  notSpreadInt};
+//  ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:98:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:103:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadFunction];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:101:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:106:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadFunction};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:104:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
-//     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadFunction};
-//                                           ^
+// pkg/front_end/testcases/spread_collection_inference.dart:109:2: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
+//  notSpreadFunction};
+//  ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:107:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+// pkg/front_end/testcases/spread_collection_inference.dart:112:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
 //     spread];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:109:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-//   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
-//                                                                         ^
+// pkg/front_end/testcases/spread_collection_inference.dart:114:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+//   Set<String> set60 = <String>{... spread};
+//                                    ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:112:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
-//     /*@error=SpreadMapEntryElementKeyTypeMismatch*/ mapSpread};
-//                                                     ^
+// pkg/front_end/testcases/spread_collection_inference.dart:117:2: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
+//  mapSpread};
+//  ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:115:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
-//     /*@error=SpreadMapEntryElementValueTypeMismatch*/ mapSpread};
-//                                                       ^
+// pkg/front_end/testcases/spread_collection_inference.dart:120:2: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
+//  mapSpread};
+//  ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:117:67: Error: Can't spread a value with static type Null.
-//   List<int> lhs70 = <int>[... /*@error=NonNullAwareSpreadIsNull*/ null];
-//                                                                   ^
+// pkg/front_end/testcases/spread_collection_inference.dart:122:31: Error: Can't spread a value with static type Null.
+//   List<int> lhs70 = <int>[... null];
+//                               ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:119:66: Error: Can't spread a value with static type Null.
-//   Set<int> set70 = <int>{... /*@error=NonNullAwareSpreadIsNull*/ null};
-//                                                                  ^
+// pkg/front_end/testcases/spread_collection_inference.dart:124:30: Error: Can't spread a value with static type Null.
+//   Set<int> set70 = <int>{... null};
+//                              ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:122:46: Error: Can't spread a value with static type Null.
-//     {... /*@error=NonNullAwareSpreadIsNull*/ null, ... /*@typeArgs=dynamic*/
-//                                              ^
+// pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Can't spread a value with static type Null.
+//     {... null, ... /*@typeArgs=dynamic*/
+//          ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:126:5: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Expected ',' before this.
+//     {... null, ... /*@typeArgs=dynamic*/
+//          ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:131:5: Error: Can't spread a value with static type Null.
 //     null};
 //     ^
 //
@@ -107,11 +105,15 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-static method foo() → dynamic {
+static method bar<K extends core::Object = dynamic, V extends core::Object = dynamic>() → core::Map<self::bar::K, self::bar::V>
+  return null;
+static method foo(dynamic dynVar) → dynamic {
   core::List<core::int> spread = <core::int>[1, 2, 3];
   core::Map<core::String, core::int> mapSpread = <core::String, core::int>{"foo": 4, "bar": 2};
   core::int notSpreadInt = 42;
   () → core::int notSpreadFunction = null;
+  core::Map<core::int, core::num> mapIntNum = <core::int, core::num>{42: 42};
+  core::List<core::num> listNum = <core::num>[42];
   core::List<dynamic> lhs10 = block {
     final core::List<dynamic> #t1 = <dynamic>[];
     for (final dynamic #t2 in <dynamic>[])
@@ -145,209 +147,258 @@
   } =>#t11;
   core::Set<core::int> set20ambiguous = block {
     final core::Set<core::int> #t13 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t14 in spread)
-      #t13.{core::Set::add}(#t14);
+    for (final dynamic #t14 in spread) {
+      final core::int #t15 = #t14 as{TypeError} core::int;
+      #t13.{core::Set::add}(#t15);
+    }
   } =>#t13;
   core::Map<core::String, core::int> map20 = block {
-    final core::Map<core::String, core::int> #t15 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t16 in mapSpread.{core::Map::entries})
-      #t15.{core::Map::[]=}(#t16.{core::MapEntry::key}, #t16.{core::MapEntry::value});
-    #t15.{core::Map::[]=}("baz", 42);
-  } =>#t15;
+    final core::Map<core::String, core::int> #t16 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t17 in mapSpread.{core::Map::entries})
+      #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+    #t16.{core::Map::[]=}("baz", 42);
+  } =>#t16;
   core::Map<core::String, core::int> map20ambiguous = block {
-    final core::Map<core::String, core::int> #t17 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t18 in mapSpread.{core::Map::entries})
-      #t17.{core::Map::[]=}(#t18.{core::MapEntry::key}, #t18.{core::MapEntry::value});
-  } =>#t17;
+    final core::Map<core::String, core::int> #t18 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t19 in mapSpread.{core::Map::entries})
+      #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+  } =>#t18;
   core::List<dynamic> lhs21 = block {
-    final core::List<dynamic> #t19 = <dynamic>[];
-    for (final dynamic #t20 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t19.{core::List::add}(#t20);
-  } =>#t19;
+    final core::List<dynamic> #t20 = <dynamic>[];
+    for (final dynamic #t21 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
+      #t20.{core::List::add}(#t21);
+  } =>#t20;
   core::Set<dynamic> set21 = block {
-    final core::Set<dynamic> #t21 = col::LinkedHashSet::•<dynamic>();
-    for (final dynamic #t22 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t21.{core::Set::add}(#t22);
-    #t21.{core::Set::add}(42);
-  } =>#t21;
+    final core::Set<dynamic> #t22 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t23 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
+      #t22.{core::Set::add}(#t23);
+    #t22.{core::Set::add}(42);
+  } =>#t22;
   core::Map<dynamic, dynamic> map21 = block {
-    final core::Map<dynamic, dynamic> #t23 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t24 in ((mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries})
-      #t23.{core::Map::[]=}(#t24.{core::MapEntry::key}, #t24.{core::MapEntry::value});
-    #t23.{core::Map::[]=}("baz", 42);
-  } =>#t23;
-  dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:48:76: Error: Not enough type information to disambiguate between literal set and literal map.
+    final core::Map<dynamic, dynamic> #t24 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic> #t25 in ((mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries})
+      #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
+    #t24.{core::Map::[]=}("baz", 42);
+  } =>#t24;
+  dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:53:28: Error: Not enough type information to disambiguate between literal set and literal map.
 Try providing type arguments for the literal explicitly to disambiguate it.
-  dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
-                                                                           ^";
+  dynamic map21ambiguous = {...
+                           ^";
   core::List<core::int> lhs22 = block {
-    final core::List<core::int> #t25 = <core::int>[];
-    for (final core::int #t26 in <core::int>[])
-      #t25.{core::List::add}(#t26);
-  } =>#t25;
+    final core::List<core::int> #t26 = <core::int>[];
+    for (final core::int #t27 in <core::int>[])
+      #t26.{core::List::add}(#t27);
+  } =>#t26;
   core::Set<core::int> set22 = block {
-    final core::Set<core::int> #t27 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t28 in <core::int>[])
-      #t27.{core::Set::add}(#t28);
-    #t27.{core::Set::add}(42);
-  } =>#t27;
+    final core::Set<core::int> #t28 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t29 in <core::int>[])
+      #t28.{core::Set::add}(#t29);
+    #t28.{core::Set::add}(42);
+  } =>#t28;
   core::Set<core::int> set22ambiguous = block {
-    final core::Set<core::int> #t29 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t30 in <core::int>[])
-      #t29.{core::Set::add}(#t30);
-  } =>#t29;
+    final core::Set<core::int> #t30 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t31 in <core::int>[]) {
+      final core::int #t32 = #t31 as{TypeError} core::int;
+      #t30.{core::Set::add}(#t32);
+    }
+  } =>#t30;
   core::Map<core::String, core::int> map22 = block {
-    final core::Map<core::String, core::int> #t31 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t32 in <core::String, core::int>{}.{core::Map::entries})
-      #t31.{core::Map::[]=}(#t32.{core::MapEntry::key}, #t32.{core::MapEntry::value});
-  } =>#t31;
-  core::List<core::List<core::int>> lhs23 = block {
-    final core::List<core::List<core::int>> #t33 = <core::List<core::int>>[];
-    for (final core::List<core::int> #t34 in <core::List<core::int>>[<core::int>[]])
-      #t33.{core::List::add}(#t34);
+    final core::Map<core::String, core::int> #t33 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t34 in <core::String, core::int>{}.{core::Map::entries})
+      #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
   } =>#t33;
-  core::Set<core::List<core::int>> set23 = block {
-    final core::Set<core::List<core::int>> #t35 = col::LinkedHashSet::•<core::List<core::int>>();
+  core::List<core::List<core::int>> lhs23 = block {
+    final core::List<core::List<core::int>> #t35 = <core::List<core::int>>[];
     for (final core::List<core::int> #t36 in <core::List<core::int>>[<core::int>[]])
-      #t35.{core::Set::add}(#t36);
-    #t35.{core::Set::add}(<core::int>[42]);
+      #t35.{core::List::add}(#t36);
   } =>#t35;
-  core::Set<core::List<core::int>> set23ambiguous = block {
+  core::Set<core::List<core::int>> set23 = block {
     final core::Set<core::List<core::int>> #t37 = col::LinkedHashSet::•<core::List<core::int>>();
     for (final core::List<core::int> #t38 in <core::List<core::int>>[<core::int>[]])
       #t37.{core::Set::add}(#t38);
+    #t37.{core::Set::add}(<core::int>[42]);
   } =>#t37;
-  core::Map<core::String, core::List<core::int>> map23 = block {
-    final core::Map<core::String, core::List<core::int>> #t39 = <core::String, core::List<core::int>>{};
-    for (final core::MapEntry<core::String, core::List<core::int>> #t40 in <core::String, core::List<core::int>>{"baz": <core::int>[]}.{core::Map::entries})
-      #t39.{core::Map::[]=}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
+  core::Set<core::List<core::int>> set23ambiguous = block {
+    final core::Set<core::List<core::int>> #t39 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (final dynamic #t40 in <core::List<core::int>>[<core::int>[]]) {
+      final core::List<core::int> #t41 = #t40 as{TypeError} core::List<core::int>;
+      #t39.{core::Set::add}(#t41);
+    }
   } =>#t39;
-  dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:72:76: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
-  dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
-                                                                           ^";
-  core::int lhs30 = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:75:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+  core::Map<core::String, core::List<core::int>> map23 = block {
+    final core::Map<core::String, core::List<core::int>> #t42 = <core::String, core::List<core::int>>{};
+    for (final core::MapEntry<core::String, core::List<core::int>> #t43 in <core::String, core::List<core::int>>{"baz": <core::int>[]}.{core::Map::entries})
+      #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+  } =>#t42;
+  dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:77:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  dynamic map24ambiguous = {...
+                           ^";
+  core::int lhs30 = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:80:33: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
  - 'List' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
-                                                             ^" in ( block {
-    final core::List<core::int> #t42 = <core::int>[];
-    for (final core::int #t43 in spread)
-      #t42.{core::List::add}(#t43);
-  } =>#t42) as{TypeError} core::int;
-  core::int set30 = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:77:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+  int lhs30 = /*@typeArgs=int*/ [...spread];
+                                ^" in ( block {
+    final core::List<core::int> #t45 = <core::int>[];
+    for (final core::int #t46 in spread)
+      #t45.{core::List::add}(#t46);
+  } =>#t45) as{TypeError} core::int;
+  core::int set30 = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:82:33: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
-                                                             ^" in ( block {
-    final core::Set<core::int> #t45 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t46 in spread)
-      #t45.{core::Set::add}(#t46);
-    #t45.{core::Set::add}(42);
-  } =>#t45) as{TypeError} core::int;
-  core::int set30ambiguous = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:80:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+  int set30 = /*@typeArgs=int*/ {...spread, 42};
+                                ^" in ( block {
+    final core::Set<core::int> #t48 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t49 in spread)
+      #t48.{core::Set::add}(#t49);
+    #t48.{core::Set::add}(42);
+  } =>#t48) as{TypeError} core::int;
+  core::int set30ambiguous = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:85:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     {...spread};
     ^" in ( block {
-    final core::Set<core::int> #t48 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t49 in spread)
-      #t48.{core::Set::add}(#t49);
-  } =>#t48) as{TypeError} core::int;
-  core::int map30 = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:83:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+    final core::Set<core::int> #t51 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t52 in spread) {
+      final core::int #t53 = #t52 as{TypeError} core::int;
+      #t51.{core::Set::add}(#t53);
+    }
+  } =>#t51) as{TypeError} core::int;
+  core::int map30 = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:88:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     {...mapSpread, \"baz\": 42};
     ^" in ( block {
-    final core::Map<core::String, core::int> #t51 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t52 in mapSpread.{core::Map::entries})
-      #t51.{core::Map::[]=}(#t52.{core::MapEntry::key}, #t52.{core::MapEntry::value});
-    #t51.{core::Map::[]=}("baz", 42);
-  } =>#t51) as{TypeError} core::int;
-  core::int map30ambiguous = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:86:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+    final core::Map<core::String, core::int> #t55 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t56 in mapSpread.{core::Map::entries})
+      #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
+    #t55.{core::Map::[]=}("baz", 42);
+  } =>#t55) as{TypeError} core::int;
+  core::int map30ambiguous = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:91:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     {...mapSpread};
     ^" in ( block {
-    final core::Map<core::String, core::int> #t54 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t55 in mapSpread.{core::Map::entries})
-      #t54.{core::Map::[]=}(#t55.{core::MapEntry::key}, #t55.{core::MapEntry::value});
-  } =>#t54) as{TypeError} core::int;
-  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:89:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+    final core::Map<core::String, core::int> #t58 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t59 in mapSpread.{core::Map::entries})
+      #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
+  } =>#t58) as{TypeError} core::int;
+  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:94:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadInt];
     ^"];
-  core::Set<dynamic> set40 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:92:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic> set40 = let final core::Set<dynamic> #t60 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:97:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadInt};
-    ^") in #t56;
-  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:95:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
-    /*@error=SpreadMapEntryTypeMismatch*/ notSpreadInt};
-                                          ^": null};
-  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:98:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+    ^") in #t60;
+  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:100:2: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+ notSpreadInt};
+ ^": null};
+  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:103:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadFunction];
     ^"];
-  core::Set<dynamic> set50 = let final core::Set<dynamic> #t58 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t59 = #t58.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:101:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic> set50 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:106:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadFunction};
-    ^") in #t58;
-  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:104:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
-    /*@error=SpreadMapEntryTypeMismatch*/ notSpreadFunction};
-                                          ^": null};
-  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:107:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+    ^") in #t62;
+  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:109:2: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
+ notSpreadFunction};
+ ^": null};
+  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:112:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
     spread];
     ^"];
-  core::Set<core::String> set60 = let final core::Set<core::String> #t60 = col::LinkedHashSet::•<core::String>() in let final dynamic #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:109:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-  Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
-                                                                        ^") in #t60;
-  core::Map<core::int, core::int> map60 = <core::int, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:112:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
-    /*@error=SpreadMapEntryElementKeyTypeMismatch*/ mapSpread};
-                                                    ^": null};
-  core::Map<core::String, core::String> map61 = <core::String, core::String>{null: invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:115:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
-    /*@error=SpreadMapEntryElementValueTypeMismatch*/ mapSpread};
-                                                      ^"};
-  core::List<core::int> lhs70 = <core::int>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:117:67: Error: Can't spread a value with static type Null.
-  List<int> lhs70 = <int>[... /*@error=NonNullAwareSpreadIsNull*/ null];
-                                                                  ^"];
-  core::Set<core::int> set70 = let final core::Set<core::int> #t62 = col::LinkedHashSet::•<core::int>() in let final dynamic #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:119:66: Error: Can't spread a value with static type Null.
-  Set<int> set70 = <int>{... /*@error=NonNullAwareSpreadIsNull*/ null};
-                                                                 ^") in #t62;
+  core::Set<core::String> set60 = let final core::Set<core::String> #t64 = col::LinkedHashSet::•<core::String>() in let final dynamic #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:114:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  Set<String> set60 = <String>{... spread};
+                                   ^") in #t64;
+  core::Map<core::int, core::int> map60 = <core::int, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:117:2: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
+ mapSpread};
+ ^": null};
+  core::Map<core::String, core::String> map61 = <core::String, core::String>{null: invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:120:2: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
+ mapSpread};
+ ^"};
+  core::List<core::int> lhs70 = <core::int>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:122:31: Error: Can't spread a value with static type Null.
+  List<int> lhs70 = <int>[... null];
+                              ^"];
+  core::Set<core::int> set70 = let final core::Set<core::int> #t66 = col::LinkedHashSet::•<core::int>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:124:30: Error: Can't spread a value with static type Null.
+  Set<int> set70 = <int>{... null};
+                             ^") in #t66;
   core::Set<dynamic> set71ambiguous = block {
-    final core::Set<dynamic> #t64 = col::LinkedHashSet::•<dynamic>();
-    #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:122:46: Error: Can't spread a value with static type Null.
-    {... /*@error=NonNullAwareSpreadIsNull*/ null, ... /*@typeArgs=dynamic*/
-                                             ^");
-    for (final dynamic #t65 in <dynamic>[])
-      #t64.{core::Set::add}(#t65);
-  } =>#t64;
-  core::Map<core::String, core::int> map70 = <core::String, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:126:5: Error: Can't spread a value with static type Null.
+    final core::Set<dynamic> #t68 = col::LinkedHashSet::•<dynamic>();
+    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Expected ',' before this.
+    {... null, ... /*@typeArgs=dynamic*/
+         ^");
+    for (final dynamic #t69 in <dynamic>[]) {
+      final dynamic #t70 = #t69 as{TypeError} dynamic;
+      #t68.{core::Set::add}(#t70);
+    }
+  } =>#t68;
+  core::Map<core::String, core::int> map70 = <core::String, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:131:5: Error: Can't spread a value with static type Null.
     null};
     ^": null};
   core::List<core::int> lhs80 = block {
-    final core::List<core::int> #t66 = <core::int>[];
-    final dynamic #t67 = null;
-    if(!#t67.{core::Object::==}(null))
-      for (final core::int #t68 in #t67)
-        #t66.{core::List::add}(#t68);
-  } =>#t66;
+    final core::List<core::int> #t71 = <core::int>[];
+    final dynamic #t72 = null;
+    if(!#t72.{core::Object::==}(null))
+      for (final core::int #t73 in #t72)
+        #t71.{core::List::add}(#t73);
+  } =>#t71;
   core::Set<core::int> set80 = block {
-    final core::Set<core::int> #t69 = col::LinkedHashSet::•<core::int>();
-    final dynamic #t70 = null;
-    if(!#t70.{core::Object::==}(null))
-      for (final core::int #t71 in #t70)
-        #t69.{core::Set::add}(#t71);
-  } =>#t69;
+    final core::Set<core::int> #t74 = col::LinkedHashSet::•<core::int>();
+    final dynamic #t75 = null;
+    if(!#t75.{core::Object::==}(null))
+      for (final core::int #t76 in #t75)
+        #t74.{core::Set::add}(#t76);
+  } =>#t74;
   core::Set<dynamic> set81ambiguous = block {
-    final core::Set<dynamic> #t72 = col::LinkedHashSet::•<dynamic>();
-    final dynamic #t73 = null;
-    if(!#t73.{core::Object::==}(null))
-      for (final dynamic #t74 in #t73)
-        #t72.{core::Set::add}(#t74);
-    for (final dynamic #t75 in <dynamic>[])
-      #t72.{core::Set::add}(#t75);
-  } =>#t72;
+    final core::Set<dynamic> #t77 = col::LinkedHashSet::•<dynamic>();
+    final dynamic #t78 = null;
+    if(!#t78.{core::Object::==}(null))
+      for (final dynamic #t79 in #t78) {
+        final dynamic #t80 = #t79 as{TypeError} dynamic;
+        #t77.{core::Set::add}(#t80);
+      }
+    for (final dynamic #t81 in <dynamic>[]) {
+      final dynamic #t82 = #t81 as{TypeError} dynamic;
+      #t77.{core::Set::add}(#t82);
+    }
+  } =>#t77;
   core::Map<core::String, core::int> map80 = block {
-    final core::Map<core::String, core::int> #t76 = <core::String, core::int>{};
-    final core::Map<dynamic, dynamic> #t77 = null;
-    if(!#t77.{core::Object::==}(null))
-      for (final core::MapEntry<core::String, core::int> #t78 in #t77.{core::Map::entries})
-        #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
-  } =>#t76;
+    final core::Map<core::String, core::int> #t83 = <core::String, core::int>{};
+    final core::Map<dynamic, dynamic> #t84 = null;
+    if(!#t84.{core::Object::==}(null))
+      for (final core::MapEntry<core::String, core::int> #t85 in #t84.{core::Map::entries})
+        #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
+  } =>#t83;
+  core::Map<core::String, core::int> map90 = block {
+    final core::Map<core::String, core::int> #t86 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t87 in self::bar<core::String, core::int>().{core::Map::entries})
+      #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+  } =>#t86;
+  core::List<core::int> list100 = block {
+    final core::List<core::int> #t88 = <core::int>[];
+    for (final dynamic #t89 in listNum) {
+      final core::int #t90 = #t89 as{TypeError} core::int;
+      #t88.{core::List::add}(#t90);
+    }
+  } =>#t88;
+  core::Map<core::num, core::int> map100 = block {
+    final core::Map<core::num, core::int> #t91 = <core::num, core::int>{};
+    for (final core::MapEntry<dynamic, dynamic> #t92 in mapIntNum.{core::Map::entries}) {
+      final core::num #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num;
+      final core::int #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int;
+      #t91.{core::Map::[]=}(#t93, #t94);
+    }
+  } =>#t91;
+  core::List<core::int> list110 = block {
+    final core::List<core::int> #t95 = <core::int>[];
+    for (final dynamic #t96 in dynVar as{TypeError} core::Iterable<dynamic>) {
+      final core::int #t97 = #t96 as{TypeError} core::int;
+      #t95.{core::List::add}(#t97);
+    }
+  } =>#t95;
+  core::Map<core::num, core::int> map110 = block {
+    final core::Map<core::num, core::int> #t98 = <core::num, core::int>{};
+    for (final core::MapEntry<dynamic, dynamic> #t99 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
+      final core::num #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num;
+      final core::int #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int;
+      #t98.{core::Map::[]=}(#t100, #t101);
+    }
+  } =>#t98;
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect b/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect
index d9fbaef..838f328 100644
--- a/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect
+++ b/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect
@@ -2,104 +2,102 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:48:76: Error: Not enough type information to disambiguate between literal set and literal map.
+// pkg/front_end/testcases/spread_collection_inference.dart:53:28: Error: Not enough type information to disambiguate between literal set and literal map.
 // Try providing type arguments for the literal explicitly to disambiguate it.
-//   dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
-//                                                                            ^
+//   dynamic map21ambiguous = {...
+//                            ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:72:76: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
-//   dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
-//                                                                            ^
-// pkg/front_end/testcases/spread_collection_inference.dart:73:5: Context: Iterable spread.
-//     spread, ...mapSpread};
-//     ^
-// pkg/front_end/testcases/spread_collection_inference.dart:73:16: Context: Map spread.
-//     spread, ...mapSpread};
-//                ^
+// pkg/front_end/testcases/spread_collection_inference.dart:77:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   dynamic map24ambiguous = {...
+//                            ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:75:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:80:33: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
 //  - 'List' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
-//                                                              ^
+//   int lhs30 = /*@typeArgs=int*/ [...spread];
+//                                 ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:77:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:82:33: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
 //  - 'Set' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
-//                                                              ^
+//   int set30 = /*@typeArgs=int*/ {...spread, 42};
+//                                 ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:80:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:85:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
 //  - 'Set' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     {...spread};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:83:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:88:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
 //  - 'Map' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     {...mapSpread, "baz": 42};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:86:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+// pkg/front_end/testcases/spread_collection_inference.dart:91:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
 //  - 'Map' is from 'dart:core'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     {...mapSpread};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:89:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:94:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadInt];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:92:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:97:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadInt};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:95:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
-//     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadInt};
-//                                           ^
+// pkg/front_end/testcases/spread_collection_inference.dart:100:2: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+//  notSpreadInt};
+//  ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:98:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:103:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadFunction];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:101:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+// pkg/front_end/testcases/spread_collection_inference.dart:106:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
 //     notSpreadFunction};
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:104:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
-//     /*@error=SpreadMapEntryTypeMismatch*/ notSpreadFunction};
-//                                           ^
+// pkg/front_end/testcases/spread_collection_inference.dart:109:2: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
+//  notSpreadFunction};
+//  ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:107:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+// pkg/front_end/testcases/spread_collection_inference.dart:112:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
 //     spread];
 //     ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:109:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-//   Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
-//                                                                         ^
+// pkg/front_end/testcases/spread_collection_inference.dart:114:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+//   Set<String> set60 = <String>{... spread};
+//                                    ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:112:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
-//     /*@error=SpreadMapEntryElementKeyTypeMismatch*/ mapSpread};
-//                                                     ^
+// pkg/front_end/testcases/spread_collection_inference.dart:117:2: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
+//  mapSpread};
+//  ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:115:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
-//     /*@error=SpreadMapEntryElementValueTypeMismatch*/ mapSpread};
-//                                                       ^
+// pkg/front_end/testcases/spread_collection_inference.dart:120:2: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
+//  mapSpread};
+//  ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:117:67: Error: Can't spread a value with static type Null.
-//   List<int> lhs70 = <int>[... /*@error=NonNullAwareSpreadIsNull*/ null];
-//                                                                   ^
+// pkg/front_end/testcases/spread_collection_inference.dart:122:31: Error: Can't spread a value with static type Null.
+//   List<int> lhs70 = <int>[... null];
+//                               ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:119:66: Error: Can't spread a value with static type Null.
-//   Set<int> set70 = <int>{... /*@error=NonNullAwareSpreadIsNull*/ null};
-//                                                                  ^
+// pkg/front_end/testcases/spread_collection_inference.dart:124:30: Error: Can't spread a value with static type Null.
+//   Set<int> set70 = <int>{... null};
+//                              ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:122:46: Error: Can't spread a value with static type Null.
-//     {... /*@error=NonNullAwareSpreadIsNull*/ null, ... /*@typeArgs=dynamic*/
-//                                              ^
+// pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Can't spread a value with static type Null.
+//     {... null, ... /*@typeArgs=dynamic*/
+//          ^
 //
-// pkg/front_end/testcases/spread_collection_inference.dart:126:5: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Expected ',' before this.
+//     {... null, ... /*@typeArgs=dynamic*/
+//          ^
+//
+// pkg/front_end/testcases/spread_collection_inference.dart:131:5: Error: Can't spread a value with static type Null.
 //     null};
 //     ^
 //
@@ -107,11 +105,15 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-static method foo() → dynamic {
+static method bar<K extends core::Object = dynamic, V extends core::Object = dynamic>() → core::Map<self::bar::K, self::bar::V>
+  return null;
+static method foo(dynamic dynVar) → dynamic {
   core::List<core::int> spread = <core::int>[1, 2, 3];
   core::Map<core::String, core::int> mapSpread = <core::String, core::int>{"foo": 4, "bar": 2};
   core::int notSpreadInt = 42;
   () → core::int notSpreadFunction = null;
+  core::Map<core::int, core::num> mapIntNum = <core::int, core::num>{42: 42};
+  core::List<core::num> listNum = <core::num>[42];
   core::List<dynamic> lhs10 = block {
     final core::List<dynamic> #t1 = <dynamic>[];
     for (final dynamic #t2 in <dynamic>[])
@@ -145,209 +147,258 @@
   } =>#t11;
   core::Set<core::int> set20ambiguous = block {
     final core::Set<core::int> #t13 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t14 in spread)
-      #t13.{core::Set::add}(#t14);
+    for (final dynamic #t14 in spread) {
+      final core::int #t15 = #t14 as{TypeError} core::int;
+      #t13.{core::Set::add}(#t15);
+    }
   } =>#t13;
   core::Map<core::String, core::int> map20 = block {
-    final core::Map<core::String, core::int> #t15 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t16 in mapSpread.{core::Map::entries})
-      #t15.{core::Map::[]=}(#t16.{core::MapEntry::key}, #t16.{core::MapEntry::value});
-    #t15.{core::Map::[]=}("baz", 42);
-  } =>#t15;
+    final core::Map<core::String, core::int> #t16 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t17 in mapSpread.{core::Map::entries})
+      #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+    #t16.{core::Map::[]=}("baz", 42);
+  } =>#t16;
   core::Map<core::String, core::int> map20ambiguous = block {
-    final core::Map<core::String, core::int> #t17 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t18 in mapSpread.{core::Map::entries})
-      #t17.{core::Map::[]=}(#t18.{core::MapEntry::key}, #t18.{core::MapEntry::value});
-  } =>#t17;
+    final core::Map<core::String, core::int> #t18 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t19 in mapSpread.{core::Map::entries})
+      #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+  } =>#t18;
   core::List<dynamic> lhs21 = block {
-    final core::List<dynamic> #t19 = <dynamic>[];
-    for (final dynamic #t20 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t19.{core::List::add}(#t20);
-  } =>#t19;
+    final core::List<dynamic> #t20 = <dynamic>[];
+    for (final dynamic #t21 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
+      #t20.{core::List::add}(#t21);
+  } =>#t20;
   core::Set<dynamic> set21 = block {
-    final core::Set<dynamic> #t21 = col::LinkedHashSet::•<dynamic>();
-    for (final dynamic #t22 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t21.{core::Set::add}(#t22);
-    #t21.{core::Set::add}(42);
-  } =>#t21;
+    final core::Set<dynamic> #t22 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t23 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
+      #t22.{core::Set::add}(#t23);
+    #t22.{core::Set::add}(42);
+  } =>#t22;
   core::Map<dynamic, dynamic> map21 = block {
-    final core::Map<dynamic, dynamic> #t23 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t24 in ((mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries})
-      #t23.{core::Map::[]=}(#t24.{core::MapEntry::key}, #t24.{core::MapEntry::value});
-    #t23.{core::Map::[]=}("baz", 42);
-  } =>#t23;
-  dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:48:76: Error: Not enough type information to disambiguate between literal set and literal map.
+    final core::Map<dynamic, dynamic> #t24 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic> #t25 in ((mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries})
+      #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
+    #t24.{core::Map::[]=}("baz", 42);
+  } =>#t24;
+  dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:53:28: Error: Not enough type information to disambiguate between literal set and literal map.
 Try providing type arguments for the literal explicitly to disambiguate it.
-  dynamic map21ambiguous = /*@error=CantDisambiguateNotEnoughInformation*/ {...
-                                                                           ^";
+  dynamic map21ambiguous = {...
+                           ^";
   core::List<core::int> lhs22 = block {
-    final core::List<core::int> #t25 = <core::int>[];
-    for (final core::int #t26 in <core::int>[])
-      #t25.{core::List::add}(#t26);
-  } =>#t25;
+    final core::List<core::int> #t26 = <core::int>[];
+    for (final core::int #t27 in <core::int>[])
+      #t26.{core::List::add}(#t27);
+  } =>#t26;
   core::Set<core::int> set22 = block {
-    final core::Set<core::int> #t27 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t28 in <core::int>[])
-      #t27.{core::Set::add}(#t28);
-    #t27.{core::Set::add}(42);
-  } =>#t27;
+    final core::Set<core::int> #t28 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t29 in <core::int>[])
+      #t28.{core::Set::add}(#t29);
+    #t28.{core::Set::add}(42);
+  } =>#t28;
   core::Set<core::int> set22ambiguous = block {
-    final core::Set<core::int> #t29 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t30 in <core::int>[])
-      #t29.{core::Set::add}(#t30);
-  } =>#t29;
+    final core::Set<core::int> #t30 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t31 in <core::int>[]) {
+      final core::int #t32 = #t31 as{TypeError} core::int;
+      #t30.{core::Set::add}(#t32);
+    }
+  } =>#t30;
   core::Map<core::String, core::int> map22 = block {
-    final core::Map<core::String, core::int> #t31 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t32 in <core::String, core::int>{}.{core::Map::entries})
-      #t31.{core::Map::[]=}(#t32.{core::MapEntry::key}, #t32.{core::MapEntry::value});
-  } =>#t31;
-  core::List<core::List<core::int>> lhs23 = block {
-    final core::List<core::List<core::int>> #t33 = <core::List<core::int>>[];
-    for (final core::List<core::int> #t34 in <core::List<core::int>>[<core::int>[]])
-      #t33.{core::List::add}(#t34);
+    final core::Map<core::String, core::int> #t33 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t34 in <core::String, core::int>{}.{core::Map::entries})
+      #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
   } =>#t33;
-  core::Set<core::List<core::int>> set23 = block {
-    final core::Set<core::List<core::int>> #t35 = col::LinkedHashSet::•<core::List<core::int>>();
+  core::List<core::List<core::int>> lhs23 = block {
+    final core::List<core::List<core::int>> #t35 = <core::List<core::int>>[];
     for (final core::List<core::int> #t36 in <core::List<core::int>>[<core::int>[]])
-      #t35.{core::Set::add}(#t36);
-    #t35.{core::Set::add}(<core::int>[42]);
+      #t35.{core::List::add}(#t36);
   } =>#t35;
-  core::Set<core::List<core::int>> set23ambiguous = block {
+  core::Set<core::List<core::int>> set23 = block {
     final core::Set<core::List<core::int>> #t37 = col::LinkedHashSet::•<core::List<core::int>>();
     for (final core::List<core::int> #t38 in <core::List<core::int>>[<core::int>[]])
       #t37.{core::Set::add}(#t38);
+    #t37.{core::Set::add}(<core::int>[42]);
   } =>#t37;
-  core::Map<core::String, core::List<core::int>> map23 = block {
-    final core::Map<core::String, core::List<core::int>> #t39 = <core::String, core::List<core::int>>{};
-    for (final core::MapEntry<core::String, core::List<core::int>> #t40 in <core::String, core::List<core::int>>{"baz": <core::int>[]}.{core::Map::entries})
-      #t39.{core::Map::[]=}(#t40.{core::MapEntry::key}, #t40.{core::MapEntry::value});
+  core::Set<core::List<core::int>> set23ambiguous = block {
+    final core::Set<core::List<core::int>> #t39 = col::LinkedHashSet::•<core::List<core::int>>();
+    for (final dynamic #t40 in <core::List<core::int>>[<core::int>[]]) {
+      final core::List<core::int> #t41 = #t40 as{TypeError} core::List<core::int>;
+      #t39.{core::Set::add}(#t41);
+    }
   } =>#t39;
-  dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:72:76: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
-  dynamic map24ambiguous = /*@error=CantDisambiguateAmbiguousInformation*/ {...
-                                                                           ^";
-  core::int lhs30 = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:75:62: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+  core::Map<core::String, core::List<core::int>> map23 = block {
+    final core::Map<core::String, core::List<core::int>> #t42 = <core::String, core::List<core::int>>{};
+    for (final core::MapEntry<core::String, core::List<core::int>> #t43 in <core::String, core::List<core::int>>{"baz": <core::int>[]}.{core::Map::entries})
+      #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+  } =>#t42;
+  dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:77:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  dynamic map24ambiguous = {...
+                           ^";
+  core::int lhs30 = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:80:33: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
  - 'List' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  int lhs30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ [...spread];
-                                                             ^" in ( block {
-    final core::List<core::int> #t42 = <core::int>[];
-    for (final core::int #t43 in spread)
-      #t42.{core::List::add}(#t43);
-  } =>#t42) as{TypeError} core::int;
-  core::int set30 = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:77:62: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+  int lhs30 = /*@typeArgs=int*/ [...spread];
+                                ^" in ( block {
+    final core::List<core::int> #t45 = <core::int>[];
+    for (final core::int #t46 in spread)
+      #t45.{core::List::add}(#t46);
+  } =>#t45) as{TypeError} core::int;
+  core::int set30 = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:82:33: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  int set30 = /*@error=InvalidAssignment*/ /*@typeArgs=int*/ {...spread, 42};
-                                                             ^" in ( block {
-    final core::Set<core::int> #t45 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t46 in spread)
-      #t45.{core::Set::add}(#t46);
-    #t45.{core::Set::add}(42);
-  } =>#t45) as{TypeError} core::int;
-  core::int set30ambiguous = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:80:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+  int set30 = /*@typeArgs=int*/ {...spread, 42};
+                                ^" in ( block {
+    final core::Set<core::int> #t48 = col::LinkedHashSet::•<core::int>();
+    for (final core::int #t49 in spread)
+      #t48.{core::Set::add}(#t49);
+    #t48.{core::Set::add}(42);
+  } =>#t48) as{TypeError} core::int;
+  core::int set30ambiguous = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:85:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
  - 'Set' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     {...spread};
     ^" in ( block {
-    final core::Set<core::int> #t48 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t49 in spread)
-      #t48.{core::Set::add}(#t49);
-  } =>#t48) as{TypeError} core::int;
-  core::int map30 = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:83:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+    final core::Set<core::int> #t51 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t52 in spread) {
+      final core::int #t53 = #t52 as{TypeError} core::int;
+      #t51.{core::Set::add}(#t53);
+    }
+  } =>#t51) as{TypeError} core::int;
+  core::int map30 = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:88:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     {...mapSpread, \"baz\": 42};
     ^" in ( block {
-    final core::Map<core::String, core::int> #t51 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t52 in mapSpread.{core::Map::entries})
-      #t51.{core::Map::[]=}(#t52.{core::MapEntry::key}, #t52.{core::MapEntry::value});
-    #t51.{core::Map::[]=}("baz", 42);
-  } =>#t51) as{TypeError} core::int;
-  core::int map30ambiguous = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:86:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+    final core::Map<core::String, core::int> #t55 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t56 in mapSpread.{core::Map::entries})
+      #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
+    #t55.{core::Map::[]=}("baz", 42);
+  } =>#t55) as{TypeError} core::int;
+  core::int map30ambiguous = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:91:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
  - 'Map' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     {...mapSpread};
     ^" in ( block {
-    final core::Map<core::String, core::int> #t54 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t55 in mapSpread.{core::Map::entries})
-      #t54.{core::Map::[]=}(#t55.{core::MapEntry::key}, #t55.{core::MapEntry::value});
-  } =>#t54) as{TypeError} core::int;
-  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:89:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+    final core::Map<core::String, core::int> #t58 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t59 in mapSpread.{core::Map::entries})
+      #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
+  } =>#t58) as{TypeError} core::int;
+  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:94:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadInt];
     ^"];
-  core::Set<dynamic> set40 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:92:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic> set40 = let final core::Set<dynamic> #t60 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:97:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadInt};
-    ^") in #t56;
-  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:95:43: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
-    /*@error=SpreadMapEntryTypeMismatch*/ notSpreadInt};
-                                          ^": null};
-  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:98:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+    ^") in #t60;
+  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:100:2: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+ notSpreadInt};
+ ^": null};
+  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:103:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadFunction];
     ^"];
-  core::Set<dynamic> set50 = let final core::Set<dynamic> #t58 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t59 = #t58.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:101:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic> set50 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:106:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
     notSpreadFunction};
-    ^") in #t58;
-  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:104:43: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
-    /*@error=SpreadMapEntryTypeMismatch*/ notSpreadFunction};
-                                          ^": null};
-  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:107:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+    ^") in #t62;
+  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:109:2: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
+ notSpreadFunction};
+ ^": null};
+  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:112:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
     spread];
     ^"];
-  core::Set<core::String> set60 = let final core::Set<core::String> #t60 = col::LinkedHashSet::•<core::String>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:109:73: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-  Set<String> set60 = <String>{... /*@error=SpreadElementTypeMismatch*/ spread};
-                                                                        ^") in #t60;
-  core::Map<core::int, core::int> map60 = <core::int, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:112:53: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
-    /*@error=SpreadMapEntryElementKeyTypeMismatch*/ mapSpread};
-                                                    ^": null};
-  core::Map<core::String, core::String> map61 = <core::String, core::String>{null: invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:115:55: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
-    /*@error=SpreadMapEntryElementValueTypeMismatch*/ mapSpread};
-                                                      ^"};
-  core::List<core::int> lhs70 = <core::int>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:117:67: Error: Can't spread a value with static type Null.
-  List<int> lhs70 = <int>[... /*@error=NonNullAwareSpreadIsNull*/ null];
-                                                                  ^"];
-  core::Set<core::int> set70 = let final core::Set<core::int> #t62 = col::LinkedHashSet::•<core::int>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:119:66: Error: Can't spread a value with static type Null.
-  Set<int> set70 = <int>{... /*@error=NonNullAwareSpreadIsNull*/ null};
-                                                                 ^") in #t62;
+  core::Set<core::String> set60 = let final core::Set<core::String> #t64 = col::LinkedHashSet::•<core::String>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:114:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  Set<String> set60 = <String>{... spread};
+                                   ^") in #t64;
+  core::Map<core::int, core::int> map60 = <core::int, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:117:2: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
+ mapSpread};
+ ^": null};
+  core::Map<core::String, core::String> map61 = <core::String, core::String>{null: invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:120:2: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
+ mapSpread};
+ ^"};
+  core::List<core::int> lhs70 = <core::int>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:122:31: Error: Can't spread a value with static type Null.
+  List<int> lhs70 = <int>[... null];
+                              ^"];
+  core::Set<core::int> set70 = let final core::Set<core::int> #t66 = col::LinkedHashSet::•<core::int>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:124:30: Error: Can't spread a value with static type Null.
+  Set<int> set70 = <int>{... null};
+                             ^") in #t66;
   core::Set<dynamic> set71ambiguous = block {
-    final core::Set<dynamic> #t64 = col::LinkedHashSet::•<dynamic>();
-    #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:122:46: Error: Can't spread a value with static type Null.
-    {... /*@error=NonNullAwareSpreadIsNull*/ null, ... /*@typeArgs=dynamic*/
-                                             ^");
-    for (final dynamic #t65 in <dynamic>[])
-      #t64.{core::Set::add}(#t65);
-  } =>#t64;
-  core::Map<core::String, core::int> map70 = <core::String, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:126:5: Error: Can't spread a value with static type Null.
+    final core::Set<dynamic> #t68 = col::LinkedHashSet::•<dynamic>();
+    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Expected ',' before this.
+    {... null, ... /*@typeArgs=dynamic*/
+         ^");
+    for (final dynamic #t69 in <dynamic>[]) {
+      final dynamic #t70 = #t69 as{TypeError} dynamic;
+      #t68.{core::Set::add}(#t70);
+    }
+  } =>#t68;
+  core::Map<core::String, core::int> map70 = <core::String, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:131:5: Error: Can't spread a value with static type Null.
     null};
     ^": null};
   core::List<core::int> lhs80 = block {
-    final core::List<core::int> #t66 = <core::int>[];
-    final dynamic #t67 = null;
-    if(!#t67.{core::Object::==}(null))
-      for (final core::int #t68 in #t67)
-        #t66.{core::List::add}(#t68);
-  } =>#t66;
+    final core::List<core::int> #t71 = <core::int>[];
+    final dynamic #t72 = null;
+    if(!#t72.{core::Object::==}(null))
+      for (final core::int #t73 in #t72)
+        #t71.{core::List::add}(#t73);
+  } =>#t71;
   core::Set<core::int> set80 = block {
-    final core::Set<core::int> #t69 = col::LinkedHashSet::•<core::int>();
-    final dynamic #t70 = null;
-    if(!#t70.{core::Object::==}(null))
-      for (final core::int #t71 in #t70)
-        #t69.{core::Set::add}(#t71);
-  } =>#t69;
+    final core::Set<core::int> #t74 = col::LinkedHashSet::•<core::int>();
+    final dynamic #t75 = null;
+    if(!#t75.{core::Object::==}(null))
+      for (final core::int #t76 in #t75)
+        #t74.{core::Set::add}(#t76);
+  } =>#t74;
   core::Set<dynamic> set81ambiguous = block {
-    final core::Set<dynamic> #t72 = col::LinkedHashSet::•<dynamic>();
-    final dynamic #t73 = null;
-    if(!#t73.{core::Object::==}(null))
-      for (final dynamic #t74 in #t73)
-        #t72.{core::Set::add}(#t74);
-    for (final dynamic #t75 in <dynamic>[])
-      #t72.{core::Set::add}(#t75);
-  } =>#t72;
+    final core::Set<dynamic> #t77 = col::LinkedHashSet::•<dynamic>();
+    final dynamic #t78 = null;
+    if(!#t78.{core::Object::==}(null))
+      for (final dynamic #t79 in #t78) {
+        final dynamic #t80 = #t79 as{TypeError} dynamic;
+        #t77.{core::Set::add}(#t80);
+      }
+    for (final dynamic #t81 in <dynamic>[]) {
+      final dynamic #t82 = #t81 as{TypeError} dynamic;
+      #t77.{core::Set::add}(#t82);
+    }
+  } =>#t77;
   core::Map<core::String, core::int> map80 = block {
-    final core::Map<core::String, core::int> #t76 = <core::String, core::int>{};
-    final core::Map<dynamic, dynamic> #t77 = null;
-    if(!#t77.{core::Object::==}(null))
-      for (final core::MapEntry<core::String, core::int> #t78 in #t77.{core::Map::entries})
-        #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
-  } =>#t76;
+    final core::Map<core::String, core::int> #t83 = <core::String, core::int>{};
+    final core::Map<dynamic, dynamic> #t84 = null;
+    if(!#t84.{core::Object::==}(null))
+      for (final core::MapEntry<core::String, core::int> #t85 in #t84.{core::Map::entries})
+        #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
+  } =>#t83;
+  core::Map<core::String, core::int> map90 = block {
+    final core::Map<core::String, core::int> #t86 = <core::String, core::int>{};
+    for (final core::MapEntry<core::String, core::int> #t87 in self::bar<core::String, core::int>().{core::Map::entries})
+      #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+  } =>#t86;
+  core::List<core::int> list100 = block {
+    final core::List<core::int> #t88 = <core::int>[];
+    for (final dynamic #t89 in listNum) {
+      final core::int #t90 = #t89 as{TypeError} core::int;
+      #t88.{core::List::add}(#t90);
+    }
+  } =>#t88;
+  core::Map<core::num, core::int> map100 = block {
+    final core::Map<core::num, core::int> #t91 = <core::num, core::int>{};
+    for (final core::MapEntry<dynamic, dynamic> #t92 in mapIntNum.{core::Map::entries}) {
+      final core::num #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num;
+      final core::int #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int;
+      #t91.{core::Map::[]=}(#t93, #t94);
+    }
+  } =>#t91;
+  core::List<core::int> list110 = block {
+    final core::List<core::int> #t95 = <core::int>[];
+    for (final dynamic #t96 in dynVar as{TypeError} core::Iterable<dynamic>) {
+      final core::int #t97 = #t96 as{TypeError} core::int;
+      #t95.{core::List::add}(#t97);
+    }
+  } =>#t95;
+  core::Map<core::num, core::int> map110 = block {
+    final core::Map<core::num, core::int> #t98 = <core::num, core::int>{};
+    for (final core::MapEntry<dynamic, dynamic> #t99 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
+      final core::num #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num;
+      final core::int #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int;
+      #t98.{core::Map::[]=}(#t100, #t101);
+    }
+  } =>#t98;
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/strong.status b/front_end/testcases/strong.status
index d89dded..79ac736 100644
--- a/front_end/testcases/strong.status
+++ b/front_end/testcases/strong.status
@@ -33,6 +33,7 @@
 inference/constructors_too_many_positional_arguments: InstrumentationMismatch # Issue #30040
 inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer: TypeCheckError
 inference/downwards_inference_annotations_type_variable: InstrumentationMismatch # Issue 28981
+inference/downwards_inference_for_each: RuntimeError # Issue #36382
 inference/downwards_inference_on_function_of_t_using_the_t: InstrumentationMismatch # Issue #29798
 inference/downwards_inference_on_list_literals_infer_downwards: RuntimeError
 inference/future_then_explicit_future: InstrumentationMismatch # Issue #30040
@@ -58,9 +59,8 @@
 inference/override_equals: RuntimeError
 inference/unresolved_super: TypeCheckError
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: InstrumentationMismatch # Issue #25824
-inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: InstrumentationMismatch # Issue #25824
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: InstrumentationMismatch # Issue #25824
-inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: InstrumentationMismatch # Issue #25824
+inference_new/dependency_only_if_overloaded: TypeCheckError
 inference_new/infer_assign_to_index_super_upwards: TypeCheckError
 inference_new/infer_assign_to_index_this_upwards: TypeCheckError
 inference_new/infer_assign_to_index_upwards: TypeCheckError
@@ -68,13 +68,15 @@
 inference_new/infer_field_getter_setter_mismatch: TypeCheckError
 inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
 inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
-instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected
+inference_new/strongly_connected_component: TypeCheckError
 instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # Expected
+instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected
 invalid_type: TypeCheckError
 invocations: RuntimeError
 issue34899: TypeCheckError
 micro: RuntimeError
 mixin_application_override: TypeCheckError
+operator_method_not_found: RuntimeError # Expected
 optional: TypeCheckError
 override_check_accessor_after_inference: TypeCheckError # Issue #31620
 override_check_accessor_basic: TypeCheckError # Issue #31620
@@ -85,7 +87,7 @@
 rasta/abstract_constructor: RuntimeError
 rasta/bad_constructor_redirection: RuntimeError
 rasta/bad_continue: RuntimeError
-rasta/bad_default_constructor: VerificationError
+rasta/bad_default_constructor: RuntimeError
 rasta/bad_explicit_super_constructor: RuntimeError
 rasta/bad_implicit_super_constructor: RuntimeError
 rasta/bad_interpolation: RuntimeError
@@ -104,7 +106,7 @@
 rasta/issue_000032: RuntimeError
 rasta/issue_000034: RuntimeError
 rasta/issue_000036: RuntimeError
-rasta/issue_000039: VerificationError
+rasta/issue_000039: RuntimeError
 rasta/issue_000041: RuntimeError
 rasta/issue_000042: RuntimeError
 rasta/issue_000043: RuntimeError
@@ -131,7 +133,6 @@
 regress/issue_29982: RuntimeError # Tests runtime behavior of error recovery.
 regress/issue_30836: RuntimeError # Issue 30836.
 regress/issue_31299: TypeCheckError
-regress/issue_32200: RuntimeError # Invalid type.
 regress/issue_32972: TypeCheckError
 regress/issue_33452: RuntimeError # Test has an intentional error
 regress/issue_34225: RuntimeError
@@ -141,6 +142,10 @@
 regress/issue_35259: RuntimeError # Expected
 regress/issue_35260: RuntimeError # Expected
 regress/issue_35266: RuntimeError # Expected
+regress/issue_36400: RuntimeError
+regress/issue_36647: RuntimeError # Expected
+regress/issue_36647_2: RuntimeError # Expected
+regress/issue_36669: RuntimeError
 reject_generic_function_types_in_bounds: RuntimeError # Expected
 runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError
 runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
@@ -149,8 +154,8 @@
 set_literals/disambiguation_rule: RuntimeError
 spread_collection: RuntimeError
 statements: Crash
+type_parameter_type_named_int: RuntimeError # Expected
 type_variable_as_super: RuntimeError
-type_variable_prefix: RuntimeError
 unsound_promotion: RuntimeError
 void_methods: ExpectationFileMismatch
 warn_unresolved_sends: InstrumentationMismatch # Test assumes Dart 1.0 semantics
diff --git a/front_end/testcases/text_serialization.status b/front_end/testcases/text_serialization.status
index 4d5dc75..25584dc 100644
--- a/front_end/testcases/text_serialization.status
+++ b/front_end/testcases/text_serialization.status
@@ -67,6 +67,8 @@
 constructor_initializer_invalid: TextSerializationFailure # Was: RuntimeError # Fails execution after recovery
 continue_inference_after_error: TextSerializationFailure # Was: Pass
 continue_inference_after_error_lib: TextSerializationFailure # Was: Pass
+control_flow_collection: TextSerializationFailure
+control_flow_collection_inference: TextSerializationFailure
 covariant_generic: TextSerializationFailure # Was: RuntimeError
 cycles: TextSerializationFailure # Was: Pass
 default_values: TextSerializationFailure # Was: Pass
@@ -525,9 +527,11 @@
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param: TextSerializationFailure # Was: Pass
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: InstrumentationMismatch # Issue #25824
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: InstrumentationMismatch # Issue #25824
+inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: TextSerializationFailure
 inference/unsafe_block_closure_inference_function_call_explicit_type_param: TextSerializationFailure # Was: Pass
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: InstrumentationMismatch # Issue #25824
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: InstrumentationMismatch # Issue #25824
+inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: TextSerializationFailure
 inference/unsafe_block_closure_inference_function_call_implicit_type_param: TextSerializationFailure # Was: Pass
 inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr: TextSerializationFailure # Was: Pass
 inference/unsafe_block_closure_inference_function_call_no_type_param: TextSerializationFailure # Was: Pass
@@ -546,6 +550,7 @@
 inference_new/const_invocation: TextSerializationFailure # Was: Pass
 inference_new/dependency_only_if_generic_method: TextSerializationFailure # Was: Pass
 inference_new/dependency_only_if_overloaded: TextSerializationFailure # Was: Pass
+inference_new/dependency_only_if_overloaded: TypeCheckError
 inference_new/do_loop: TextSerializationFailure # Was: Pass
 inference_new/downwards_inference_inside_top_level: TextSerializationFailure # Was: Pass
 inference_new/downwards_inference_inside_top_level_2: TextSerializationFailure # Was: Pass
@@ -593,6 +598,7 @@
 inference_new/property_get_toplevel: TextSerializationFailure # Was: Pass
 inference_new/static_assign_combiner: TextSerializationFailure # Was: Pass
 inference_new/strongly_connected_component: TextSerializationFailure # Was: Pass
+inference_new/strongly_connected_component: TypeCheckError
 inference_new/super_index_get: TextSerializationFailure # Was: Pass
 inference_new/super_index_get_substitution: TextSerializationFailure # Was: Pass
 inference_new/switch: TextSerializationFailure # Was: Pass
@@ -716,6 +722,7 @@
 no_such_method_private_setter: TextSerializationFailure # Was: Pass
 no_such_method_private_setter_lib: TextSerializationFailure # Was: Pass
 null_aware: TextSerializationFailure # Was: Pass
+operator_method_not_found: TextSerializationFailure
 operators: TextSerializationFailure # Was: Pass
 optional: TypeCheckError
 override: TextSerializationFailure # Was: Pass
@@ -745,7 +752,7 @@
 rasta/abstract_constructor: TextSerializationFailure # Was: RuntimeError
 rasta/bad_constructor_redirection: TextSerializationFailure # Was: RuntimeError
 rasta/bad_continue: TextSerializationFailure # Was: RuntimeError
-rasta/bad_default_constructor: VerificationError
+rasta/bad_default_constructor: TextSerializationFailure
 rasta/bad_explicit_super_constructor: TextSerializationFailure # Was: RuntimeError
 rasta/bad_implicit_super_constructor: TextSerializationFailure # Was: RuntimeError
 rasta/bad_interpolation: TextSerializationFailure # Was: RuntimeError
@@ -785,7 +792,7 @@
 rasta/issue_000035: TextSerializationFailure # Was: Pass
 rasta/issue_000035a: TextSerializationFailure # Was: Pass
 rasta/issue_000036: TextSerializationFailure # Was: RuntimeError
-rasta/issue_000039: VerificationError
+rasta/issue_000039: TextSerializationFailure
 rasta/issue_000041: TextSerializationFailure # Was: RuntimeError
 rasta/issue_000042: TextSerializationFailure # Was: RuntimeError
 rasta/issue_000043: TextSerializationFailure # Was: RuntimeError
@@ -912,6 +919,11 @@
 regress/issue_35260: TextSerializationFailure # Was: RuntimeError # Expected
 regress/issue_35266: TextSerializationFailure # Was: RuntimeError # Expected
 regress/issue_35900: TextSerializationFailure
+regress/issue_36400: TextSerializationFailure
+regress/issue_36647: TextSerializationFailure
+regress/issue_36647_2: TextSerializationFailure
+regress/issue_36793: TextSerializationFailure
+regress/issue_36669: TextSerializationFailure
 reject_generic_function_types_in_bounds: TextSerializationFailure # Was: RuntimeError # Expected
 return_with_unknown_type_in_context: TextSerializationFailure # Was: Pass
 runtime_checks/call_kinds: TextSerializationFailure # Was: Pass
@@ -996,6 +1008,7 @@
 top_level_accessors_part: TextSerializationFailure # Was: Pass
 top_level_library_method: TextSerializationFailure # Was: Pass
 type_of_null: TextSerializationFailure
+type_parameter_type_named_int: TextSerializationFailure
 type_variable_as_super: TextSerializationFailure # Was: RuntimeError
 type_variable_prefix: TextSerializationFailure # Was: RuntimeError
 type_variable_uses: TextSerializationFailure # Was: Pass
diff --git a/front_end/testcases/type_parameter_type_named_int.dart b/front_end/testcases/type_parameter_type_named_int.dart
new file mode 100644
index 0000000..af96c11
--- /dev/null
+++ b/front_end/testcases/type_parameter_type_named_int.dart
@@ -0,0 +1,15 @@
+// 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.
+
+abstract class Foo<T> {
+  List<T> get list;
+  void setList<T>(List<T> value);
+}
+
+class Bar implements Foo<int> {
+  List<int> list;
+  void setList<int>(List<int> value) {
+    list = value;
+  }
+}
diff --git a/front_end/testcases/type_parameter_type_named_int.dart.hierarchy.expect b/front_end/testcases/type_parameter_type_named_int.dart.hierarchy.expect
new file mode 100644
index 0000000..e128e2e
--- /dev/null
+++ b/front_end/testcases/type_parameter_type_named_int.dart.hierarchy.expect
@@ -0,0 +1,74 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Foo:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Foo.list
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Foo.setList
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Bar:
+  Longest path to Object: 2
+  superclasses:
+    Object
+  interfaces: Foo<int>
+  classMembers:
+    Bar.list
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Bar.setList
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    Bar.list
+  interfaceMembers:
+    Bar.list
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Bar.setList
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  interfaceSetters:
+    Bar.list
diff --git a/front_end/testcases/type_parameter_type_named_int.dart.legacy.expect b/front_end/testcases/type_parameter_type_named_int.dart.legacy.expect
new file mode 100644
index 0000000..1e2cdd2
--- /dev/null
+++ b/front_end/testcases/type_parameter_type_named_int.dart.legacy.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Foo<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T>
+    : super core::Object::•()
+    ;
+  abstract get list() → core::List<self::Foo::T>;
+  abstract method setList<T extends core::Object = dynamic>(core::List<self::Foo::setList::T> value) → void;
+}
+class Bar extends core::Object implements self::Foo<core::int> {
+  field core::List<core::int> list = null;
+  synthetic constructor •() → self::Bar
+    : super core::Object::•()
+    ;
+  method setList<int extends core::Object = dynamic>(core::List<self::Bar::setList::int> value) → void {
+    this.{self::Bar::list} = value;
+  }
+}
diff --git a/front_end/testcases/type_parameter_type_named_int.dart.legacy.transformed.expect b/front_end/testcases/type_parameter_type_named_int.dart.legacy.transformed.expect
new file mode 100644
index 0000000..1e2cdd2
--- /dev/null
+++ b/front_end/testcases/type_parameter_type_named_int.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Foo<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T>
+    : super core::Object::•()
+    ;
+  abstract get list() → core::List<self::Foo::T>;
+  abstract method setList<T extends core::Object = dynamic>(core::List<self::Foo::setList::T> value) → void;
+}
+class Bar extends core::Object implements self::Foo<core::int> {
+  field core::List<core::int> list = null;
+  synthetic constructor •() → self::Bar
+    : super core::Object::•()
+    ;
+  method setList<int extends core::Object = dynamic>(core::List<self::Bar::setList::int> value) → void {
+    this.{self::Bar::list} = value;
+  }
+}
diff --git a/front_end/testcases/type_parameter_type_named_int.dart.outline.expect b/front_end/testcases/type_parameter_type_named_int.dart.outline.expect
new file mode 100644
index 0000000..c6ca162
--- /dev/null
+++ b/front_end/testcases/type_parameter_type_named_int.dart.outline.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Foo<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T>
+    ;
+  abstract get list() → core::List<self::Foo::T>;
+  abstract method setList<T extends core::Object = dynamic>(core::List<self::Foo::setList::T> value) → void;
+}
+class Bar extends core::Object implements self::Foo<core::int> {
+  field core::List<core::int> list;
+  synthetic constructor •() → self::Bar
+    ;
+  method setList<int extends core::Object = dynamic>(core::List<self::Bar::setList::int> value) → void
+    ;
+}
diff --git a/front_end/testcases/type_parameter_type_named_int.dart.strong.expect b/front_end/testcases/type_parameter_type_named_int.dart.strong.expect
new file mode 100644
index 0000000..37066d6
--- /dev/null
+++ b/front_end/testcases/type_parameter_type_named_int.dart.strong.expect
@@ -0,0 +1,37 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/type_parameter_type_named_int.dart:13:12: Error: A value of type 'List<int/*1*/>' can't be assigned to a variable of type 'List<int/*2*/>'.
+//  - 'List' is from 'dart:core'.
+//  - 'int/*1*/' is from 'pkg/front_end/testcases/type_parameter_type_named_int.dart'.
+//  - 'int/*2*/' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
+//     list = value;
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Foo<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T>
+    : super core::Object::•()
+    ;
+  abstract get list() → core::List<self::Foo::T>;
+  abstract method setList<T extends core::Object = dynamic>(core::List<self::Foo::setList::T> value) → void;
+}
+class Bar extends core::Object implements self::Foo<core::int> {
+  field core::List<core::int> list = null;
+  synthetic constructor •() → self::Bar
+    : super core::Object::•()
+    ;
+  method setList<int extends core::Object = dynamic>(core::List<self::Bar::setList::int> value) → void {
+    this.{self::Bar::list} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/type_parameter_type_named_int.dart:13:12: Error: A value of type 'List<int/*1*/>' can't be assigned to a variable of type 'List<int/*2*/>'.
+ - 'List' is from 'dart:core'.
+ - 'int/*1*/' is from 'pkg/front_end/testcases/type_parameter_type_named_int.dart'.
+ - 'int/*2*/' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
+    list = value;
+           ^" in value as{TypeError} core::List<core::int>;
+  }
+}
diff --git a/front_end/testcases/type_parameter_type_named_int.dart.strong.transformed.expect b/front_end/testcases/type_parameter_type_named_int.dart.strong.transformed.expect
new file mode 100644
index 0000000..37066d6
--- /dev/null
+++ b/front_end/testcases/type_parameter_type_named_int.dart.strong.transformed.expect
@@ -0,0 +1,37 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/type_parameter_type_named_int.dart:13:12: Error: A value of type 'List<int/*1*/>' can't be assigned to a variable of type 'List<int/*2*/>'.
+//  - 'List' is from 'dart:core'.
+//  - 'int/*1*/' is from 'pkg/front_end/testcases/type_parameter_type_named_int.dart'.
+//  - 'int/*2*/' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
+//     list = value;
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Foo<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T>
+    : super core::Object::•()
+    ;
+  abstract get list() → core::List<self::Foo::T>;
+  abstract method setList<T extends core::Object = dynamic>(core::List<self::Foo::setList::T> value) → void;
+}
+class Bar extends core::Object implements self::Foo<core::int> {
+  field core::List<core::int> list = null;
+  synthetic constructor •() → self::Bar
+    : super core::Object::•()
+    ;
+  method setList<int extends core::Object = dynamic>(core::List<self::Bar::setList::int> value) → void {
+    this.{self::Bar::list} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/type_parameter_type_named_int.dart:13:12: Error: A value of type 'List<int/*1*/>' can't be assigned to a variable of type 'List<int/*2*/>'.
+ - 'List' is from 'dart:core'.
+ - 'int/*1*/' is from 'pkg/front_end/testcases/type_parameter_type_named_int.dart'.
+ - 'int/*2*/' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
+    list = value;
+           ^" in value as{TypeError} core::List<core::int>;
+  }
+}
diff --git a/front_end/testcases/type_variable_prefix.dart.strong.expect b/front_end/testcases/type_variable_prefix.dart.strong.expect
index 1ca7685..019571a 100644
--- a/front_end/testcases/type_variable_prefix.dart.strong.expect
+++ b/front_end/testcases/type_variable_prefix.dart.strong.expect
@@ -6,16 +6,6 @@
 //   T.String method() => "Hello, World!";
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'String' can't be assigned to a variable of type 'invalid-type'.
-// Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
-//   T.String method() => "Hello, World!";
-//                        ^
-//
-// pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   T.String s = new C().method();
-//                        ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -26,15 +16,9 @@
     : super core::Object::•()
     ;
   method method() → invalid-type
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'String' can't be assigned to a variable of type 'invalid-type'.
-Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
-  T.String method() => \"Hello, World!\";
-                       ^" in "Hello, World!" as{TypeError} invalid-type;
+    return "Hello, World!" as{TypeError} invalid-type;
 }
 static method main() → dynamic {
-  core::String s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  T.String s = new C().method();
-                       ^" in new self::C::•<dynamic>().{self::C::method}() as{TypeError} core::String;
+  core::String s = new self::C::•<dynamic>().{self::C::method}() as{TypeError} core::String;
   core::print(s);
 }
diff --git a/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect b/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
index 1ca7685..019571a 100644
--- a/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
+++ b/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
@@ -6,16 +6,6 @@
 //   T.String method() => "Hello, World!";
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'String' can't be assigned to a variable of type 'invalid-type'.
-// Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
-//   T.String method() => "Hello, World!";
-//                        ^
-//
-// pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   T.String s = new C().method();
-//                        ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -26,15 +16,9 @@
     : super core::Object::•()
     ;
   method method() → invalid-type
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'String' can't be assigned to a variable of type 'invalid-type'.
-Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
-  T.String method() => \"Hello, World!\";
-                       ^" in "Hello, World!" as{TypeError} invalid-type;
+    return "Hello, World!" as{TypeError} invalid-type;
 }
 static method main() → dynamic {
-  core::String s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  T.String s = new C().method();
-                       ^" in new self::C::•<dynamic>().{self::C::method}() as{TypeError} core::String;
+  core::String s = new self::C::•<dynamic>().{self::C::method}() as{TypeError} core::String;
   core::print(s);
 }
diff --git a/front_end/testcases/undefined.dart b/front_end/testcases/undefined.dart
index d94de88..6e2fc23 100644
--- a/front_end/testcases/undefined.dart
+++ b/front_end/testcases/undefined.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=error*/
-
 class C {
   var x;
   void f() {}
@@ -11,11 +9,11 @@
 
 void test(C c) {
   c.x;
-  c. /*@error=UndefinedGetter*/ y;
+  c.y;
   c.f();
-  c. /*@error=UndefinedMethod*/ g();
+  c.g();
   c.x = null;
-  c. /*@error=UndefinedSetter*/ y = null;
+  c.y = null;
 }
 
 main() {}
diff --git a/front_end/testcases/undefined.dart.strong.expect b/front_end/testcases/undefined.dart.strong.expect
index acd6f2d..cf77098 100644
--- a/front_end/testcases/undefined.dart.strong.expect
+++ b/front_end/testcases/undefined.dart.strong.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class 'C'.
+// pkg/front_end/testcases/undefined.dart:12:5: Error: The getter 'y' isn't defined for the class 'C'.
 //  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
-//   c. /*@error=UndefinedGetter*/ y;
-//                                 ^
+//   c.y;
+//     ^
 //
-// pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class 'C'.
+// pkg/front_end/testcases/undefined.dart:14:5: Error: The method 'g' isn't defined for the class 'C'.
 //  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'g'.
-//   c. /*@error=UndefinedMethod*/ g();
-//                                 ^
+//   c.g();
+//     ^
 //
-// pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class 'C'.
+// pkg/front_end/testcases/undefined.dart:16:5: Error: The setter 'y' isn't defined for the class 'C'.
 //  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
-//   c. /*@error=UndefinedSetter*/ y = null;
-//                                 ^
+//   c.y = null;
+//     ^
 //
 import self as self;
 import "dart:core" as core;
@@ -32,22 +32,22 @@
 }
 static method test(self::C c) → void {
   c.{self::C::x};
-  invalid-expression "pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class 'C'.
+  invalid-expression "pkg/front_end/testcases/undefined.dart:12:5: Error: The getter 'y' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
-  c. /*@error=UndefinedGetter*/ y;
-                                ^";
+  c.y;
+    ^";
   c.{self::C::f}();
-  invalid-expression "pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class 'C'.
+  invalid-expression "pkg/front_end/testcases/undefined.dart:14:5: Error: The method 'g' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'g'.
-  c. /*@error=UndefinedMethod*/ g();
-                                ^";
+  c.g();
+    ^";
   c.{self::C::x} = null;
-  invalid-expression "pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class 'C'.
+  invalid-expression "pkg/front_end/testcases/undefined.dart:16:5: Error: The setter 'y' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
-  c. /*@error=UndefinedSetter*/ y = null;
-                                ^";
+  c.y = null;
+    ^";
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/undefined.dart.strong.transformed.expect b/front_end/testcases/undefined.dart.strong.transformed.expect
index acd6f2d..cf77098 100644
--- a/front_end/testcases/undefined.dart.strong.transformed.expect
+++ b/front_end/testcases/undefined.dart.strong.transformed.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class 'C'.
+// pkg/front_end/testcases/undefined.dart:12:5: Error: The getter 'y' isn't defined for the class 'C'.
 //  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
-//   c. /*@error=UndefinedGetter*/ y;
-//                                 ^
+//   c.y;
+//     ^
 //
-// pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class 'C'.
+// pkg/front_end/testcases/undefined.dart:14:5: Error: The method 'g' isn't defined for the class 'C'.
 //  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'g'.
-//   c. /*@error=UndefinedMethod*/ g();
-//                                 ^
+//   c.g();
+//     ^
 //
-// pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class 'C'.
+// pkg/front_end/testcases/undefined.dart:16:5: Error: The setter 'y' isn't defined for the class 'C'.
 //  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
-//   c. /*@error=UndefinedSetter*/ y = null;
-//                                 ^
+//   c.y = null;
+//     ^
 //
 import self as self;
 import "dart:core" as core;
@@ -32,22 +32,22 @@
 }
 static method test(self::C c) → void {
   c.{self::C::x};
-  invalid-expression "pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class 'C'.
+  invalid-expression "pkg/front_end/testcases/undefined.dart:12:5: Error: The getter 'y' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
-  c. /*@error=UndefinedGetter*/ y;
-                                ^";
+  c.y;
+    ^";
   c.{self::C::f}();
-  invalid-expression "pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class 'C'.
+  invalid-expression "pkg/front_end/testcases/undefined.dart:14:5: Error: The method 'g' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'g'.
-  c. /*@error=UndefinedMethod*/ g();
-                                ^";
+  c.g();
+    ^";
   c.{self::C::x} = null;
-  invalid-expression "pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class 'C'.
+  invalid-expression "pkg/front_end/testcases/undefined.dart:16:5: Error: The setter 'y' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
-  c. /*@error=UndefinedSetter*/ y = null;
-                                ^";
+  c.y = null;
+    ^";
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/undefined_getter_in_compound_assignment.dart b/front_end/testcases/undefined_getter_in_compound_assignment.dart
index 1da15ad..c6b5b4d 100644
--- a/front_end/testcases/undefined_getter_in_compound_assignment.dart
+++ b/front_end/testcases/undefined_getter_in_compound_assignment.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.
 
-/*@testedFeatures=error*/
-
 class C {
   void set x(value) {}
 }
 
 void test(C c) {
   c.x = 1; // Ok
-  c. /*@error=UndefinedGetter*/ x += 1;
-  c. /*@error=UndefinedGetter*/ x ??= 1;
+  c.x += 1;
+  c.x ??= 1;
 }
 
 main() {}
diff --git a/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect b/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
index a86da13..35fb71c 100644
--- a/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
+++ b/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
@@ -2,17 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class 'C'.
+// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:11:5: Error: The getter 'x' isn't defined for the class 'C'.
 //  - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
-//   c. /*@error=UndefinedGetter*/ x += 1;
-//                                 ^
+//   c.x += 1;
+//     ^
 //
-// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class 'C'.
+// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:12:5: Error: The getter 'x' isn't defined for the class 'C'.
 //  - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
-//   c. /*@error=UndefinedGetter*/ x ??= 1;
-//                                 ^
+//   c.x ??= 1;
+//     ^
 //
 import self as self;
 import "dart:core" as core;
@@ -25,15 +25,15 @@
 }
 static method test(self::C c) → void {
   c.{self::C::x} = 1;
-  let final self::C #t1 = c in #t1.{self::C::x} = invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class 'C'.
+  let final self::C #t1 = c in #t1.{self::C::x} = invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:11:5: Error: The getter 'x' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
-  c. /*@error=UndefinedGetter*/ x += 1;
-                                ^".+(1);
-  let final self::C #t2 = c in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class 'C'.
+  c.x += 1;
+    ^".+(1);
+  let final self::C #t2 = c in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:12:5: Error: The getter 'x' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
-  c. /*@error=UndefinedGetter*/ x ??= 1;
-                                ^".{core::Object::==}(null) ?{dynamic} #t2.{self::C::x} = 1 : null;
+  c.x ??= 1;
+    ^".{core::Object::==}(null) ?{dynamic} #t2.{self::C::x} = 1 : null;
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect b/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
index a86da13..35fb71c 100644
--- a/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
+++ b/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class 'C'.
+// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:11:5: Error: The getter 'x' isn't defined for the class 'C'.
 //  - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
-//   c. /*@error=UndefinedGetter*/ x += 1;
-//                                 ^
+//   c.x += 1;
+//     ^
 //
-// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class 'C'.
+// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:12:5: Error: The getter 'x' isn't defined for the class 'C'.
 //  - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
-//   c. /*@error=UndefinedGetter*/ x ??= 1;
-//                                 ^
+//   c.x ??= 1;
+//     ^
 //
 import self as self;
 import "dart:core" as core;
@@ -25,15 +25,15 @@
 }
 static method test(self::C c) → void {
   c.{self::C::x} = 1;
-  let final self::C #t1 = c in #t1.{self::C::x} = invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class 'C'.
+  let final self::C #t1 = c in #t1.{self::C::x} = invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:11:5: Error: The getter 'x' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
-  c. /*@error=UndefinedGetter*/ x += 1;
-                                ^".+(1);
-  let final self::C #t2 = c in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class 'C'.
+  c.x += 1;
+    ^".+(1);
+  let final self::C #t2 = c in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:12:5: Error: The getter 'x' isn't defined for the class 'C'.
  - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
-  c. /*@error=UndefinedGetter*/ x ??= 1;
-                                ^".{core::Object::==}(null) ?{dynamic} #t2.{self::C::x} = 1 : null;
+  c.x ??= 1;
+    ^".{core::Object::==}(null) ?{dynamic} #t2.{self::C::x} = 1 : null;
 }
 static method main() → dynamic {}
diff --git a/front_end/testcases/warn_unresolved_sends.dart b/front_end/testcases/warn_unresolved_sends.dart
index a5be7f4..9591e28 100644
--- a/front_end/testcases/warn_unresolved_sends.dart
+++ b/front_end/testcases/warn_unresolved_sends.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*@testedFeatures=warning*/
 class C {
   var superField;
   superMethod() {}
diff --git a/front_end/testcases/warn_unresolved_sends.dart.legacy.expect b/front_end/testcases/warn_unresolved_sends.dart.legacy.expect
index 6a98a24..a170b83 100644
--- a/front_end/testcases/warn_unresolved_sends.dart.legacy.expect
+++ b/front_end/testcases/warn_unresolved_sends.dart.legacy.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:49:39: Warning: Getter not found: 'missingField'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:48:39: Warning: Getter not found: 'missingField'.
 //     this. /*@warning=GetterNotFound*/ missingField;
 //                                       ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:50:39: Warning: Setter not found: 'missingField'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:49:39: Warning: Setter not found: 'missingField'.
 //     this. /*@warning=SetterNotFound*/ missingField = 0;
 //                                       ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:51:39: Warning: Method not found: 'missingMethod'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:50:39: Warning: Method not found: 'missingMethod'.
 //     this. /*@warning=MethodNotFound*/ missingMethod();
 //                                       ^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:53:33: Warning: Getter not found: 'missingField'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:52:33: Warning: Getter not found: 'missingField'.
 //     /*@warning=GetterNotFound*/ missingField;
 //                                 ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:54:33: Warning: Setter not found: 'missingField'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:53:33: Warning: Setter not found: 'missingField'.
 //     /*@warning=SetterNotFound*/ missingField = 0;
 //                                 ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:55:33: Warning: Method not found: 'missingMethod'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:54:33: Warning: Method not found: 'missingMethod'.
 //     /*@warning=MethodNotFound*/ missingMethod();
 //                                 ^^^^^^^^^^^^^
 //
diff --git a/front_end/testcases/warn_unresolved_sends.dart.legacy.transformed.expect b/front_end/testcases/warn_unresolved_sends.dart.legacy.transformed.expect
index 6a98a24..a170b83 100644
--- a/front_end/testcases/warn_unresolved_sends.dart.legacy.transformed.expect
+++ b/front_end/testcases/warn_unresolved_sends.dart.legacy.transformed.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:49:39: Warning: Getter not found: 'missingField'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:48:39: Warning: Getter not found: 'missingField'.
 //     this. /*@warning=GetterNotFound*/ missingField;
 //                                       ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:50:39: Warning: Setter not found: 'missingField'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:49:39: Warning: Setter not found: 'missingField'.
 //     this. /*@warning=SetterNotFound*/ missingField = 0;
 //                                       ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:51:39: Warning: Method not found: 'missingMethod'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:50:39: Warning: Method not found: 'missingMethod'.
 //     this. /*@warning=MethodNotFound*/ missingMethod();
 //                                       ^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:53:33: Warning: Getter not found: 'missingField'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:52:33: Warning: Getter not found: 'missingField'.
 //     /*@warning=GetterNotFound*/ missingField;
 //                                 ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:54:33: Warning: Setter not found: 'missingField'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:53:33: Warning: Setter not found: 'missingField'.
 //     /*@warning=SetterNotFound*/ missingField = 0;
 //                                 ^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/warn_unresolved_sends.dart:55:33: Warning: Method not found: 'missingMethod'.
+// pkg/front_end/testcases/warn_unresolved_sends.dart:54:33: Warning: Method not found: 'missingMethod'.
 //     /*@warning=MethodNotFound*/ missingMethod();
 //                                 ^^^^^^^^^^^^^
 //
diff --git a/front_end/tool/fasta b/front_end/tool/fasta
index 465f05b..65b9ec4 100755
--- a/front_end/tool/fasta
+++ b/front_end/tool/fasta
@@ -62,4 +62,4 @@
 
 shift
 
-exec "${DART_VM}" "${EXTRA_VM_ARGS[@]}" -c "${SCRIPT}" "$@"
+exec "${DART_VM}" "${EXTRA_VM_ARGS[@]}" --enable-asserts "${SCRIPT}" "$@"
diff --git a/front_end/tool/perf.dart b/front_end/tool/perf.dart
index 553ffc6..b216937 100644
--- a/front_end/tool/perf.dart
+++ b/front_end/tool/perf.dart
@@ -18,6 +18,7 @@
 import 'dart:async';
 import 'dart:io' show Directory, File, Platform, exit;
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/physical_file_system.dart'
@@ -100,9 +101,9 @@
 /// Uses the diet-parser to parse only directives in [source].
 CompilationUnit parseDirectives(Source source) {
   var token = tokenize(source);
-  // TODO(jcollins-g): Make parser work with Fasta
-  var parser =
-      new Parser(source, AnalysisErrorListener.NULL_LISTENER, useFasta: false);
+  var featureSet = FeatureSet.fromEnableFlags([]);
+  var parser = new Parser(source, AnalysisErrorListener.NULL_LISTENER,
+      featureSet: featureSet);
   return parser.parseDirectives(token);
 }
 
@@ -122,7 +123,9 @@
 CompilationUnit parseFull(Source source) {
   var token = tokenize(source);
   parseTimer.start();
-  var parser = new Parser(source, AnalysisErrorListener.NULL_LISTENER);
+  var featureSet = FeatureSet.fromEnableFlags([]);
+  var parser = new Parser(source, AnalysisErrorListener.NULL_LISTENER,
+      featureSet: featureSet);
   var unit = parser.parseCompilationUnit(token);
   parseTimer.stop();
   return unit;
diff --git a/http_multi_server/BUILD.gn b/http_multi_server/BUILD.gn
index 5c028ab..ef2df22 100644
--- a/http_multi_server/BUILD.gn
+++ b/http_multi_server/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for http_multi_server-2.0.5
+# This file is generated by importer.py for http_multi_server-2.0.6
 
 import("//build/dart/dart_library.gni")
 
diff --git a/http_multi_server/CHANGELOG.md b/http_multi_server/CHANGELOG.md
index 2b737e1..c03d636 100644
--- a/http_multi_server/CHANGELOG.md
+++ b/http_multi_server/CHANGELOG.md
@@ -1,6 +1,11 @@
+## 2.0.6
+
+* If there is a problem starting a loopback Ipv6 server, don't keep the Ipv4
+  server open when throwing the exception.
+
 ## 2.0.5
 
-* Update SDK to 2.0.0-dev.
+* Update SDK constraints to `>=2.0.0-dev <3.0.0`.
 
 ## 2.0.4
 
diff --git a/http_multi_server/analysis_options.yaml b/http_multi_server/analysis_options.yaml
index a10d4c5..6f476fe 100644
--- a/http_multi_server/analysis_options.yaml
+++ b/http_multi_server/analysis_options.yaml
@@ -1,2 +1,44 @@
+include: package:pedantic/analysis_options.yaml
 analyzer:
-  strong-mode: true
+  strong-mode:
+    implicit-casts: false
+linter:
+  rules:
+    - avoid_empty_else
+    - avoid_init_to_null
+    - avoid_null_checks_in_equality_operators
+    - avoid_unused_constructor_parameters
+    - await_only_futures
+    - camel_case_types
+    - cancel_subscriptions
+    - constant_identifier_names
+    - control_flow_in_finally
+    - directives_ordering
+    - empty_catches
+    - empty_constructor_bodies
+    - empty_statements
+    - hash_and_equals
+    - implementation_imports
+    - iterable_contains_unrelated_type
+    - library_names
+    - library_prefixes
+    - list_remove_unrelated_type
+    - non_constant_identifier_names
+    - overridden_fields
+    - package_api_docs
+    - package_names
+    - package_prefixed_library_names
+    - prefer_equal_for_default_values
+    - prefer_final_fields
+    - prefer_generic_function_type_aliases
+    - prefer_is_not_empty
+    - slash_for_doc_comments
+    - super_goes_last
+    - test_types_in_equals
+    - throw_in_finally
+    - type_init_formals
+    - unnecessary_brace_in_string_interps
+    - unnecessary_const
+    - unnecessary_new
+    - unrelated_type_equality_checks
+    - valid_regexps
diff --git a/http_multi_server/lib/http_multi_server.dart b/http_multi_server/lib/http_multi_server.dart
index 309e57f..562092d 100644
--- a/http_multi_server/lib/http_multi_server.dart
+++ b/http_multi_server/lib/http_multi_server.dart
@@ -86,7 +86,7 @@
   /// listened to when this is called.
   HttpMultiServer(Iterable<HttpServer> servers)
       : _servers = servers.toSet(),
-        defaultResponseHeaders = new MultiHeaders(
+        defaultResponseHeaders = MultiHeaders(
             servers.map((server) => server.defaultResponseHeaders)),
         super(StreamGroup.merge(servers));
 
@@ -95,7 +95,7 @@
   ///
   /// See [HttpServer.bind].
   static Future<HttpServer> loopback(int port,
-      {int backlog, bool v6Only: false, bool shared: false}) {
+      {int backlog, bool v6Only = false, bool shared = false}) {
     if (backlog == null) backlog = 0;
 
     return _loopback(
@@ -109,9 +109,9 @@
   /// See [HttpServer.bindSecure].
   static Future<HttpServer> loopbackSecure(int port, SecurityContext context,
       {int backlog,
-      bool v6Only: false,
-      bool requestClientCertificate: false,
-      bool shared: false}) {
+      bool v6Only = false,
+      bool requestClientCertificate = false,
+      bool shared = false}) {
     if (backlog == null) backlog = 0;
 
     return _loopback(
@@ -143,8 +143,12 @@
       // Reuse the IPv4 server's port so that if [port] is 0, both servers use
       // the same ephemeral port.
       var v6Server = await bind(InternetAddress.loopbackIPv6, v4Server.port);
-      return new HttpMultiServer([v4Server, v6Server]);
+      return HttpMultiServer([v4Server, v6Server]);
     } on SocketException catch (error) {
+      // If there is already a server listening we'll lose the reference on a
+      // rethrow.
+      await v4Server.close();
+
       if (error.osError.errorCode != _addressInUseErrno) rethrow;
       if (port != 0) rethrow;
       if (remainingRetries == 0) rethrow;
@@ -152,18 +156,17 @@
       // A port being available on IPv4 doesn't necessarily mean that the same
       // port is available on IPv6. If it's not (which is rare in practice),
       // we try again until we find one that's available on both.
-      v4Server.close();
       return await _loopback(port, bind, remainingRetries - 1);
     }
   }
 
-  Future close({bool force: false}) =>
+  Future close({bool force = false}) =>
       Future.wait(_servers.map((server) => server.close(force: force)));
 
   /// Returns an HttpConnectionsInfo object summarizing the total number of
   /// current connections handled by all the servers.
   HttpConnectionsInfo connectionsInfo() {
-    var info = new HttpConnectionsInfo();
+    var info = HttpConnectionsInfo();
     for (var server in _servers) {
       var subInfo = server.connectionsInfo();
       info.total += subInfo.total;
diff --git a/http_multi_server/lib/src/utils.dart b/http_multi_server/lib/src/utils.dart
index 3d24a03..2709dab 100644
--- a/http_multi_server/lib/src/utils.dart
+++ b/http_multi_server/lib/src/utils.dart
@@ -9,7 +9,7 @@
 final Future<bool> supportsIPv6 = () async {
   try {
     var socket = await ServerSocket.bind(InternetAddress.loopbackIPv6, 0);
-    socket.close();
+    await socket.close();
     return true;
   } on SocketException catch (_) {
     return false;
@@ -20,7 +20,7 @@
 final Future<bool> supportsIPv4 = () async {
   try {
     var socket = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
-    socket.close();
+    await socket.close();
     return true;
   } on SocketException catch (_) {
     return false;
diff --git a/http_multi_server/pubspec.yaml b/http_multi_server/pubspec.yaml
index ad1bfcc..175c5bc 100644
--- a/http_multi_server/pubspec.yaml
+++ b/http_multi_server/pubspec.yaml
@@ -1,13 +1,17 @@
 name: http_multi_server
-version: 2.0.5
-author: "Dart Team <misc@dartlang.org>"
+version: 2.0.6
+
+description: A dart:io HttpServer wrapper that handles requests from multiple servers.
+author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/http_multi_server
-description:
-  A dart:io HttpServer wrapper that handles requests from multiple servers.
+
 environment:
-  sdk: ">=2.0.0-dev.55.0 <3.0.0"
+  sdk: '>=2.0.0-dev.55.0 <3.0.0'
+
 dependencies:
-  async: ">=1.2.0 <3.0.0"
+  async: '>=1.2.0 <3.0.0'
+
 dev_dependencies:
-  test: ">=0.12.0 <0.13.0"
-  http: ">=0.11.0 <0.12.0"
+  http: ^0.12.0
+  pedantic: ^1.4.0
+  test: ^1.5.2
diff --git a/kernel/BUILD.gn b/kernel/BUILD.gn
index f402fed..4a5222a 100644
--- a/kernel/BUILD.gn
+++ b/kernel/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for kernel-0.3.14
+# This file is generated by importer.py for kernel-0.3.18
 
 import("//build/dart/dart_library.gni")
 
@@ -12,7 +12,6 @@
   disable_analysis = true
 
   deps = [
-    "//third_party/dart-pkg/pub/path",
     "//third_party/dart-pkg/pub/args",
   ]
 }
diff --git a/kernel/bin/transform.dart b/kernel/bin/transform.dart
index 5f792a5..f384400 100755
--- a/kernel/bin/transform.dart
+++ b/kernel/bin/transform.dart
@@ -6,6 +6,9 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:front_end/src/api_prototype/constant_evaluator.dart'
+    as constants show SimpleErrorReporter, transformComponent;
+
 import 'package:args/args.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
@@ -13,9 +16,6 @@
 import 'package:kernel/src/tool/batch_util.dart';
 import 'package:kernel/target/targets.dart';
 
-import 'package:kernel/transformations/constants.dart' as constants
-    show SimpleErrorReporter, transformComponent;
-
 import 'package:kernel/transformations/continuation.dart' as cont;
 import 'package:kernel/transformations/empty.dart' as empty;
 import 'package:kernel/transformations/method_call.dart' as method_call;
@@ -102,7 +102,8 @@
     case 'constants':
       final VmConstantsBackend backend = new VmConstantsBackend(coreTypes);
       component = constants.transformComponent(
-          component, backend, defines, const constants.SimpleErrorReporter());
+          component, backend, defines, const constants.SimpleErrorReporter(),
+          enableAsserts: true);
       break;
     case 'methodcall':
       component =
diff --git a/kernel/binary.md b/kernel/binary.md
index 613741e..6b247af 100644
--- a/kernel/binary.md
+++ b/kernel/binary.md
@@ -87,7 +87,7 @@
 }
 
 type ConstantReference {
-  UInt index; // Index into the Component's constants.
+  UInt offset; // Byte offset into the Component's constants.
 }
 
 type SourceInfo {
@@ -97,6 +97,8 @@
   // Line starts are delta-encoded (they are encoded as line lengths).  The list
   // [0, 10, 25, 32, 42] is encoded as [0, 10, 15, 7, 10].
   List<UInt> lineStarts;
+
+  List<Byte> importUriUtf8Bytes;
 }
 
 type UriSource {
@@ -137,7 +139,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 21;
+  UInt32 formatVersion = 25;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
   UriSource sourceMap;
@@ -236,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;
@@ -718,6 +723,15 @@
   List<Expression> maps;
 }
 
+type InstanceCreation extends Expression {
+  Byte tag = 114;
+  FileOffset fileOffset;
+  CanonicalNameReference class;
+  List<DartType> typeArguments;
+  List<[FieldReference, Expression]> fieldValues;
+  List<AssertStatement> asserts;
+}
+
 type IsExpression extends Expression {
   Byte tag = 37;
   FileOffset fileOffset;
@@ -890,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/kernel/lib/ast.dart b/kernel/lib/ast.dart
index 2d7e3a1..5d366a5 100644
--- a/kernel/lib/ast.dart
+++ b/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.
@@ -2211,6 +2215,9 @@
     while (type is TypeParameterType) {
       type = (type as TypeParameterType).parameter.bound;
     }
+    if (type == types.nullType) {
+      return superclass.bottomType;
+    }
     if (type is InterfaceType) {
       var upcastType = types.getTypeAsInstanceOf(type, superclass);
       if (upcastType != null) return upcastType;
@@ -3314,6 +3321,56 @@
   }
 }
 
+/// Create an instance directly from the field values.
+///
+/// This expression arises from const constructor calls when one or more field
+/// initializing expressions, field initializers or assert initializers contain
+/// unevaluated expressions. They only ever occur within unevaluated constants
+/// in constant expressions.
+class InstanceCreation extends Expression {
+  final Reference classReference;
+  final List<DartType> typeArguments;
+  final Map<Reference, Expression> fieldValues;
+  final List<AssertStatement> asserts;
+
+  InstanceCreation(
+      this.classReference, this.typeArguments, this.fieldValues, this.asserts);
+
+  Class get classNode => classReference.asClass;
+
+  DartType getStaticType(TypeEnvironment types) {
+    return typeArguments.isEmpty
+        ? classNode.rawType
+        : new InterfaceType(classNode, typeArguments);
+  }
+
+  accept(ExpressionVisitor v) => v.visitInstanceCreation(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitInstanceCreation(this, arg);
+
+  visitChildren(Visitor v) {
+    classReference.asClass.acceptReference(v);
+    visitList(typeArguments, v);
+    for (final Reference reference in fieldValues.keys) {
+      reference.asField.acceptReference(v);
+    }
+    for (final Expression value in fieldValues.values) {
+      value.accept(v);
+    }
+    visitList(asserts, v);
+  }
+
+  transformChildren(Transformer v) {
+    fieldValues.forEach((Reference fieldRef, Expression value) {
+      Expression transformed = value.accept(v);
+      if (transformed != null && !identical(value, transformed)) {
+        fieldValues[fieldRef] = transformed;
+        transformed.parent = this;
+      }
+    });
+    transformList(asserts, v, this);
+  }
+}
+
 /// Expression of form `x is T`.
 class IsExpression extends Expression {
   Expression operand;
@@ -3443,7 +3500,7 @@
 class NullLiteral extends BasicLiteral {
   Object get value => null;
 
-  DartType getStaticType(TypeEnvironment types) => const BottomType();
+  DartType getStaticType(TypeEnvironment types) => types.nullType;
 
   accept(ExpressionVisitor v) => v.visitNullLiteral(this);
   accept1(ExpressionVisitor1 v, arg) => v.visitNullLiteral(this, arg);
@@ -3703,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);
   }
 }
 
@@ -5951,15 +6011,22 @@
 
   final List<int> source;
 
+  final Uri importUri;
+
+  final Uri fileUri;
+
   String cachedText;
 
-  Source(this.lineStarts, this.source);
+  Source(this.lineStarts, this.source, this.importUri, this.fileUri);
 
   /// Return the text corresponding to [line] which is a 1-based line
   /// number. The returned line contains no line separators.
   String getTextLine(int line) {
+    if (source == null ||
+        source.isEmpty ||
+        lineStarts == null ||
+        lineStarts.isEmpty) return null;
     RangeError.checkValueInInterval(line, 1, lineStarts.length, 'line');
-    if (source == null || source.isEmpty) return null;
 
     cachedText ??= utf8.decode(source, allowMalformed: true);
     // -1 as line numbers start at 1.
@@ -5983,6 +6050,9 @@
 
   /// Translates an offset to line and column numbers in the given file.
   Location getLocation(Uri file, int offset) {
+    if (lineStarts == null || lineStarts.isEmpty) {
+      return new Location(file, TreeNode.noOffset, TreeNode.noOffset);
+    }
     RangeError.checkValueInInterval(offset, 0, lineStarts.last, 'offset');
     int low = 0, high = lineStarts.length - 1;
     while (low < high) {
@@ -6112,7 +6182,7 @@
 /// This function will return "S with M1" and "S with M1, M2", respectively.
 String demangleMixinApplicationName(String name) {
   List<String> nameParts = name.split('&');
-  if (nameParts.length < 2) return name;
+  if (nameParts.length < 2 || name == "&") return name;
   String demangledName = nameParts[1];
   for (int i = 2; i < nameParts.length; i++) {
     demangledName += (i == 2 ? " with " : ", ") + nameParts[i];
diff --git a/kernel/lib/binary/ast_from_binary.dart b/kernel/lib/binary/ast_from_binary.dart
index f5b7c33..31c621d 100644
--- a/kernel/lib/binary/ast_from_binary.dart
+++ b/kernel/lib/binary/ast_from_binary.dart
@@ -76,14 +76,19 @@
   List<String> debugPath = <String>[];
 
   bool _isReadingLibraryImplementation = false;
+  final bool alwaysCreateNewNamedNodes;
 
   /// If binary contains metadata section with payloads referencing other nodes
   /// such Kernel binary can't be read lazily because metadata cross references
   /// will not be resolved correctly.
   bool _disableLazyReading = false;
 
-  BinaryBuilder(this._bytes, {this.filename, disableLazyReading = false})
-      : _disableLazyReading = disableLazyReading;
+  BinaryBuilder(this._bytes,
+      {this.filename,
+      bool disableLazyReading = false,
+      bool alwaysCreateNewNamedNodes})
+      : _disableLazyReading = disableLazyReading,
+        this.alwaysCreateNewNamedNodes = alwaysCreateNewNamedNodes ?? false;
 
   fail(String message) {
     throw ParseError(message,
@@ -696,7 +701,11 @@
         lineStarts[j] = lineStart;
         previousLineStart = lineStart;
       }
-      uriToSource[uri] = new Source(lineStarts, sourceCode);
+      List<int> importUriBytes = readByteList();
+      Uri importUri = importUriBytes.isEmpty
+          ? null
+          : Uri.parse(const Utf8Decoder().convert(importUriBytes));
+      uriToSource[uri] = new Source(lineStarts, sourceCode, importUri, uri);
     }
 
     // Read index.
@@ -799,6 +808,9 @@
     var canonicalName = readCanonicalNameReference();
     Reference reference = canonicalName.getReference();
     Library library = reference.node;
+    if (alwaysCreateNewNamedNodes) {
+      library = null;
+    }
     bool shouldWriteData = library == null || _isReadingLibraryImplementation;
     if (library == null) {
       library =
@@ -919,6 +931,9 @@
     var canonicalName = readCanonicalNameReference();
     var reference = canonicalName.getReference();
     Typedef node = reference.node;
+    if (alwaysCreateNewNamedNodes) {
+      node = null;
+    }
     bool shouldWriteData = node == null || _isReadingLibraryImplementation;
     if (node == null) {
       node = new Typedef(null, null, reference: reference);
@@ -964,6 +979,9 @@
     var canonicalName = readCanonicalNameReference();
     var reference = canonicalName.getReference();
     Class node = reference.node;
+    if (alwaysCreateNewNamedNodes) {
+      node = null;
+    }
     bool shouldWriteData = node == null || _isReadingLibraryImplementation;
     if (node == null) {
       node = new Class(reference: reference)..level = ClassLevel.Temporary;
@@ -1036,6 +1054,9 @@
     var canonicalName = readCanonicalNameReference();
     var reference = canonicalName.getReference();
     Field node = reference.node;
+    if (alwaysCreateNewNamedNodes) {
+      node = null;
+    }
     bool shouldWriteData = node == null || _isReadingLibraryImplementation;
     if (node == null) {
       node = new Field(null, reference: reference);
@@ -1075,6 +1096,9 @@
     var canonicalName = readCanonicalNameReference();
     var reference = canonicalName.getReference();
     Constructor node = reference.node;
+    if (alwaysCreateNewNamedNodes) {
+      node = null;
+    }
     bool shouldWriteData = node == null || _isReadingLibraryImplementation;
     if (node == null) {
       node = new Constructor(null, reference: reference);
@@ -1121,6 +1145,9 @@
     var canonicalName = readCanonicalNameReference();
     var reference = canonicalName.getReference();
     Procedure node = reference.node;
+    if (alwaysCreateNewNamedNodes) {
+      node = null;
+    }
     bool shouldWriteData = node == null || _isReadingLibraryImplementation;
     if (node == null) {
       node = new Procedure(null, null, null, reference: reference);
@@ -1180,6 +1207,9 @@
     var canonicalName = readCanonicalNameReference();
     var reference = canonicalName.getReference();
     RedirectingFactoryConstructor node = reference.node;
+    if (alwaysCreateNewNamedNodes) {
+      node = null;
+    }
     bool shouldWriteData = node == null || _isReadingLibraryImplementation;
     if (node == null) {
       node = new RedirectingFactoryConstructor(null, reference: reference);
@@ -1530,6 +1560,26 @@
         return new MapConcatenation(readExpressionList(),
             keyType: keyType, valueType: valueType)
           ..fileOffset = offset;
+      case Tag.InstanceCreation:
+        int offset = readOffset();
+        Reference classReference = readClassReference();
+        List<DartType> typeArguments = readDartTypeList();
+        int fieldValueCount = readUInt();
+        Map<Reference, Expression> fieldValues = <Reference, Expression>{};
+        for (int i = 0; i < fieldValueCount; i++) {
+          final Reference fieldRef =
+              readCanonicalNameReference().getReference();
+          final Expression value = readExpression();
+          fieldValues[fieldRef] = value;
+        }
+        int assertCount = readUInt();
+        List<AssertStatement> asserts = new List<AssertStatement>(assertCount);
+        for (int i = 0; i < assertCount; i++) {
+          asserts[i] = readStatement();
+        }
+        return new InstanceCreation(
+            classReference, typeArguments, fieldValues, asserts)
+          ..fileOffset = offset;
       case Tag.IsExpression:
         int offset = readOffset();
         return new IsExpression(readExpression(), readDartType())
@@ -1632,7 +1682,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/kernel/lib/binary/ast_to_binary.dart b/kernel/lib/binary/ast_to_binary.dart
index db91bfb..4b3434c 100644
--- a/kernel/lib/binary/ast_to_binary.dart
+++ b/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)) {
@@ -740,31 +744,20 @@
     Uint8List buffer = new Uint8List(1 << 16);
     for (Uri uri in _sourceUriIndexer.index.keys) {
       index[i] = getBufferOffset();
-      Source source = ((includeSources &&
-                  _sourcesFromRealImplementation.length > i &&
-                  _sourcesFromRealImplementation[i] == true)
-              ? uriToSource[uri]
-              : null) ??
-          new Source(<int>[], const <int>[]);
-
-      String uriAsString = uri == null ? "" : "$uri";
-      if (uriAsString.length * 3 < buffer.length) {
-        int length = NotQuiteString.writeUtf8(buffer, 0, uriAsString);
-        if (length < 0) {
-          // Utf8 encoding failed.
-          writeByteList(utf8.encoder.convert(uriAsString));
-        } else {
-          writeUInt30(length);
-          for (int j = 0; j < length; j++) {
-            writeByte(buffer[j]);
-          }
-        }
-      } else {
-        // Uncommon case with very long url.
-        writeByteList(utf8.encoder.convert(uriAsString));
+      Source source = uriToSource[uri];
+      if (source == null ||
+          !(includeSources &&
+              _sourcesFromRealImplementation.length > i &&
+              _sourcesFromRealImplementation[i] == true)) {
+        source = new Source(
+            <int>[], const <int>[], source?.importUri, source?.fileUri);
       }
 
+      String uriAsString = uri == null ? "" : "$uri";
+      outputStringViaBuffer(uriAsString, buffer);
+
       writeByteList(source.source);
+
       List<int> lineStarts = source.lineStarts;
       writeUInt30(lineStarts.length);
       int previousLineStart = 0;
@@ -773,6 +766,11 @@
         writeUInt30(lineStart - previousLineStart);
         previousLineStart = lineStart;
       }
+
+      String importUriAsString =
+          source.importUri == null ? "" : "${source.importUri}";
+      outputStringViaBuffer(importUriAsString, buffer);
+
       i++;
     }
 
@@ -782,6 +780,24 @@
     }
   }
 
+  void outputStringViaBuffer(String uriAsString, Uint8List buffer) {
+    if (uriAsString.length * 3 < buffer.length) {
+      int length = NotQuiteString.writeUtf8(buffer, 0, uriAsString);
+      if (length < 0) {
+        // Utf8 encoding failed.
+        writeByteList(utf8.encoder.convert(uriAsString));
+      } else {
+        writeUInt30(length);
+        for (int j = 0; j < length; j++) {
+          writeByte(buffer[j]);
+        }
+      }
+    } else {
+      // Uncommon case with very long url.
+      writeByteList(utf8.encoder.convert(uriAsString));
+    }
+  }
+
   void writeLibraryDependencyReference(LibraryDependency node) {
     int index = _libraryDependencyIndex[node];
     if (index == null) {
@@ -909,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];
@@ -1491,6 +1526,20 @@
   }
 
   @override
+  void visitInstanceCreation(InstanceCreation node) {
+    writeByte(Tag.InstanceCreation);
+    writeOffset(node.fileOffset);
+    writeNonNullReference(node.classReference);
+    writeNodeList(node.typeArguments);
+    writeUInt30(node.fieldValues.length);
+    node.fieldValues.forEach((Reference fieldRef, Expression value) {
+      writeNonNullReference(fieldRef);
+      writeNode(value);
+    });
+    writeNodeList(node.asserts);
+  }
+
+  @override
   void visitIsExpression(IsExpression node) {
     writeByte(Tag.IsExpression);
     writeOffset(node.fileOffset);
@@ -1732,6 +1781,8 @@
   @override
   void visitConstantExpression(ConstantExpression node) {
     writeByte(Tag.ConstantExpression);
+    writeOffset(node.fileOffset);
+    writeDartType(node.type);
     writeConstantReference(node.constant);
   }
 
diff --git a/kernel/lib/binary/tag.dart b/kernel/lib/binary/tag.dart
index ba6cc4e..8e52b70 100644
--- a/kernel/lib/binary/tag.dart
+++ b/kernel/lib/binary/tag.dart
@@ -53,6 +53,7 @@
   static const int ListConcatenation = 111;
   static const int SetConcatenation = 112;
   static const int MapConcatenation = 113;
+  static const int InstanceCreation = 114;
   static const int IsExpression = 37;
   static const int AsExpression = 38;
   static const int StringLiteral = 39;
@@ -121,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).
@@ -129,6 +133,7 @@
   /// 111 is occupied by [ListConcatenation] (expression).
   /// 112 is occupied by [SetConcatenation] (expression).
   /// 113 is occupied by [MapConcatenation] (expression).
+  /// 114 is occupied by [InstanceCreation] (expression).
 
   static const int SpecializedTagHighBit = 0x80; // 10000000
   static const int SpecializedTagMask = 0xF8; // 11111000
@@ -145,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 = 21;
+  static const int BinaryFormatVersion = 25;
 }
 
 abstract class ConstantTag {
diff --git a/kernel/lib/canonical_name.dart b/kernel/lib/canonical_name.dart
index 20bf36c..76fd5d8 100644
--- a/kernel/lib/canonical_name.dart
+++ b/kernel/lib/canonical_name.dart
@@ -123,6 +123,10 @@
         .getChildFromQualifiedName(member.name);
   }
 
+  CanonicalName getChildFromFieldWithName(Name name) {
+    return getChild('@fields').getChildFromQualifiedName(name);
+  }
+
   CanonicalName getChildFromTypedef(Typedef typedef_) {
     return getChild('@typedefs').getChild(typedef_.name);
   }
diff --git a/kernel/lib/clone.dart b/kernel/lib/clone.dart
index 4105a43..d5f1940 100644
--- a/kernel/lib/clone.dart
+++ b/kernel/lib/clone.dart
@@ -205,6 +205,18 @@
         keyType: visitType(node.keyType), valueType: visitType(node.valueType));
   }
 
+  visitInstanceCreation(InstanceCreation node) {
+    final Map<Reference, Expression> fieldValues = <Reference, Expression>{};
+    node.fieldValues.forEach((Reference fieldRef, Expression value) {
+      fieldValues[fieldRef] = clone(value);
+    });
+    return new InstanceCreation(
+        node.classReference,
+        node.typeArguments.map(visitType).toList(),
+        fieldValues,
+        node.asserts.map(clone).toList());
+  }
+
   visitIsExpression(IsExpression node) {
     return new IsExpression(clone(node.operand), visitType(node.type));
   }
@@ -264,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/kernel/lib/import_table.dart b/kernel/lib/import_table.dart
index ae2829c..f549933 100644
--- a/kernel/lib/import_table.dart
+++ b/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/kernel/lib/target/targets.dart b/kernel/lib/target/targets.dart
index 3472254..47521ca 100644
--- a/kernel/lib/target/targets.dart
+++ b/kernel/lib/target/targets.dart
@@ -6,7 +6,6 @@
 import '../ast.dart';
 import '../class_hierarchy.dart';
 import '../core_types.dart';
-import '../transformations/constants.dart' show ConstantsBackend;
 
 final List<String> targetNames = targets.keys.toList();
 
@@ -33,6 +32,32 @@
       {List<C> context});
 }
 
+/// The different kinds of number semantics supported by the constant evaluator.
+enum NumberSemantics {
+  /// Dart VM number semantics.
+  vm,
+
+  /// JavaScript (Dart2js and DDC) number semantics.
+  js,
+}
+
+// Backend specific constant evaluation behavior
+class ConstantsBackend {
+  const ConstantsBackend();
+
+  /// Lowering of a list constant to a backend-specific representation.
+  Constant lowerListConstant(ListConstant constant) => constant;
+
+  /// Lowering of a set constant to a backend-specific representation.
+  Constant lowerSetConstant(SetConstant constant) => constant;
+
+  /// Lowering of a map constant to a backend-specific representation.
+  Constant lowerMapConstant(MapConstant constant) => constant;
+
+  /// Number semantics to use for this backend.
+  NumberSemantics get numberSemantics => NumberSemantics.vm;
+}
+
 /// A target provides backend-specific options for generating kernel IR.
 abstract class Target {
   String get name;
diff --git a/kernel/lib/text/ast_to_text.dart b/kernel/lib/text/ast_to_text.dart
index 29af291..5862b83 100644
--- a/kernel/lib/text/ast_to_text.dart
+++ b/kernel/lib/text/ast_to_text.dart
@@ -477,6 +477,9 @@
         }
         writeWord('external');
       }
+      if (showMetadata) {
+        inner.writeMetadata(library);
+      }
       writeAnnotationList(library.annotations);
       writeWord('library');
       if (library.name != null) {
@@ -1299,6 +1302,39 @@
     }
   }
 
+  visitInstanceCreation(InstanceCreation node) {
+    write('${node.classNode}');
+    if (node.typeArguments.isNotEmpty) {
+      writeSymbol('<');
+      writeList(node.typeArguments, writeType);
+      writeSymbol('>');
+    }
+    write(' {');
+    bool first = true;
+    node.fieldValues.forEach((Reference fieldRef, Expression value) {
+      if (!first) {
+        writeComma();
+      }
+      write('${fieldRef.asField.name}: ');
+      writeExpression(value);
+      first = false;
+    });
+    for (AssertStatement assert_ in node.asserts) {
+      if (!first) {
+        writeComma();
+      }
+      write('assert(');
+      writeExpression(assert_.condition);
+      if (assert_.message != null) {
+        writeComma();
+        writeExpression(assert_.message);
+      }
+      write(')');
+    }
+
+    write('}');
+  }
+
   visitIsExpression(IsExpression node) {
     writeExpression(node.operand, Precedence.BITWISE_OR);
     writeSpaced('is');
@@ -2011,10 +2047,10 @@
     node.fieldValues.forEach((Reference fieldRef, Constant constant) {
       final String name = syntheticNames.nameConstant(constant);
       if (!first) {
-        first = false;
         sb.write(', ');
       }
       sb.write('${fieldRef.asField.name}: $name');
+      first = false;
     });
     sb.write('}');
     endLine(sb.toString());
diff --git a/kernel/lib/text/text_serialization_verifier.dart b/kernel/lib/text/text_serialization_verifier.dart
index b9f2662..3fed367 100644
--- a/kernel/lib/text/text_serialization_verifier.dart
+++ b/kernel/lib/text/text_serialization_verifier.dart
@@ -390,6 +390,12 @@
   }
 
   @override
+  void visitInstanceCreation(InstanceCreation node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
   void visitSymbolConstant(SymbolConstant node) {
     storeLastSeenUriAndOffset(node);
     node.visitChildren(this);
diff --git a/kernel/lib/transformations/async.dart b/kernel/lib/transformations/async.dart
index 31fe3f3..3ea9fe2 100644
--- a/kernel/lib/transformations/async.dart
+++ b/kernel/lib/transformations/async.dart
@@ -90,12 +90,12 @@
   /// surrounding context.
   Expression rewrite(Expression expression, List<Statement> outer) {
     assert(statements.isEmpty);
-    assert(nameIndex == 0);
+    var saved = seenAwait;
     seenAwait = false;
     Expression result = expression.accept(this);
     outer.addAll(statements.reversed);
     statements.clear();
-    nameIndex = 0;
+    seenAwait = seenAwait || saved;
     return result;
   }
 
@@ -503,4 +503,42 @@
         new RecursiveContinuationRewriter(continuationRewriter.helper);
     return node.accept(nestedRewriter);
   }
+
+  TreeNode visitBlockExpression(BlockExpression expr) {
+    return transform(expr, () {
+      expr.value = expr.value.accept(this)..parent = expr;
+      List<Statement> body = <Statement>[];
+      for (Statement stmt in expr.body.statements.reversed) {
+        Statement translation = stmt.accept(this);
+        if (translation != null) body.add(translation);
+      }
+      expr.body = new Block(body.reversed.toList())..parent = expr;
+    });
+  }
+
+  TreeNode defaultStatement(Statement stmt) {
+    // This method translates a statement nested in an expression (e.g., in a
+    // block expression).  It produces a translated statement, a list of
+    // statements which are side effects necessary for any await, and a flag
+    // indicating whether there was an await in the statement or to its right.
+    // The translated statement can be null in the case where there was already
+    // an await to the right.
+
+    // The translation is accumulating two lists of statements, an inner list
+    // which is a reversed list of effects needed for the current expression and
+    // an outer list which represents the block containing the current
+    // statement.  We need to preserve both of those from side effects.
+    List<Statement> savedInner = statements;
+    List<Statement> savedOuter = continuationRewriter.statements;
+    statements = <Statement>[];
+    continuationRewriter.statements = <Statement>[];
+    stmt.accept(continuationRewriter);
+
+    List<Statement> results = continuationRewriter.statements;
+    statements = savedInner;
+    continuationRewriter.statements = savedOuter;
+    if (!seenAwait && results.length == 1) return results.first;
+    statements.addAll(results.reversed);
+    return null;
+  }
 }
diff --git a/kernel/lib/transformations/constants.dart b/kernel/lib/transformations/constants.dart
deleted file mode 100644
index e7c77df..0000000
--- a/kernel/lib/transformations/constants.dart
+++ /dev/null
@@ -1,1904 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// This library implements a kernel2kernel constant evaluation transformation.
-///
-/// Even though it is expected that the frontend does not emit kernel AST which
-/// contains compile-time errors, this transformation still performs some
-/// valiation and throws a [ConstantEvaluationError] if there was a compile-time
-/// errors.
-///
-/// Due to the lack information which is is only available in the front-end,
-/// this validation is incomplete (e.g. whether an integer literal used the
-/// hexadecimal syntax or not).
-///
-/// Furthermore due to the lowering of certain constructs in the front-end
-/// (e.g. '??') we need to support a super-set of the normal constant expression
-/// language.  Issue(http://dartbug.com/31799)
-library kernel.transformations.constants;
-
-import 'dart:io' as io;
-
-import '../ast.dart';
-import '../class_hierarchy.dart';
-import '../clone.dart';
-import '../core_types.dart';
-import '../kernel.dart';
-import '../type_algebra.dart';
-import '../type_environment.dart';
-
-Component transformComponent(Component component, ConstantsBackend backend,
-    Map<String, String> environmentDefines, ErrorReporter errorReporter,
-    {bool keepFields: false,
-    bool enableAsserts: false,
-    bool evaluateAnnotations: true,
-    CoreTypes coreTypes,
-    ClassHierarchy hierarchy}) {
-  coreTypes ??= new CoreTypes(component);
-  hierarchy ??= new ClassHierarchy(component);
-
-  final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy);
-
-  transformLibraries(component.libraries, backend, environmentDefines,
-      typeEnvironment, errorReporter,
-      keepFields: keepFields,
-      enableAsserts: enableAsserts,
-      evaluateAnnotations: evaluateAnnotations);
-  return component;
-}
-
-void transformLibraries(
-    List<Library> libraries,
-    ConstantsBackend backend,
-    Map<String, String> environmentDefines,
-    TypeEnvironment typeEnvironment,
-    ErrorReporter errorReporter,
-    {bool keepFields: false,
-    bool keepVariables: false,
-    bool evaluateAnnotations: true,
-    bool enableAsserts: false}) {
-  final ConstantsTransformer constantsTransformer = new ConstantsTransformer(
-      backend,
-      environmentDefines,
-      keepFields,
-      keepVariables,
-      evaluateAnnotations,
-      typeEnvironment,
-      enableAsserts,
-      errorReporter);
-  for (final Library library in libraries) {
-    constantsTransformer.convertLibrary(library);
-  }
-}
-
-class ConstantsTransformer extends Transformer {
-  final ConstantEvaluator constantEvaluator;
-  final TypeEnvironment typeEnvironment;
-
-  /// Whether to preserve constant [Field]s.  All use-sites will be rewritten.
-  final bool keepFields;
-  final bool keepVariables;
-  final bool evaluateAnnotations;
-
-  ConstantsTransformer(
-      ConstantsBackend backend,
-      Map<String, String> environmentDefines,
-      this.keepFields,
-      this.keepVariables,
-      this.evaluateAnnotations,
-      this.typeEnvironment,
-      bool enableAsserts,
-      ErrorReporter errorReporter)
-      : constantEvaluator = new ConstantEvaluator(backend, environmentDefines,
-            typeEnvironment, enableAsserts, errorReporter);
-
-  // Transform the library/class members:
-
-  void convertLibrary(Library library) {
-    transformAnnotations(library.annotations, library);
-
-    transformList(library.dependencies, this, library);
-    transformList(library.parts, this, library);
-    transformList(library.typedefs, this, library);
-    transformList(library.classes, this, library);
-    transformList(library.procedures, this, library);
-    transformList(library.fields, this, library);
-
-    if (!keepFields) {
-      // The transformer API does not iterate over `Library.additionalExports`,
-      // so we manually delete the references to shaken nodes.
-      library.additionalExports.removeWhere((Reference reference) {
-        return reference.canonicalName == null;
-      });
-    }
-  }
-
-  visitLibraryPart(LibraryPart node) {
-    constantEvaluator.withNewEnvironment(() {
-      transformAnnotations(node.annotations, node);
-    });
-    return node;
-  }
-
-  visitLibraryDependency(LibraryDependency node) {
-    constantEvaluator.withNewEnvironment(() {
-      transformAnnotations(node.annotations, node);
-    });
-    return node;
-  }
-
-  visitClass(Class node) {
-    constantEvaluator.withNewEnvironment(() {
-      transformAnnotations(node.annotations, node);
-      transformList(node.fields, this, node);
-      transformList(node.typeParameters, this, node);
-      transformList(node.constructors, this, node);
-      transformList(node.procedures, this, node);
-      transformList(node.redirectingFactoryConstructors, this, node);
-    });
-    return node;
-  }
-
-  visitProcedure(Procedure node) {
-    constantEvaluator.withNewEnvironment(() {
-      transformAnnotations(node.annotations, node);
-      node.function = node.function.accept(this)..parent = node;
-    });
-    return node;
-  }
-
-  visitConstructor(Constructor node) {
-    constantEvaluator.withNewEnvironment(() {
-      transformAnnotations(node.annotations, node);
-      transformList(node.initializers, this, node);
-      node.function = node.function.accept(this)..parent = node;
-    });
-    return node;
-  }
-
-  visitTypedef(Typedef node) {
-    constantEvaluator.withNewEnvironment(() {
-      transformAnnotations(node.annotations, node);
-      transformList(node.typeParameters, this, node);
-      transformList(node.typeParametersOfFunctionType, this, node);
-      transformList(node.positionalParameters, this, node);
-      transformList(node.namedParameters, this, node);
-    });
-    return node;
-  }
-
-  visitRedirectingFactoryConstructor(RedirectingFactoryConstructor node) {
-    constantEvaluator.withNewEnvironment(() {
-      transformAnnotations(node.annotations, node);
-      transformList(node.typeParameters, this, node);
-      transformList(node.positionalParameters, this, node);
-      transformList(node.namedParameters, this, node);
-    });
-    return node;
-  }
-
-  visitTypeParameter(TypeParameter node) {
-    transformAnnotations(node.annotations, node);
-    return node;
-  }
-
-  void transformAnnotations(List<Expression> nodes, TreeNode parent) {
-    if (evaluateAnnotations && nodes.length > 0) {
-      transformExpressions(nodes, parent);
-    }
-  }
-
-  void transformExpressions(List<Expression> nodes, TreeNode parent) {
-    constantEvaluator.withNewEnvironment(() {
-      for (int i = 0; i < nodes.length; ++i) {
-        nodes[i] = tryEvaluateAndTransformWithContext(parent, nodes[i])
-          ..parent = parent;
-      }
-    });
-  }
-
-  // Handle definition of constants:
-
-  visitFunctionNode(FunctionNode node) {
-    final positionalParameterCount = node.positionalParameters.length;
-    for (int i = 0; i < positionalParameterCount; ++i) {
-      final VariableDeclaration variable = node.positionalParameters[i];
-      transformAnnotations(variable.annotations, variable);
-      if (variable.initializer != null) {
-        variable.initializer =
-            tryEvaluateAndTransformWithContext(variable, variable.initializer)
-              ..parent = node;
-      }
-    }
-    for (final VariableDeclaration variable in node.namedParameters) {
-      transformAnnotations(variable.annotations, variable);
-      if (variable.initializer != null) {
-        variable.initializer =
-            tryEvaluateAndTransformWithContext(variable, variable.initializer)
-              ..parent = node;
-      }
-    }
-    if (node.body != null) {
-      node.body = node.body.accept(this)..parent = node;
-    }
-    return node;
-  }
-
-  visitVariableDeclaration(VariableDeclaration node) {
-    transformAnnotations(node.annotations, node);
-
-    if (node.initializer != null) {
-      if (node.isConst) {
-        final Constant constant =
-            tryEvaluateWithContext(node, node.initializer);
-
-        // If there was a constant evaluation error we will not continue and
-        // simply keep the old [node].
-        if (constant != null) {
-          constantEvaluator.env.addVariableValue(node, constant);
-
-          if (keepVariables) {
-            // 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 = new ConstantExpression(constant)..parent = node;
-            node.isFinal = true;
-            node.isConst = false;
-          } else {
-            // Since we convert all use-sites of constants, the constant
-            // [VariableDeclaration] is unused and we'll therefore remove it.
-            return null;
-          }
-        }
-      } else {
-        node.initializer = node.initializer.accept(this)..parent = node;
-      }
-    }
-    return node;
-  }
-
-  visitField(Field node) {
-    return constantEvaluator.withNewEnvironment(() {
-      if (node.isConst) {
-        // Since we convert all use-sites of constants, the constant [Field]
-        // cannot be referenced anymore.  We therefore get rid of it if
-        // [keepFields] was not specified.
-        if (!keepFields) {
-          return null;
-        }
-
-        // Otherwise we keep the constant [Field] and convert it's initializer.
-        transformAnnotations(node.annotations, node);
-        if (node.initializer != null) {
-          node.initializer =
-              tryEvaluateAndTransformWithContext(node, node.initializer)
-                ..parent = node;
-        }
-      } else {
-        transformAnnotations(node.annotations, node);
-        if (node.initializer != null) {
-          node.initializer = node.initializer.accept(this)..parent = node;
-        }
-      }
-      return node;
-    });
-  }
-
-  // Handle use-sites of constants (and "inline" constant expressions):
-
-  visitSymbolLiteral(SymbolLiteral node) {
-    return new ConstantExpression(constantEvaluator.evaluate(node));
-  }
-
-  visitStaticGet(StaticGet node) {
-    final Member target = node.target;
-    if (target is Field && target.isConst) {
-      final Constant constant =
-          tryEvaluateWithContext(node, target.initializer);
-      return constant != null ? new ConstantExpression(constant) : node;
-    } else if (target is Procedure && target.kind == ProcedureKind.Method) {
-      return tryEvaluateAndTransformWithContext(node, node);
-    }
-    return super.visitStaticGet(node);
-  }
-
-  visitSwitchCase(SwitchCase node) {
-    transformExpressions(node.expressions, node);
-    return super.visitSwitchCase(node);
-  }
-
-  visitVariableGet(VariableGet node) {
-    if (node.variable.isConst) {
-      return tryEvaluateAndTransformWithContext(node, node);
-    }
-    return super.visitVariableGet(node);
-  }
-
-  visitListLiteral(ListLiteral node) {
-    if (node.isConst) {
-      return tryEvaluateAndTransformWithContext(node, node);
-    }
-    return super.visitListLiteral(node);
-  }
-
-  visitMapLiteral(MapLiteral node) {
-    if (node.isConst) {
-      return tryEvaluateAndTransformWithContext(node, node);
-    }
-    return super.visitMapLiteral(node);
-  }
-
-  visitConstructorInvocation(ConstructorInvocation node) {
-    if (node.isConst) {
-      return tryEvaluateAndTransformWithContext(node, node);
-    }
-    return super.visitConstructorInvocation(node);
-  }
-
-  visitStaticInvocation(StaticInvocation node) {
-    if (node.isConst) {
-      return tryEvaluateAndTransformWithContext(node, node);
-    }
-    return super.visitStaticInvocation(node);
-  }
-
-  visitConstantExpression(ConstantExpression node) {
-    Constant constant = node.constant;
-    if (constant is UnevaluatedConstant) {
-      Expression expression = constant.expression;
-      return tryEvaluateAndTransformWithContext(expression, expression);
-    } else {
-      node.constant = constantEvaluator.canonicalize(constant);
-      return node;
-    }
-  }
-
-  tryEvaluateAndTransformWithContext(TreeNode treeContext, Expression node) {
-    final Constant constant = tryEvaluateWithContext(treeContext, node);
-    return constant != null ? new ConstantExpression(constant) : node;
-  }
-
-  tryEvaluateWithContext(TreeNode treeContext, Expression node) {
-    if (treeContext == node) {
-      return constantEvaluator.evaluate(node);
-    }
-
-    return constantEvaluator.runInsideContext(treeContext, () {
-      return constantEvaluator.evaluate(node);
-    });
-  }
-}
-
-class ConstantEvaluator extends RecursiveVisitor {
-  final ConstantsBackend backend;
-  final NumberSemantics numberSemantics;
-  Map<String, String> environmentDefines;
-  final CoreTypes coreTypes;
-  final TypeEnvironment typeEnvironment;
-  final bool enableAsserts;
-  final ErrorReporter errorReporter;
-
-  final isInstantiated = new IsInstantiatedVisitor().isInstantiated;
-
-  final Map<Constant, Constant> canonicalizationCache;
-  final Map<Node, Object> nodeCache;
-  final CloneVisitor cloner = new CloneVisitor();
-
-  final NullConstant nullConstant = new NullConstant();
-  final BoolConstant trueConstant = new BoolConstant(true);
-  final BoolConstant falseConstant = new BoolConstant(false);
-
-  final List<TreeNode> contextChain = [];
-
-  InstanceBuilder instanceBuilder;
-  EvaluationEnvironment env;
-  Expression evaluationRoot;
-  Set<TreeNode> unevaluatedNodes;
-  Set<Expression> replacementNodes;
-
-  bool get targetingJavaScript => numberSemantics == NumberSemantics.js;
-
-  ConstantEvaluator(this.backend, this.environmentDefines, this.typeEnvironment,
-      this.enableAsserts, this.errorReporter)
-      : numberSemantics = backend.numberSemantics,
-        coreTypes = typeEnvironment.coreTypes,
-        canonicalizationCache = <Constant, Constant>{},
-        nodeCache = <Node, Constant>{},
-        env = new EvaluationEnvironment();
-
-  /// Evaluates [node] and possibly cache the evaluation result.
-  Constant evaluate(Expression node) {
-    evaluationRoot = node;
-    try {
-      return _evaluateSubexpression(node);
-    } on _AbortCurrentEvaluation catch (e) {
-      return new UnevaluatedConstant(new InvalidExpression(e.message));
-    } finally {
-      // Release collections used to keep track of unevaluated nodes.
-      evaluationRoot = null;
-      unevaluatedNodes = null;
-      replacementNodes = null;
-    }
-  }
-
-  /// Produce an unevaluated constant node for an expression.
-  /// Mark all ancestors (up to the root of the constant evaluation) to
-  /// indicate that they should also be unevaluated.
-  Constant unevaluated(Expression original, Expression replacement) {
-    assert(evaluationRoot != null);
-    replacement.fileOffset = original.fileOffset;
-    unevaluatedNodes ??= new Set<TreeNode>.identity();
-    TreeNode mark = original;
-    while (unevaluatedNodes.add(mark)) {
-      if (identical(mark, evaluationRoot)) break;
-      mark = mark.parent;
-    }
-    return new UnevaluatedConstant(replacement);
-  }
-
-  /// Called whenever an expression is extracted from an unevaluated constant
-  /// to become part of the expression tree of another unevaluated constant.
-  /// Makes sure a particular expression occurs only once in the tree by
-  /// cloning further instances.
-  Expression unique(Expression expression) {
-    replacementNodes ??= new Set<Expression>.identity();
-    if (!replacementNodes.add(expression)) {
-      expression = cloner.clone(expression);
-      replacementNodes.add(expression);
-    }
-    return expression;
-  }
-
-  /// Should this node become unevaluated because of an unevaluated child?
-  bool hasUnevaluatedChild(TreeNode node) {
-    return unevaluatedNodes != null && unevaluatedNodes.contains(node);
-  }
-
-  /// Evaluates [node] and possibly cache the evaluation result.
-  /// @throws _AbortCurrentEvaluation if expression can't be evaluated.
-  Constant _evaluateSubexpression(Expression node) {
-    if (node == null) return nullConstant;
-    if (env.isEmpty) {
-      // We only try to evaluate the same [node] *once* within an empty
-      // environment.
-      if (nodeCache.containsKey(node)) {
-        final Constant constant = nodeCache[node];
-        if (constant == null)
-          throw new _AbortCurrentEvaluation(
-              errorReporter.circularity(contextChain, node));
-        return constant;
-      }
-
-      nodeCache[node] = null;
-      return nodeCache[node] = node.accept(this);
-    }
-    return node.accept(this);
-  }
-
-  Constant runInsideContext(TreeNode node, Constant fun()) {
-    try {
-      pushContext(node);
-      return fun();
-    } finally {
-      popContext(node);
-    }
-  }
-
-  Constant runInsideContextIfNoContext(TreeNode node, Constant fun()) {
-    if (contextChain.isEmpty) {
-      return runInsideContext(node, fun);
-    } else {
-      return fun();
-    }
-  }
-
-  pushContext(TreeNode contextNode) {
-    contextChain.add(contextNode);
-  }
-
-  popContext(TreeNode contextNode) {
-    assert(contextChain.last == contextNode);
-    contextChain.length = contextChain.length - 1;
-  }
-
-  defaultTreeNode(Node node) {
-    // Only a subset of the expression language is valid for constant
-    // evaluation.
-    throw 'Constant evaluation has no support for ${node.runtimeType} yet!';
-  }
-
-  visitNullLiteral(NullLiteral node) => nullConstant;
-
-  visitBoolLiteral(BoolLiteral node) {
-    return node.value ? trueConstant : falseConstant;
-  }
-
-  visitIntLiteral(IntLiteral node) {
-    // The frontend will ensure the integer literals are in signed 64-bit
-    // range.
-    return canonicalize(new IntConstant(node.value));
-  }
-
-  visitDoubleLiteral(DoubleLiteral node) {
-    return canonicalize(makeDoubleConstant(node.value));
-  }
-
-  visitStringLiteral(StringLiteral node) {
-    return canonicalize(new StringConstant(node.value));
-  }
-
-  visitTypeLiteral(TypeLiteral node) {
-    final DartType type = evaluateDartType(node, node.type);
-    return canonicalize(new TypeLiteralConstant(type));
-  }
-
-  visitConstantExpression(ConstantExpression node) {
-    // If there were already constants in the AST then we make sure we
-    // re-canonicalize them.  After running the transformer we will therefore
-    // have a fully-canonicalized constant DAG with roots coming from the
-    // [ConstantExpression] nodes in the AST.
-    return canonicalize(node.constant);
-  }
-
-  visitListLiteral(ListLiteral node) {
-    if (!node.isConst) {
-      throw new _AbortCurrentEvaluation(
-          errorReporter.nonConstLiteral(contextChain, node, 'List'));
-    }
-    final List<Constant> entries = new List<Constant>(node.expressions.length);
-    for (int i = 0; i < node.expressions.length; ++i) {
-      entries[i] = _evaluateSubexpression(node.expressions[i]);
-    }
-    if (hasUnevaluatedChild(node)) {
-      final expressions = new List<Expression>(node.expressions.length);
-      for (int i = 0; i < node.expressions.length; ++i) {
-        expressions[i] = unique(entries[i].asExpression());
-      }
-      return unevaluated(
-          node,
-          new ListLiteral(expressions,
-              typeArgument: node.typeArgument, isConst: true));
-    }
-    final DartType typeArgument = evaluateDartType(node, node.typeArgument);
-    return canonicalize(
-        backend.lowerListConstant(new ListConstant(typeArgument, entries)));
-  }
-
-  visitSetLiteral(SetLiteral node) {
-    if (!node.isConst) {
-      throw new _AbortCurrentEvaluation(
-          errorReporter.nonConstLiteral(contextChain, node, 'Set'));
-    }
-    final List<Constant> entries = new List<Constant>(node.expressions.length);
-    for (int i = 0; i < node.expressions.length; ++i) {
-      entries[i] = _evaluateSubexpression(node.expressions[i]);
-    }
-    if (hasUnevaluatedChild(node)) {
-      final expressions = new List<Expression>(node.expressions.length);
-      for (int i = 0; i < node.expressions.length; ++i) {
-        expressions[i] = unique(entries[i].asExpression());
-      }
-      return unevaluated(
-          node,
-          new SetLiteral(expressions,
-              typeArgument: node.typeArgument, isConst: true));
-    }
-    final DartType typeArgument = evaluateDartType(node, node.typeArgument);
-    return canonicalize(
-        backend.lowerSetConstant(new SetConstant(typeArgument, entries)));
-  }
-
-  visitMapLiteral(MapLiteral node) {
-    if (!node.isConst) {
-      throw new _AbortCurrentEvaluation(
-          errorReporter.nonConstLiteral(contextChain, node, 'Map'));
-    }
-    final Set<Constant> usedKeys = new Set<Constant>();
-    final List<ConstantMapEntry> entries =
-        new List<ConstantMapEntry>(node.entries.length);
-    for (int i = 0; i < node.entries.length; ++i) {
-      final key = _evaluateSubexpression(node.entries[i].key);
-      final value = _evaluateSubexpression(node.entries[i].value);
-      if (!usedKeys.add(key)) {
-        // TODO(kustermann): We should change the context handling from just
-        // capturing the `TreeNode`s to a `(TreeNode, String message)` tuple and
-        // report where the first key with the same value was.
-        throw new _AbortCurrentEvaluation(
-            errorReporter.duplicateKey(contextChain, node.entries[i], key));
-      }
-      entries[i] = new ConstantMapEntry(key, value);
-    }
-    if (hasUnevaluatedChild(node)) {
-      final mapEntries = new List<MapEntry>(node.entries.length);
-      for (int i = 0; i < node.entries.length; ++i) {
-        mapEntries[i] = new MapEntry(unique(entries[i].key.asExpression()),
-            unique(entries[i].value.asExpression()));
-      }
-      return unevaluated(
-          node,
-          new MapLiteral(mapEntries,
-              keyType: node.keyType, valueType: node.valueType, isConst: true));
-    }
-    final DartType keyType = evaluateDartType(node, node.keyType);
-    final DartType valueType = evaluateDartType(node, node.valueType);
-    return canonicalize(
-        backend.lowerMapConstant(new MapConstant(keyType, valueType, entries)));
-  }
-
-  visitFunctionExpression(FunctionExpression node) {
-    throw new _AbortCurrentEvaluation(
-        errorReporter.nonConstLiteral(contextChain, node, 'Function'));
-  }
-
-  visitConstructorInvocation(ConstructorInvocation node) {
-    final Constructor constructor = node.target;
-    final Class klass = constructor.enclosingClass;
-    if (!constructor.isConst) {
-      throw 'The front-end should ensure we do not encounter a '
-          'constructor invocation of a non-const constructor.';
-    }
-    if (constructor.function.body != null &&
-        constructor.function.body is! EmptyStatement) {
-      throw 'Constructor "$node" has non-trivial body "${constructor.function.body.runtimeType}".';
-    }
-    if (klass.isAbstract) {
-      throw 'Constructor "$node" belongs to abstract class "${klass}".';
-    }
-
-    final positionals = evaluatePositionalArguments(node.arguments);
-    final named = evaluateNamedArguments(node.arguments);
-
-    // Is the constructor unavailable due to separate compilation?
-    bool isUnavailable = constructor.isInExternalLibrary &&
-        constructor.initializers.isEmpty &&
-        constructor.enclosingClass.supertype != null;
-
-    if (isUnavailable || hasUnevaluatedChild(node)) {
-      return unevaluated(
-          node,
-          new ConstructorInvocation(constructor,
-              unevaluatedArguments(positionals, named, node.arguments.types),
-              isConst: true));
-    }
-
-    final typeArguments = evaluateTypeArguments(node, node.arguments);
-
-    // Fill in any missing type arguments with "dynamic".
-    for (int i = typeArguments.length; i < klass.typeParameters.length; i++) {
-      typeArguments.add(const DynamicType());
-    }
-
-    // Start building a new instance.
-    return withNewInstanceBuilder(klass, typeArguments, () {
-      return runInsideContextIfNoContext(node, () {
-        // "Run" the constructor (and any super constructor calls), which will
-        // initialize the fields of the new instance.
-        handleConstructorInvocation(
-            constructor, typeArguments, positionals, named);
-        final InstanceConstant result = instanceBuilder.buildInstance();
-
-        // Special case the dart:core's Symbol class here and convert it to a
-        // [SymbolConstant].  For invalid values we report a compile-time error.
-        if (result.classNode == coreTypes.internalSymbolClass) {
-          // The dart:_internal's Symbol class has only the name field.
-          assert(coreTypes.internalSymbolClass.fields
-                  .where((f) => !f.isStatic)
-                  .length ==
-              1);
-          final nameValue = result.fieldValues.values.single;
-
-          if (nameValue is StringConstant &&
-              isValidSymbolName(nameValue.value)) {
-            return canonicalize(new SymbolConstant(nameValue.value, null));
-          }
-          throw new _AbortCurrentEvaluation(errorReporter.invalidSymbolName(
-              contextChain, node.arguments.positional.first, nameValue));
-        }
-
-        return canonicalize(result);
-      });
-    });
-  }
-
-  bool isValidSymbolName(String name) {
-    // See https://api.dartlang.org/stable/2.0.0/dart-core/Symbol/Symbol.html:
-    //
-    //  A qualified name is a valid name preceded by a public identifier name and
-    //  a '.', e.g., foo.bar.baz= is a qualified version of baz=.
-    //
-    //  That means that the content of the name String must be either
-    //     - a valid public Dart identifier (that is, an identifier not
-    //       starting with "_"),
-    //     - such an identifier followed by "=" (a setter name),
-    //     - the name of a declarable operator,
-    //     - any of the above preceded by any number of qualifiers, where a
-    //       qualifier is a non-private identifier followed by '.',
-    //     - or the empty string (the default name of a library with no library
-    //       name declaration).
-
-    const operatorNames = const <String>[
-      '+',
-      '-',
-      '*',
-      '/',
-      '%',
-      '~/',
-      '&',
-      '|',
-      '^',
-      '~',
-      '<<',
-      '>>',
-      '<',
-      '<=',
-      '>',
-      '>=',
-      '==',
-      '[]',
-      '[]=',
-      'unary-'
-    ];
-
-    if (name == null) return false;
-    if (name == '') return true;
-
-    final parts = name.split('.');
-
-    // Each qualifier must be a public identifier.
-    for (int i = 0; i < parts.length - 1; ++i) {
-      if (!isValidPublicIdentifier(parts[i])) return false;
-    }
-
-    String last = parts.last;
-    if (operatorNames.contains(last)) {
-      return true;
-    }
-    if (last.endsWith('=')) {
-      last = last.substring(0, last.length - 1);
-    }
-    if (!isValidPublicIdentifier(last)) return false;
-
-    return true;
-  }
-
-  /// From the Dart Language specification:
-  ///
-  ///   IDENTIFIER:
-  ///     IDENTIFIER_START IDENTIFIER_PART*
-  ///
-  ///   IDENTIFIER_START:
-  ///       IDENTIFIER_START_NO_DOLLAR | ‘$’
-  ///
-  ///   IDENTIFIER_PART:
-  ///       IDENTIFIER_START | DIGIT
-  ///
-  ///   IDENTIFIER_NO_DOLLAR:
-  ///     IDENTIFIER_START_NO_DOLLAR IDENTIFIER_PART_NO_DOLLAR*
-  ///
-  ///   IDENTIFIER_START_NO_DOLLAR:
-  ///       LETTER | '_'
-  ///
-  ///   IDENTIFIER_PART_NO_DOLLAR:
-  ///       IDENTIFIER_START_NO_DOLLAR | DIGIT
-  ///
-  static final publicIdentifierRegExp =
-      new RegExp(r'^[a-zA-Z$][a-zA-Z0-9_$]*$');
-
-  static const nonUsableKeywords = const <String>[
-    'assert',
-    'break',
-    'case',
-    'catch',
-    'class',
-    'const',
-    'continue',
-    'default',
-    'do',
-    'else',
-    'enum',
-    'extends',
-    'false',
-    'final',
-    'finally',
-    'for',
-    'if',
-    'in',
-    'is',
-    'new',
-    'null',
-    'rethrow',
-    'return',
-    'super',
-    'switch',
-    'this',
-    'throw',
-    'true',
-    'try',
-    'var',
-    'while',
-    'with',
-  ];
-
-  bool isValidPublicIdentifier(String name) {
-    return publicIdentifierRegExp.hasMatch(name) &&
-        !nonUsableKeywords.contains(name);
-  }
-
-  handleConstructorInvocation(
-      Constructor constructor,
-      List<DartType> typeArguments,
-      List<Constant> positionalArguments,
-      Map<String, Constant> namedArguments) {
-    return runInsideContext(constructor, () {
-      return withNewEnvironment(() {
-        final Class klass = constructor.enclosingClass;
-        final FunctionNode function = constructor.function;
-
-        // We simulate now the constructor invocation.
-
-        // Step 1) Map type arguments and normal arguments from caller to callee.
-        for (int i = 0; i < klass.typeParameters.length; i++) {
-          env.addTypeParameterValue(klass.typeParameters[i], typeArguments[i]);
-        }
-        for (int i = 0; i < function.positionalParameters.length; i++) {
-          final VariableDeclaration parameter =
-              function.positionalParameters[i];
-          final Constant value = (i < positionalArguments.length)
-              ? positionalArguments[i]
-              : _evaluateSubexpression(parameter.initializer);
-          env.addVariableValue(parameter, value);
-        }
-        for (final VariableDeclaration parameter in function.namedParameters) {
-          final Constant value = namedArguments[parameter.name] ??
-              _evaluateSubexpression(parameter.initializer);
-          env.addVariableValue(parameter, value);
-        }
-
-        // Step 2) Run all initializers (including super calls) with environment setup.
-        for (final Field field in klass.fields) {
-          if (!field.isStatic) {
-            instanceBuilder.setFieldValue(
-                field, _evaluateSubexpression(field.initializer));
-          }
-        }
-        for (final Initializer init in constructor.initializers) {
-          if (init is FieldInitializer) {
-            instanceBuilder.setFieldValue(
-                init.field, _evaluateSubexpression(init.value));
-          } else if (init is LocalInitializer) {
-            final VariableDeclaration variable = init.variable;
-            env.addVariableValue(
-                variable, _evaluateSubexpression(variable.initializer));
-          } else if (init is SuperInitializer) {
-            handleConstructorInvocation(
-                init.target,
-                evaluateSuperTypeArguments(
-                    init, constructor.enclosingClass.supertype),
-                evaluatePositionalArguments(init.arguments),
-                evaluateNamedArguments(init.arguments));
-          } else if (init is RedirectingInitializer) {
-            // Since a redirecting constructor targets a constructor of the same
-            // class, we pass the same [typeArguments].
-            handleConstructorInvocation(
-                init.target,
-                typeArguments,
-                evaluatePositionalArguments(init.arguments),
-                evaluateNamedArguments(init.arguments));
-          } else if (init is AssertInitializer) {
-            if (enableAsserts) {
-              final Constant condition =
-                  _evaluateSubexpression(init.statement.condition);
-
-              if (condition is BoolConstant) {
-                if (!condition.value) {
-                  if (init.statement.message == null) {
-                    throw new _AbortCurrentEvaluation(
-                        errorReporter.failedAssertion(
-                            contextChain, init.statement.condition, null));
-                  }
-                  final Constant message =
-                      _evaluateSubexpression(init.statement.message);
-                  if (message is StringConstant) {
-                    throw new _AbortCurrentEvaluation(
-                        errorReporter.failedAssertion(contextChain,
-                            init.statement.condition, message.value));
-                  }
-                  throw new _AbortCurrentEvaluation(
-                      errorReporter.invalidDartType(
-                          contextChain,
-                          init.statement.message,
-                          message,
-                          typeEnvironment.stringType));
-                }
-              } else {
-                throw new _AbortCurrentEvaluation(errorReporter.invalidDartType(
-                    contextChain,
-                    init.statement.condition,
-                    condition,
-                    typeEnvironment.boolType));
-              }
-            }
-          } else {
-            throw new Exception(
-                'No support for handling initializer of type "${init.runtimeType}".');
-          }
-        }
-      });
-    });
-  }
-
-  visitInvalidExpression(InvalidExpression node) {
-    throw new _AbortCurrentEvaluation(node.message);
-  }
-
-  visitMethodInvocation(MethodInvocation node) {
-    // We have no support for generic method invocation atm.
-    assert(node.arguments.named.isEmpty);
-
-    final Constant receiver = _evaluateSubexpression(node.receiver);
-    final List<Constant> arguments =
-        evaluatePositionalArguments(node.arguments);
-
-    if (hasUnevaluatedChild(node)) {
-      return unevaluated(
-          node,
-          new MethodInvocation(unique(receiver.asExpression()), node.name,
-              unevaluatedArguments(arguments, {}, node.arguments.types)));
-    }
-
-    // TODO(http://dartbug.com/31799): Ensure we only invoke ==/!= on
-    // null/bool/int/double/String objects.
-
-    // Handle == and != first (it's common between all types).
-    if (arguments.length == 1 && node.name.name == '==') {
-      final right = arguments[0];
-      return receiver == right ? trueConstant : falseConstant;
-    }
-    if (arguments.length == 1 && node.name.name == '!=') {
-      final right = arguments[0];
-      return receiver != right ? trueConstant : falseConstant;
-    }
-
-    // This is a white-listed set of methods we need to support on constants.
-    if (receiver is StringConstant) {
-      if (arguments.length == 1) {
-        switch (node.name.name) {
-          case '+':
-            final Constant other = arguments[0];
-            if (other is StringConstant) {
-              return canonicalize(
-                  new StringConstant(receiver.value + other.value));
-            }
-            throw new _AbortCurrentEvaluation(
-                errorReporter.invalidBinaryOperandType(
-                    contextChain,
-                    node,
-                    receiver,
-                    '+',
-                    typeEnvironment.stringType,
-                    other.getType(typeEnvironment)));
-        }
-      }
-    } else if (receiver is IntConstant) {
-      if (arguments.length == 0) {
-        switch (node.name.name) {
-          case 'unary-':
-            return canonicalize(new IntConstant(-receiver.value));
-          case '~':
-            return canonicalize(new IntConstant(~receiver.value));
-        }
-      } else if (arguments.length == 1) {
-        final Constant other = arguments[0];
-        final op = node.name.name;
-        if (other is IntConstant) {
-          if ((op == '<<' || op == '>>') && other.value < 0) {
-            throw new _AbortCurrentEvaluation(errorReporter.negativeShift(
-                contextChain,
-                node.arguments.positional.first,
-                receiver,
-                op,
-                other));
-          }
-          switch (op) {
-            case '|':
-              return canonicalize(
-                  new IntConstant(receiver.value | other.value));
-            case '&':
-              return canonicalize(
-                  new IntConstant(receiver.value & other.value));
-            case '^':
-              return canonicalize(
-                  new IntConstant(receiver.value ^ other.value));
-            case '<<':
-              return canonicalize(
-                  new IntConstant(receiver.value << other.value));
-            case '>>':
-              return canonicalize(
-                  new IntConstant(receiver.value >> other.value));
-          }
-        }
-
-        if (other is IntConstant) {
-          if (other.value == 0 && (op == '%' || op == '~/')) {
-            throw new _AbortCurrentEvaluation(errorReporter.zeroDivisor(
-                contextChain, node.arguments.positional.first, receiver, op));
-          }
-
-          return evaluateBinaryNumericOperation(
-              node.name.name, receiver.value, other.value, node);
-        } else if (other is DoubleConstant) {
-          return evaluateBinaryNumericOperation(
-              node.name.name, receiver.value, other.value, node);
-        }
-        throw new _AbortCurrentEvaluation(
-            errorReporter.invalidBinaryOperandType(
-                contextChain,
-                node,
-                receiver,
-                '${node.name.name}',
-                typeEnvironment.numType,
-                other.getType(typeEnvironment)));
-      }
-    } else if (receiver is DoubleConstant) {
-      if (arguments.length == 0) {
-        switch (node.name.name) {
-          case 'unary-':
-            return canonicalize(makeDoubleConstant(-receiver.value));
-        }
-      } else if (arguments.length == 1) {
-        final Constant other = arguments[0];
-
-        if (other is IntConstant || other is DoubleConstant) {
-          final num value = (other is IntConstant)
-              ? other.value
-              : (other as DoubleConstant).value;
-          return evaluateBinaryNumericOperation(
-              node.name.name, receiver.value, value, node);
-        }
-        throw new _AbortCurrentEvaluation(
-            errorReporter.invalidBinaryOperandType(
-                contextChain,
-                node,
-                receiver,
-                '${node.name.name}',
-                typeEnvironment.numType,
-                other.getType(typeEnvironment)));
-      }
-    }
-    throw new _AbortCurrentEvaluation(errorReporter.invalidMethodInvocation(
-        contextChain, node, receiver, node.name.name));
-  }
-
-  visitLogicalExpression(LogicalExpression node) {
-    final Constant left = _evaluateSubexpression(node.left);
-    if (left is UnevaluatedConstant) {
-      return unevaluated(
-          node,
-          new LogicalExpression(unique(left.expression), node.operator,
-              cloner.clone(node.right)));
-    }
-    switch (node.operator) {
-      case '||':
-        if (left is BoolConstant) {
-          if (left.value) return trueConstant;
-
-          final Constant right = _evaluateSubexpression(node.right);
-          if (right is BoolConstant || right is UnevaluatedConstant) {
-            return right;
-          }
-
-          throw new _AbortCurrentEvaluation(
-              errorReporter.invalidBinaryOperandType(
-                  contextChain,
-                  node,
-                  left,
-                  '${node.operator}',
-                  typeEnvironment.boolType,
-                  right.getType(typeEnvironment)));
-        }
-        throw new _AbortCurrentEvaluation(errorReporter.invalidMethodInvocation(
-            contextChain, node, left, '${node.operator}'));
-      case '&&':
-        if (left is BoolConstant) {
-          if (!left.value) return falseConstant;
-
-          final Constant right = _evaluateSubexpression(node.right);
-          if (right is BoolConstant || right is UnevaluatedConstant) {
-            return right;
-          }
-
-          throw new _AbortCurrentEvaluation(
-              errorReporter.invalidBinaryOperandType(
-                  contextChain,
-                  node,
-                  left,
-                  '${node.operator}',
-                  typeEnvironment.boolType,
-                  right.getType(typeEnvironment)));
-        }
-        throw new _AbortCurrentEvaluation(errorReporter.invalidMethodInvocation(
-            contextChain, node, left, '${node.operator}'));
-      case '??':
-        return (left is! NullConstant)
-            ? left
-            : _evaluateSubexpression(node.right);
-      default:
-        throw new _AbortCurrentEvaluation(errorReporter.invalidMethodInvocation(
-            contextChain, node, left, '${node.operator}'));
-    }
-  }
-
-  visitConditionalExpression(ConditionalExpression node) {
-    final Constant condition = _evaluateSubexpression(node.condition);
-    if (condition == trueConstant) {
-      return _evaluateSubexpression(node.then);
-    } else if (condition == falseConstant) {
-      return _evaluateSubexpression(node.otherwise);
-    } else if (condition is UnevaluatedConstant) {
-      return unevaluated(
-          node,
-          new ConditionalExpression(
-              unique(condition.expression),
-              cloner.clone(node.then),
-              cloner.clone(node.otherwise),
-              node.staticType));
-    } else {
-      throw new _AbortCurrentEvaluation(errorReporter.invalidDartType(
-          contextChain, node, condition, typeEnvironment.boolType));
-    }
-  }
-
-  visitPropertyGet(PropertyGet node) {
-    if (node.receiver is ThisExpression) {
-      // Access "this" during instance creation.
-      for (final Field field in instanceBuilder.fields.keys) {
-        if (field.name == node.name) {
-          return instanceBuilder.fields[field];
-        }
-      }
-      throw 'Could not evaluate field get ${node.name} on incomplete instance';
-    }
-
-    final Constant receiver = _evaluateSubexpression(node.receiver);
-    if (receiver is StringConstant && node.name.name == 'length') {
-      return canonicalize(new IntConstant(receiver.value.length));
-    } else if (receiver is InstanceConstant) {
-      for (final Reference fieldRef in receiver.fieldValues.keys) {
-        if (fieldRef.asField.name == node.name) {
-          return receiver.fieldValues[fieldRef];
-        }
-      }
-    } else if (receiver is UnevaluatedConstant) {
-      return unevaluated(
-          node,
-          new PropertyGet(
-              unique(receiver.expression), node.name, node.interfaceTarget));
-    }
-    throw 'Could not evaluate property get on $receiver.';
-  }
-
-  visitLet(Let node) {
-    env.addVariableValue(
-        node.variable, _evaluateSubexpression(node.variable.initializer));
-    return _evaluateSubexpression(node.body);
-  }
-
-  visitVariableGet(VariableGet node) {
-    // Not every variable which a [VariableGet] refers to must be marked as
-    // constant.  For example function parameters as well as constructs
-    // desugared to [Let] expressions are ok.
-    //
-    // TODO(kustermann): The heuristic of allowing all [VariableGet]s on [Let]
-    // variables might allow more than it should.
-    final VariableDeclaration variable = node.variable;
-    if (variable.parent is Let || _isFormalParameter(variable)) {
-      final Constant constant = env.lookupVariable(node.variable);
-      if (constant == null) {
-        throw new _AbortCurrentEvaluation(errorReporter.nonConstantVariableGet(
-            contextChain, node, variable.name));
-      }
-      return constant;
-    }
-    if (variable.isConst) {
-      return _evaluateSubexpression(variable.initializer);
-    }
-    throw new Exception('The front-end should ensure we do not encounter a '
-        'variable get of a non-const variable.');
-  }
-
-  visitStaticGet(StaticGet node) {
-    return withNewEnvironment(() {
-      final Member target = node.target;
-      if (target is Field) {
-        if (target.isConst) {
-          if (target.isInExternalLibrary && target.initializer == null) {
-            // The variable is unavailable due to separate compilation.
-            return unevaluated(node, new StaticGet(target));
-          }
-          return runInsideContext(target, () {
-            return _evaluateSubexpression(target.initializer);
-          });
-        }
-        throw new _AbortCurrentEvaluation(
-            errorReporter.invalidStaticInvocation(contextChain, node, target));
-      } else if (target is Procedure) {
-        if (target.kind == ProcedureKind.Method) {
-          return canonicalize(new TearOffConstant(target));
-        }
-        throw new _AbortCurrentEvaluation(
-            errorReporter.invalidStaticInvocation(contextChain, node, target));
-      } else {
-        throw new Exception(
-            'No support for ${target.runtimeType} in a static-get.');
-      }
-    });
-  }
-
-  visitStringConcatenation(StringConcatenation node) {
-    final List<Object> concatenated = <Object>[new StringBuffer()];
-    for (int i = 0; i < node.expressions.length; i++) {
-      Constant constant = _evaluateSubexpression(node.expressions[i]);
-      if (constant is PrimitiveConstant) {
-        String value = constant.value.toString();
-        Object last = concatenated.last;
-        if (last is StringBuffer) {
-          last.write(value);
-        } else {
-          concatenated.add(new StringBuffer(value));
-        }
-      } else if (constant is UnevaluatedConstant) {
-        concatenated.add(constant);
-      } else {
-        throw new _AbortCurrentEvaluation(errorReporter
-            .invalidStringInterpolationOperand(contextChain, node, constant));
-      }
-    }
-    if (concatenated.length > 1) {
-      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] = unique(value.expression);
-        } else {
-          expressions[i] = new ConstantExpression(
-              canonicalize(new StringConstant(value.toString())));
-        }
-      }
-      return unevaluated(node, new StringConcatenation(expressions));
-    }
-    return canonicalize(new StringConstant(concatenated.single.toString()));
-  }
-
-  visitStaticInvocation(StaticInvocation node) {
-    final Procedure target = node.target;
-    final Arguments arguments = node.arguments;
-    final positionals = evaluatePositionalArguments(arguments);
-    final named = evaluateNamedArguments(arguments);
-    if (hasUnevaluatedChild(node)) {
-      return unevaluated(
-          node,
-          new StaticInvocation(
-              target, unevaluatedArguments(positionals, named, arguments.types),
-              isConst: true));
-    }
-    if (target.kind == ProcedureKind.Factory) {
-      if (target.isConst &&
-          target.name.name == "fromEnvironment" &&
-          target.enclosingLibrary == coreTypes.coreLibrary &&
-          positionals.length == 1) {
-        if (environmentDefines != null) {
-          // Evaluate environment constant.
-          Constant name = positionals.single;
-          if (name is StringConstant) {
-            String value = environmentDefines[name.value];
-            Constant defaultValue = named["defaultValue"];
-
-            if (target.enclosingClass == coreTypes.boolClass) {
-              Constant boolConstant = value == "true"
-                  ? trueConstant
-                  : value == "false"
-                      ? falseConstant
-                      : defaultValue is BoolConstant
-                          ? defaultValue.value ? trueConstant : falseConstant
-                          : defaultValue is NullConstant
-                              ? nullConstant
-                              : falseConstant;
-              return boolConstant;
-            } else if (target.enclosingClass == coreTypes.intClass) {
-              int intValue = value != null ? int.tryParse(value) : null;
-              intValue ??=
-                  defaultValue is IntConstant ? defaultValue.value : null;
-              if (intValue == null) return nullConstant;
-              return canonicalize(new IntConstant(intValue));
-            } else if (target.enclosingClass == coreTypes.stringClass) {
-              value ??=
-                  defaultValue is StringConstant ? defaultValue.value : null;
-              if (value == null) return nullConstant;
-              return canonicalize(new StringConstant(value));
-            }
-          }
-          // TODO(askesc): Give more meaningful error message if name is null.
-        } else {
-          // Leave environment constant unevaluated.
-          return unevaluated(
-              node,
-              new StaticInvocation(target,
-                  unevaluatedArguments(positionals, named, arguments.types),
-                  isConst: true));
-        }
-      }
-    } else if (target.name.name == 'identical') {
-      // Ensure the "identical()" function comes from dart:core.
-      final parent = target.parent;
-      if (parent is Library && parent == coreTypes.coreLibrary) {
-        final Constant left = positionals[0];
-        final Constant right = positionals[1];
-        // Since we canonicalize constants during the evaluation, we can use
-        // identical here.
-        return identical(left, right) ? trueConstant : falseConstant;
-      }
-    }
-    throw new _AbortCurrentEvaluation(
-        errorReporter.invalidStaticInvocation(contextChain, node, target));
-  }
-
-  visitAsExpression(AsExpression node) {
-    final Constant constant = _evaluateSubexpression(node.operand);
-    if (constant is UnevaluatedConstant) {
-      return unevaluated(
-          node, new AsExpression(unique(constant.expression), node.type));
-    }
-    ensureIsSubtype(constant, evaluateDartType(node, node.type), node);
-    return constant;
-  }
-
-  visitNot(Not node) {
-    final Constant constant = _evaluateSubexpression(node.operand);
-    if (constant is BoolConstant) {
-      return constant == trueConstant ? falseConstant : trueConstant;
-    }
-    if (constant is UnevaluatedConstant) {
-      return unevaluated(node, new Not(unique(constant.expression)));
-    }
-    throw new _AbortCurrentEvaluation(errorReporter.invalidDartType(
-        contextChain, node, constant, typeEnvironment.boolType));
-  }
-
-  visitSymbolLiteral(SymbolLiteral node) {
-    final libraryReference =
-        node.value.startsWith('_') ? libraryOf(node).reference : null;
-    return canonicalize(new SymbolConstant(node.value, libraryReference));
-  }
-
-  visitInstantiation(Instantiation node) {
-    final Constant constant = _evaluateSubexpression(node.expression);
-    if (constant is TearOffConstant) {
-      if (node.typeArguments.length ==
-          constant.procedure.function.typeParameters.length) {
-        final typeArguments = evaluateDartTypes(node, node.typeArguments);
-        return canonicalize(
-            new PartialInstantiationConstant(constant, typeArguments));
-      }
-      throw new Exception(
-          'The number of type arguments supplied in the partial instantiation '
-          'does not match the number of type arguments of the $constant.');
-    }
-    if (constant is UnevaluatedConstant) {
-      return unevaluated(node,
-          new Instantiation(unique(constant.expression), node.typeArguments));
-    }
-    throw new Exception(
-        'Only tear-off constants can be partially instantiated.');
-  }
-
-  @override
-  visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
-    throw new _AbortCurrentEvaluation(
-        errorReporter.deferredLibrary(contextChain, node, node.import.name));
-  }
-
-  // Helper methods:
-
-  Constant makeDoubleConstant(double value) {
-    if (targetingJavaScript) {
-      // Convert to an integer when possible (matching the runtime behavior
-      // of `is int`).
-      if (value.isFinite) {
-        var i = value.toInt();
-        if (value == i.toDouble()) return new IntConstant(i);
-      }
-    }
-    return new DoubleConstant(value);
-  }
-
-  void ensureIsSubtype(Constant constant, DartType type, TreeNode node) {
-    DartType constantType = constant.getType(typeEnvironment);
-
-    if (!typeEnvironment.isSubtypeOf(constantType, type)) {
-      throw new _AbortCurrentEvaluation(
-          errorReporter.invalidDartType(contextChain, node, constant, type));
-    }
-  }
-
-  List<DartType> evaluateTypeArguments(TreeNode node, Arguments arguments) {
-    return evaluateDartTypes(node, arguments.types);
-  }
-
-  List<DartType> evaluateSuperTypeArguments(TreeNode node, Supertype type) {
-    return evaluateDartTypes(node, type.typeArguments);
-  }
-
-  List<DartType> evaluateDartTypes(TreeNode node, List<DartType> types) {
-    // TODO: Once the frontend gurantees that there are no free type variables
-    // left over after stubstitution, we can enable this shortcut again:
-    // if (env.isEmpty) return types;
-    return types.map((t) => evaluateDartType(node, t)).toList();
-  }
-
-  DartType evaluateDartType(TreeNode node, DartType type) {
-    final result = env.subsituteType(type);
-
-    if (!isInstantiated(result)) {
-      throw new _AbortCurrentEvaluation(
-          errorReporter.freeTypeParameter(contextChain, node, type));
-    }
-
-    return result;
-  }
-
-  List<Constant> evaluatePositionalArguments(Arguments arguments) {
-    return arguments.positional.map((Expression node) {
-      return _evaluateSubexpression(node);
-    }).toList();
-  }
-
-  Map<String, Constant> evaluateNamedArguments(Arguments arguments) {
-    if (arguments.named.isEmpty) return const <String, Constant>{};
-
-    final Map<String, Constant> named = {};
-    arguments.named.forEach((NamedExpression pair) {
-      named[pair.name] = _evaluateSubexpression(pair.value);
-    });
-    return named;
-  }
-
-  Arguments unevaluatedArguments(List<Constant> positionalArgs,
-      Map<String, Constant> namedArgs, List<DartType> types) {
-    final positional = new List<Expression>(positionalArgs.length);
-    final named = new List<NamedExpression>(namedArgs.length);
-    for (int i = 0; i < positionalArgs.length; ++i) {
-      positional[i] = unique(positionalArgs[i].asExpression());
-    }
-    int i = 0;
-    namedArgs.forEach((String name, Constant value) {
-      named[i++] = new NamedExpression(name, unique(value.asExpression()));
-    });
-    return new Arguments(positional, named: named, types: types);
-  }
-
-  Constant canonicalize(Constant constant) {
-    return canonicalizationCache.putIfAbsent(constant, () => constant);
-  }
-
-  withNewInstanceBuilder(Class klass, List<DartType> typeArguments, fn()) {
-    InstanceBuilder old = instanceBuilder;
-    try {
-      instanceBuilder = new InstanceBuilder(klass, typeArguments);
-      return fn();
-    } finally {
-      instanceBuilder = old;
-    }
-  }
-
-  withNewEnvironment(fn()) {
-    final EvaluationEnvironment oldEnv = env;
-    try {
-      env = new EvaluationEnvironment();
-      return fn();
-    } finally {
-      env = oldEnv;
-    }
-  }
-
-  Constant evaluateBinaryNumericOperation(
-      String op, num a, num b, TreeNode node) {
-    if (targetingJavaScript) {
-      a = a.toDouble();
-      b = b.toDouble();
-    }
-    num result;
-    switch (op) {
-      case '+':
-        result = a + b;
-        break;
-      case '-':
-        result = a - b;
-        break;
-      case '*':
-        result = a * b;
-        break;
-      case '/':
-        result = a / b;
-        break;
-      case '~/':
-        result = a ~/ b;
-        break;
-      case '%':
-        result = a % b;
-        break;
-    }
-
-    if (result is int) {
-      return canonicalize(new IntConstant(result.toSigned(64)));
-    }
-    if (result is double) {
-      return canonicalize(makeDoubleConstant(result));
-    }
-
-    switch (op) {
-      case '<':
-        return a < b ? trueConstant : falseConstant;
-      case '<=':
-        return a <= b ? trueConstant : falseConstant;
-      case '>=':
-        return a >= b ? trueConstant : falseConstant;
-      case '>':
-        return a > b ? trueConstant : falseConstant;
-    }
-
-    throw new Exception("Unexpected binary numeric operation '$op'.");
-  }
-
-  Library libraryOf(TreeNode node) {
-    // The tree structure of the kernel AST ensures we always have an enclosing
-    // library.
-    while (true) {
-      if (node is Library) return node;
-      node = node.parent;
-    }
-  }
-}
-
-/// Holds the necessary information for a constant object, namely
-///   * the [klass] being instantiated
-///   * the [typeArguments] used for the instantiation
-///   * the [fields] the instance will obtain (all fields from the
-///     instantiated [klass] up to the [Object] klass).
-class InstanceBuilder {
-  /// The class of the new instance.
-  final Class klass;
-
-  /// The values of the type parameters of the new instance.
-  final List<DartType> typeArguments;
-
-  /// The field values of the new instance.
-  final Map<Field, Constant> fields = <Field, Constant>{};
-
-  InstanceBuilder(this.klass, this.typeArguments);
-
-  void setFieldValue(Field field, Constant constant) {
-    fields[field] = constant;
-  }
-
-  InstanceConstant buildInstance() {
-    final Map<Reference, Constant> fieldValues = <Reference, Constant>{};
-    fields.forEach((Field field, Constant value) {
-      fieldValues[field.reference] = value;
-    });
-    return new InstanceConstant(klass.reference, typeArguments, fieldValues);
-  }
-}
-
-/// Holds an environment of type parameters, parameters and variables.
-class EvaluationEnvironment {
-  /// The values of the type parameters in scope.
-  final Map<TypeParameter, DartType> _typeVariables =
-      <TypeParameter, DartType>{};
-
-  /// The values of the parameters/variables in scope.
-  final Map<VariableDeclaration, Constant> _variables =
-      <VariableDeclaration, Constant>{};
-
-  /// Whether the current environment is empty.
-  bool get isEmpty => _typeVariables.isEmpty && _variables.isEmpty;
-
-  void addTypeParameterValue(TypeParameter parameter, DartType value) {
-    assert(!_typeVariables.containsKey(parameter));
-    _typeVariables[parameter] = value;
-  }
-
-  void addVariableValue(VariableDeclaration variable, Constant value) {
-    assert(!_variables.containsKey(variable));
-    _variables[variable] = value;
-  }
-
-  DartType lookupParameterValue(TypeParameter parameter) {
-    final DartType value = _typeVariables[parameter];
-    assert(value != null);
-    return value;
-  }
-
-  Constant lookupVariable(VariableDeclaration variable) {
-    return _variables[variable];
-  }
-
-  DartType subsituteType(DartType type) {
-    if (_typeVariables.isEmpty) return type;
-    return substitute(type, _typeVariables);
-  }
-}
-
-/// The different kinds of number semantics supported by the constant evaluator.
-enum NumberSemantics {
-  /// Dart VM number semantics.
-  vm,
-
-  /// JavaScript (Dart2js and DDC) number semantics.
-  js,
-}
-
-// Backend specific constant evaluation behavior
-class ConstantsBackend {
-  const ConstantsBackend();
-
-  /// Lowering of a list constant to a backend-specific representation.
-  Constant lowerListConstant(ListConstant constant) => constant;
-
-  /// Lowering of a set constant to a backend-specific representation.
-  Constant lowerSetConstant(SetConstant constant) => constant;
-
-  /// Lowering of a map constant to a backend-specific representation.
-  Constant lowerMapConstant(MapConstant constant) => constant;
-
-  /// Number semantics to use for this backend.
-  NumberSemantics get numberSemantics => NumberSemantics.vm;
-}
-
-// Used as control-flow to abort the current evaluation.
-class _AbortCurrentEvaluation {
-  final String message;
-  _AbortCurrentEvaluation(this.message);
-}
-
-abstract class ErrorReporter {
-  const ErrorReporter();
-
-  Uri getFileUri(TreeNode node) {
-    while (node is! FileUriNode) {
-      node = node.parent;
-    }
-    return (node as FileUriNode).fileUri;
-  }
-
-  int getFileOffset(TreeNode node) {
-    while (node.fileOffset == TreeNode.noOffset) {
-      node = node.parent;
-    }
-    return node == null ? TreeNode.noOffset : node.fileOffset;
-  }
-
-  String freeTypeParameter(
-      List<TreeNode> context, TreeNode node, DartType type);
-  String invalidDartType(List<TreeNode> context, TreeNode node,
-      Constant receiver, DartType expectedType);
-  String invalidBinaryOperandType(List<TreeNode> context, TreeNode node,
-      Constant receiver, String op, DartType expectedType, DartType actualType);
-  String invalidMethodInvocation(
-      List<TreeNode> context, TreeNode node, Constant receiver, String op);
-  String invalidStaticInvocation(
-      List<TreeNode> context, TreeNode node, Member target);
-  String invalidStringInterpolationOperand(
-      List<TreeNode> context, TreeNode node, Constant constant);
-  String invalidSymbolName(
-      List<TreeNode> context, TreeNode node, Constant constant);
-  String zeroDivisor(
-      List<TreeNode> context, TreeNode node, IntConstant receiver, String op);
-  String negativeShift(List<TreeNode> context, TreeNode node,
-      IntConstant receiver, String op, IntConstant argument);
-  String nonConstLiteral(List<TreeNode> context, TreeNode node, String klass);
-  String duplicateKey(List<TreeNode> context, TreeNode node, Constant key);
-  String failedAssertion(List<TreeNode> context, TreeNode node, String message);
-  String nonConstantVariableGet(
-      List<TreeNode> context, TreeNode node, String variableName);
-  String deferredLibrary(
-      List<TreeNode> context, TreeNode node, String importName);
-  String circularity(List<TreeNode> context, TreeNode node);
-}
-
-class SimpleErrorReporter extends ErrorReporter {
-  const SimpleErrorReporter();
-
-  String report(List<TreeNode> context, String what, TreeNode node) {
-    io.exitCode = 42;
-    final Uri uri = getFileUri(node);
-    final int fileOffset = getFileOffset(node);
-    final String message = '$uri:$fileOffset Constant evaluation error: $what';
-    io.stderr.writeln(message);
-    return message;
-  }
-
-  @override
-  String freeTypeParameter(
-      List<TreeNode> context, TreeNode node, DartType type) {
-    return report(
-        context, 'Expected type to be instantiated but was ${type}', node);
-  }
-
-  @override
-  String invalidDartType(List<TreeNode> context, TreeNode node,
-      Constant receiver, DartType expectedType) {
-    return report(
-        context,
-        'Expected expression to evaluate to "$expectedType" but got "$receiver.',
-        node);
-  }
-
-  @override
-  String invalidBinaryOperandType(
-      List<TreeNode> context,
-      TreeNode node,
-      Constant receiver,
-      String op,
-      DartType expectedType,
-      DartType actualType) {
-    return report(
-        context,
-        'Calling "$op" on "$receiver" needs operand of type '
-        '"$expectedType" (but got "$actualType")',
-        node);
-  }
-
-  @override
-  String invalidMethodInvocation(
-      List<TreeNode> context, TreeNode node, Constant receiver, String op) {
-    return report(context,
-        'Cannot call "$op" on "$receiver" in constant expression', node);
-  }
-
-  @override
-  String invalidStaticInvocation(
-      List<TreeNode> context, TreeNode node, Member target) {
-    return report(
-        context, 'Cannot invoke "$target" inside a constant expression', node);
-  }
-
-  @override
-  String invalidStringInterpolationOperand(
-      List<TreeNode> context, TreeNode node, Constant constant) {
-    return report(
-        context,
-        'Only null/bool/int/double/String values are allowed as string '
-        'interpolation expressions during constant evaluation (was: "$constant").',
-        node);
-  }
-
-  @override
-  String invalidSymbolName(
-      List<TreeNode> context, TreeNode node, Constant constant) {
-    return report(
-        context,
-        'The symbol name must be a valid public Dart member name, public '
-        'constructor name, or library name, optionally qualified.',
-        node);
-  }
-
-  @override
-  String zeroDivisor(
-      List<TreeNode> context, TreeNode node, IntConstant receiver, String op) {
-    return report(
-        context,
-        "Binary operator '$op' on '${receiver.value}' requires non-zero "
-        "divisor, but divisor was '0'.",
-        node);
-  }
-
-  @override
-  String negativeShift(List<TreeNode> context, TreeNode node,
-      IntConstant receiver, String op, IntConstant argument) {
-    return report(
-        context,
-        "Binary operator '$op' on '${receiver.value}' requires non-negative "
-        "operand, but was '${argument.value}'.",
-        node);
-  }
-
-  @override
-  String nonConstLiteral(List<TreeNode> context, TreeNode node, String klass) {
-    return report(
-        context,
-        'Cannot have a non-constant $klass literal within a const context.',
-        node);
-  }
-
-  @override
-  String duplicateKey(List<TreeNode> context, TreeNode node, Constant key) {
-    return report(
-        context,
-        'Duplicate keys are not allowed in constant maps (found duplicate key "$key")',
-        node);
-  }
-
-  @override
-  String failedAssertion(
-      List<TreeNode> context, TreeNode node, String message) {
-    return report(
-        context,
-        'The assertion condition evaluated to "false" with message "$message"',
-        node);
-  }
-
-  @override
-  String nonConstantVariableGet(
-      List<TreeNode> context, TreeNode node, String variableName) {
-    return report(
-        context,
-        'The variable "$variableName" cannot be used inside a constant '
-        'expression.',
-        node);
-  }
-
-  @override
-  String deferredLibrary(
-      List<TreeNode> context, TreeNode node, String importName) {
-    return report(
-        context,
-        'Deferred "$importName" cannot be used inside a constant '
-        'expression',
-        node);
-  }
-
-  @override
-  String circularity(List<TreeNode> context, TreeNode node) {
-    return report(context, 'Constant expression depends on itself.', node);
-  }
-}
-
-class IsInstantiatedVisitor extends DartTypeVisitor<bool> {
-  final _availableVariables = new Set<TypeParameter>();
-
-  bool isInstantiated(DartType type) {
-    return type.accept(this);
-  }
-
-  bool defaultDartType(DartType node) {
-    throw 'A visitor method seems to be unimplemented!';
-  }
-
-  bool visitInvalidType(InvalidType node) => true;
-  bool visitDynamicType(DynamicType node) => true;
-  bool visitVoidType(VoidType node) => true;
-  bool visitBottomType(BottomType node) => true;
-
-  bool visitTypeParameterType(TypeParameterType node) {
-    return _availableVariables.contains(node.parameter);
-  }
-
-  bool visitInterfaceType(InterfaceType node) {
-    return node.typeArguments
-        .every((DartType typeArgument) => typeArgument.accept(this));
-  }
-
-  bool visitFunctionType(FunctionType node) {
-    final parameters = node.typeParameters;
-    _availableVariables.addAll(parameters);
-    final bool result = node.returnType.accept(this) &&
-        node.positionalParameters.every((p) => p.accept(this)) &&
-        node.namedParameters.every((p) => p.type.accept(this));
-    _availableVariables.removeAll(parameters);
-    return result;
-  }
-
-  bool visitTypedefType(TypedefType node) {
-    return node.unalias.accept(this);
-  }
-}
-
-bool _isFormalParameter(VariableDeclaration variable) {
-  final parent = variable.parent;
-  if (parent is FunctionNode) {
-    return parent.positionalParameters.contains(variable) ||
-        parent.namedParameters.contains(variable);
-  }
-  return false;
-}
diff --git a/kernel/lib/transformations/continuation.dart b/kernel/lib/transformations/continuation.dart
index a78a3ab..b599cdf 100644
--- a/kernel/lib/transformations/continuation.dart
+++ b/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/kernel/lib/type_checker.dart b/kernel/lib/type_checker.dart
index 7f04bce..8faae52 100644
--- a/kernel/lib/type_checker.dart
+++ b/kernel/lib/type_checker.dart
@@ -713,6 +713,18 @@
   }
 
   @override
+  DartType visitInstanceCreation(InstanceCreation node) {
+    Substitution substitution = Substitution.fromPairs(
+        node.classNode.typeParameters, node.typeArguments);
+    node.fieldValues.forEach((Reference fieldRef, Expression value) {
+      DartType fieldType = substitution.substituteType(fieldRef.asField.type);
+      DartType valueType = visitExpression(value);
+      checkAssignable(node, fieldType, valueType);
+    });
+    return new InterfaceType(node.classNode, node.typeArguments);
+  }
+
+  @override
   DartType visitStringLiteral(StringLiteral node) {
     return environment.stringType;
   }
@@ -799,6 +811,11 @@
   }
 
   @override
+  visitConstantExpression(ConstantExpression node) {
+    return node.type;
+  }
+
+  @override
   visitAssertStatement(AssertStatement node) {
     visitExpression(node.condition);
     if (node.message != null) {
@@ -1022,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/kernel/lib/visitor.dart b/kernel/lib/visitor.dart
index 0cecee1..b1a9938 100644
--- a/kernel/lib/visitor.dart
+++ b/kernel/lib/visitor.dart
@@ -41,6 +41,7 @@
   R visitListConcatenation(ListConcatenation node) => defaultExpression(node);
   R visitSetConcatenation(SetConcatenation node) => defaultExpression(node);
   R visitMapConcatenation(MapConcatenation node) => defaultExpression(node);
+  R visitInstanceCreation(InstanceCreation node) => defaultExpression(node);
   R visitIsExpression(IsExpression node) => defaultExpression(node);
   R visitAsExpression(AsExpression node) => defaultExpression(node);
   R visitSymbolLiteral(SymbolLiteral node) => defaultExpression(node);
@@ -167,6 +168,7 @@
   R visitListConcatenation(ListConcatenation node) => defaultExpression(node);
   R visitSetConcatenation(SetConcatenation node) => defaultExpression(node);
   R visitMapConcatenation(MapConcatenation node) => defaultExpression(node);
+  R visitInstanceCreation(InstanceCreation node) => defaultExpression(node);
   R visitIsExpression(IsExpression node) => defaultExpression(node);
   R visitAsExpression(AsExpression node) => defaultExpression(node);
   R visitSymbolLiteral(SymbolLiteral node) => defaultExpression(node);
@@ -288,6 +290,8 @@
 }
 
 class ConstantVisitor<R> {
+  const ConstantVisitor();
+
   R defaultConstant(Constant node) => null;
 
   R visitNullConstant(NullConstant node) => defaultConstant(node);
@@ -508,6 +512,8 @@
       defaultExpression(node, arg);
   R visitMapConcatenation(MapConcatenation node, T arg) =>
       defaultExpression(node, arg);
+  R visitInstanceCreation(InstanceCreation node, T arg) =>
+      defaultExpression(node, arg);
   R visitIsExpression(IsExpression node, T arg) => defaultExpression(node, arg);
   R visitAsExpression(AsExpression node, T arg) => defaultExpression(node, arg);
   R visitSymbolLiteral(SymbolLiteral node, T arg) =>
diff --git a/kernel/lib/vm/constants_native_effects.dart b/kernel/lib/vm/constants_native_effects.dart
index 9a9c9c8..2dc607d 100644
--- a/kernel/lib/vm/constants_native_effects.dart
+++ b/kernel/lib/vm/constants_native_effects.dart
@@ -5,7 +5,7 @@
 library vm.constants_native_effects;
 
 import '../ast.dart';
-import '../transformations/constants.dart';
+import '../target/targets.dart';
 import '../core_types.dart';
 
 class VmConstantsBackend extends ConstantsBackend {
diff --git a/kernel/pubspec.yaml b/kernel/pubspec.yaml
index 6072c7e..eeb40cc 100644
--- a/kernel/pubspec.yaml
+++ b/kernel/pubspec.yaml
@@ -1,21 +1,16 @@
 name: kernel
 # Currently, kernel API is not stable and users should
 # not depend on semver semantics when depending on this package.
-version: 0.3.14
+version: 0.3.18
 author: Dart Team <misc@dartlang.org>
 description: Dart IR (Intermediate Representation)
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/kernel
 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/linter/.travis.yml b/linter/.travis.yml
index 9b86eca..e56babd 100644
--- a/linter/.travis.yml
+++ b/linter/.travis.yml
@@ -7,6 +7,7 @@
   - LINTER_BOT=main
   - LINTER_BOT=benchmark
   - LINTER_BOT=pana_baseline
+  - LINTER_BOT=release
 
 # Only building master means that we don't run two builds for each pull request.
 branches:
diff --git a/linter/BUILD.gn b/linter/BUILD.gn
index c920aee..81f84b6 100644
--- a/linter/BUILD.gn
+++ b/linter/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for linter-0.1.83
+# This file is generated by importer.py for linter-0.1.87
 
 import("//build/dart/dart_library.gni")
 
diff --git a/linter/CHANGELOG.md b/linter/CHANGELOG.md
index 8e6804d..94114c5 100644
--- a/linter/CHANGELOG.md
+++ b/linter/CHANGELOG.md
@@ -1,3 +1,30 @@
+# 0.1.87
+
+* change: `prefer_const_constructors_in_immutables` is currently overly permissive, pending analyzer changes (#1537)
+* fixed `unnecessary_await_in_return` false positive
+* fixed `unrelated_type_equality_checks` false negative with functions
+* fixed `prefer_spread_collections` to not lint in const contexts
+* fixed false positive in `prefer_iterable_whereType` for `is!`
+* fixed false positive in `prefer_collection_literals` for constructors with params
+
+# 0.1.86
+
+* updated `prefer_spread_collections` to ignore calls to `addAll` that could be inlined
+* new lint: `prefer_inlined_adds`
+
+# 0.1.85
+
+* (**BREAKING**) renamed `spread_collections` to `prefer_spread_collections`
+* new lint: `prefer_for_elements_to_map_fromIterable`
+* new lint: `prefer_if_elements_to_conditional_expressions`
+* new lint: `diagnostic_describe_all_properties`
+
+# 0.1.84
+
+* new lint: `spread_collections`
+* (internal) update to analyzer 0.36.0 APIs
+* new lint: `prefer_asserts_with_message`
+
 # 0.1.83
 
 * updated `file_names` to skip prefixed-extension Dart files (e.g., `.css.dart`, `.g.dart`)
diff --git a/linter/PULL_REQUEST_TEMPLATE.md b/linter/PULL_REQUEST_TEMPLATE.md
index 89b9187..7194f6a 100644
--- a/linter/PULL_REQUEST_TEMPLATE.md
+++ b/linter/PULL_REQUEST_TEMPLATE.md
@@ -5,6 +5,6 @@
 the name of the rule in the pull request.
 
 If this is a new lint or feature and there is not an existing tracking bug, please
-consider opening one to better facilate conversation.
+consider opening one to better facilitate conversation.
 
 Fixes # (issue)
diff --git a/linter/doc/WritingLints.MD b/linter/doc/WritingLints.MD
index 40f72fe..47786cd 100644
--- a/linter/doc/WritingLints.MD
+++ b/linter/doc/WritingLints.MD
@@ -64,7 +64,7 @@
 helper script and documentation gets generated with [doc.dart](https://github.com/dart-lang/linter/blob/master/tool/doc.dart). 
 Helper scripts can be invoked via `dart` or grinder (`pub run grinder docs --dir=doc_location` and `pub run grinder rule --name=my_new_rule` respectively).  Using grinder, for example
 
-    $ pub run grinder rule --name=my_new_test
+    $ pub run grinder rule --name=my_new_lint
     
 generates lint and test stubs in `lib/src/rules` and `test/rules`.
 
diff --git a/linter/example/all.yaml b/linter/example/all.yaml
index bbb6dc7..8abbe3d 100644
--- a/linter/example/all.yaml
+++ b/linter/example/all.yaml
@@ -48,6 +48,7 @@
     - constant_identifier_names
     - control_flow_in_finally
     - curly_braces_in_flow_control_structures
+    - diagnostic_describe_all_properties
     - directives_ordering
     - empty_catches
     - empty_constructor_bodies
@@ -78,6 +79,7 @@
     - parameter_assignments
     - prefer_adjacent_string_concatenation
     - prefer_asserts_in_initializer_lists
+    - prefer_asserts_with_message
     - prefer_collection_literals
     - prefer_conditional_assignment
     - prefer_const_constructors
@@ -91,10 +93,13 @@
     - prefer_final_fields
     - prefer_final_in_for_each
     - prefer_final_locals
+    - prefer_for_elements_to_map_fromIterable
     - prefer_foreach
     - prefer_function_declarations_over_variables
     - prefer_generic_function_type_aliases
+    - prefer_if_elements_to_conditional_expressions
     - prefer_initializing_formals
+    - prefer_inlined_adds
     - prefer_int_literals
     - prefer_interpolation_to_compose_strings
     - prefer_is_empty
@@ -103,6 +108,7 @@
     - prefer_mixin
     - prefer_null_aware_operators
     - prefer_single_quotes
+    - prefer_spread_collections
     - prefer_typing_uninitialized_variables
     - prefer_void_to_null
     - provide_deprecation_message
diff --git a/linter/lib/src/ast.dart b/linter/lib/src/ast.dart
index e41e007..e8643e7 100644
--- a/linter/lib/src/ast.dart
+++ b/linter/lib/src/ast.dart
@@ -337,7 +337,6 @@
     CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT,
     CompileTimeErrorCode.NON_CONSTANT_MAP_KEY,
     CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE,
-    CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER,
   ];
 
   bool hasConstError = false;
diff --git a/linter/lib/src/rules.dart b/linter/lib/src/rules.dart
index 407f9df..bbfadc6 100644
--- a/linter/lib/src/rules.dart
+++ b/linter/lib/src/rules.dart
@@ -49,6 +49,7 @@
 import 'package:linter/src/rules/constant_identifier_names.dart';
 import 'package:linter/src/rules/control_flow_in_finally.dart';
 import 'package:linter/src/rules/curly_braces_in_flow_control_structures.dart';
+import 'package:linter/src/rules/diagnostic_describe_all_properties.dart';
 import 'package:linter/src/rules/directives_ordering.dart';
 import 'package:linter/src/rules/empty_catches.dart';
 import 'package:linter/src/rules/empty_constructor_bodies.dart';
@@ -78,6 +79,7 @@
 import 'package:linter/src/rules/parameter_assignments.dart';
 import 'package:linter/src/rules/prefer_adjacent_string_concatenation.dart';
 import 'package:linter/src/rules/prefer_asserts_in_initializer_lists.dart';
+import 'package:linter/src/rules/prefer_asserts_with_message.dart';
 import 'package:linter/src/rules/prefer_bool_in_asserts.dart';
 import 'package:linter/src/rules/prefer_collection_literals.dart';
 import 'package:linter/src/rules/prefer_conditional_assignment.dart';
@@ -92,10 +94,13 @@
 import 'package:linter/src/rules/prefer_final_fields.dart';
 import 'package:linter/src/rules/prefer_final_in_for_each.dart';
 import 'package:linter/src/rules/prefer_final_locals.dart';
+import 'package:linter/src/rules/prefer_for_elements_to_map_fromIterable.dart';
 import 'package:linter/src/rules/prefer_foreach.dart';
 import 'package:linter/src/rules/prefer_function_declarations_over_variables.dart';
 import 'package:linter/src/rules/prefer_generic_function_type_aliases.dart';
+import 'package:linter/src/rules/prefer_if_elements_to_conditional_expressions.dart';
 import 'package:linter/src/rules/prefer_initializing_formals.dart';
+import 'package:linter/src/rules/prefer_inlined_adds.dart';
 import 'package:linter/src/rules/prefer_int_literals.dart';
 import 'package:linter/src/rules/prefer_interpolation_to_compose_strings.dart';
 import 'package:linter/src/rules/prefer_is_empty.dart';
@@ -104,6 +109,7 @@
 import 'package:linter/src/rules/prefer_mixin.dart';
 import 'package:linter/src/rules/prefer_null_aware_operators.dart';
 import 'package:linter/src/rules/prefer_single_quotes.dart';
+import 'package:linter/src/rules/prefer_spread_collections.dart';
 import 'package:linter/src/rules/prefer_typing_uninitialized_variables.dart';
 import 'package:linter/src/rules/prefer_void_to_null.dart';
 import 'package:linter/src/rules/provide_deprecation_message.dart';
@@ -191,6 +197,7 @@
     ..register(new ControlFlowInFinally())
     ..register(new ConstantIdentifierNames())
     ..register(new CurlyBracesInFlowControlStructures())
+    ..register(new DiagnosticsDescribeAllProperties())
     ..register(new DirectivesOrdering())
     ..register(new EmptyCatches())
     ..register(new EmptyConstructorBodies())
@@ -219,6 +226,7 @@
     ..register(new PackagePrefixedLibraryNames())
     ..register(new ParameterAssignments())
     ..register(new PreferAdjacentStringConcatenation())
+    ..register(new PreferAssertsWithMessage())
     ..register(new PreferBoolInAsserts())
     ..register(new PreferCollectionLiterals())
     ..register(new PreferConditionalAssignment())
@@ -235,9 +243,12 @@
     ..register(new PreferFinalInForEach())
     ..register(new PreferFinalLocals())
     ..register(new PreferForeach())
+    ..register(new PreferForElementsToMapFromIterable())
     ..register(new PreferFunctionDeclarationsOverVariables())
     ..register(new PreferGenericFunctionTypeAliases())
+    ..register(new PreferIfElementsToConditionalExpressions())
     ..register(new PreferInitializingFormals())
+    ..register(new PreferInlinedAdds())
     ..register(new PreferIntLiterals())
     ..register(new PreferInterpolationToComposeStrings())
     ..register(new PreferIterableWhereType())
@@ -246,6 +257,7 @@
     ..register(new PreferMixin())
     ..register(new PreferNullAwareOperators())
     ..register(new PreferSingleQuotes())
+    ..register(new PreferSpreadCollections())
     ..register(new PreferTypingUninitializedVariables())
     ..register(new PreferVoidToNull())
     ..register(new ProvideDeprecationMessage())
diff --git a/linter/lib/src/rules/always_put_control_body_on_new_line.dart b/linter/lib/src/rules/always_put_control_body_on_new_line.dart
index ab7c6df..ffd0516 100644
--- a/linter/lib/src/rules/always_put_control_body_on_new_line.dart
+++ b/linter/lib/src/rules/always_put_control_body_on_new_line.dart
@@ -58,7 +58,7 @@
       [LinterContext context]) {
     final visitor = new _Visitor(this);
     registry.addDoStatement(this, visitor);
-    registry.addForStatement2(this, visitor);
+    registry.addForStatement(this, visitor);
     registry.addIfStatement(this, visitor);
     registry.addWhileStatement(this, visitor);
   }
@@ -75,7 +75,7 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement(ForStatement node) {
     _checkNodeOnNextLine(node.body, node.rightParenthesis.end);
   }
 
diff --git a/linter/lib/src/rules/curly_braces_in_flow_control_structures.dart b/linter/lib/src/rules/curly_braces_in_flow_control_structures.dart
index 949fa5e..2f262d7 100644
--- a/linter/lib/src/rules/curly_braces_in_flow_control_structures.dart
+++ b/linter/lib/src/rules/curly_braces_in_flow_control_structures.dart
@@ -63,7 +63,7 @@
       [LinterContext context]) {
     final visitor = new _Visitor(this);
     registry.addDoStatement(this, visitor);
-    registry.addForStatement2(this, visitor);
+    registry.addForStatement(this, visitor);
     registry.addIfStatement(this, visitor);
     registry.addWhileStatement(this, visitor);
   }
@@ -80,7 +80,7 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement2(ForStatement node) {
     _check(node.body);
   }
 
diff --git a/linter/lib/src/rules/diagnostic_describe_all_properties.dart b/linter/lib/src/rules/diagnostic_describe_all_properties.dart
new file mode 100644
index 0000000..7fe989d
--- /dev/null
+++ b/linter/lib/src/rules/diagnostic_describe_all_properties.dart
@@ -0,0 +1,244 @@
+// 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/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:linter/src/analyzer.dart';
+import 'package:linter/src/ast.dart';
+import 'package:linter/src/util/dart_type_utilities.dart';
+
+const _desc = r'DO reference all public properties in debug methods.';
+
+const _details = r'''
+**DO** reference all public properties in `debug` method implementations.
+
+Implementers of `Diagnosticable` should reference all public properties in
+a `debugFillProperties(...)` or `debugDescribeChildren(...)` method
+implementation to improve debuggability at runtime.
+
+Public properties are defined as fields and getters that are
+
+* not package-private (e.g., prefixed with `_`)
+* not `static` or overriding
+* not themselves `Widget`s or collections of `Widget`s
+
+In addition, the "debug" prefix is treated specially for properties in Flutter.
+For the purposes of diagnostics, a property `foo` and a prefixed property
+`debugFoo` are treated as effectively describing the same property and it is
+sufficient to refer to one or the other.
+
+**BAD:**
+```
+class Absorber extends Widget {
+  bool get absorbing => _absorbing;
+  bool _absorbing;
+  bool get ignoringSemantics => _ignoringSemantics;
+  bool _ignoringSemantics;
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+    super.debugFillProperties(properties);
+    properties.add(DiagnosticsProperty<bool>('absorbing', absorbing));
+    // Missing reference to ignoringSemantics
+  }
+}  
+```
+
+**GOOD:**
+```
+class Absorber extends Widget {
+  bool get absorbing => _absorbing;
+  bool _absorbing;
+  bool get ignoringSemantics => _ignoringSemantics;
+  bool _ignoringSemantics;
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+    super.debugFillProperties(properties);
+    properties.add(DiagnosticsProperty<bool>('absorbing', absorbing));
+    properties.add(DiagnosticsProperty<bool>('ignoringSemantics', ignoringSemantics));
+  }
+}  
+```
+''';
+
+class DiagnosticsDescribeAllProperties extends LintRule
+    implements NodeLintRule {
+  DiagnosticsDescribeAllProperties()
+      : super(
+          name: 'diagnostic_describe_all_properties',
+          description: _desc,
+          details: _details,
+          maturity: Maturity.experimental,
+          group: Group.errors,
+        );
+
+  @override
+  void registerNodeProcessors(NodeLintRegistry registry,
+      [LinterContext context]) {
+    final visitor = new _Visitor(this, context);
+    registry.addCompilationUnit(this, visitor);
+    registry.addClassDeclaration(this, visitor);
+  }
+}
+
+// for experiments and book-keeping
+//int fileCount = 0;
+//int debugPropertyCount = 0;
+//int classesWithPropertiesButNoDebugFill = 0;
+
+class _Visitor extends SimpleAstVisitor {
+  final LintRule rule;
+  final InheritanceManager2 inheritanceManager;
+
+  _Visitor(this.rule, LinterContext context)
+      : inheritanceManager = new InheritanceManager2(context.typeSystem);
+
+  // todo (pq): for experiments and book-keeping; remove before landing
+  LineInfo lineInfo;
+
+  @override
+  visitCompilationUnit(CompilationUnit node) {
+    lineInfo = node.lineInfo;
+  }
+
+//  static int noMethods = 0;
+//  static int totalClasses = 0;
+
+  bool _isOverridingMember(Element member) {
+    if (member == null) {
+      return false;
+    }
+
+    ClassElement classElement =
+        member.getAncestor((element) => element is ClassElement);
+    if (classElement == null) {
+      return false;
+    }
+    Uri libraryUri = classElement.library.source.uri;
+    return inheritanceManager.getInherited(
+            classElement.type, new Name(libraryUri, member.name)) !=
+        null;
+  }
+
+  @override
+  visitClassDeclaration(ClassDeclaration node) {
+//    ++totalClasses;
+
+    // We only care about Diagnosticables.
+    var type = node.declaredElement.type;
+    if (!DartTypeUtilities.implementsInterface(type, 'Diagnosticable', '')) {
+      return;
+    }
+
+    var properties = <SimpleIdentifier>[];
+    for (var member in node.members) {
+      if (member is MethodDeclaration && member.isGetter) {
+        if (!member.isStatic &&
+            !skipForDiagnostic(
+              element: member.declaredElement,
+              name: member.name,
+              type: member.returnType?.type,
+            )) {
+          properties.add(member.name);
+        }
+      } else if (member is FieldDeclaration) {
+        for (var v in member.fields.variables) {
+          if (!v.declaredElement.isStatic &&
+              !skipForDiagnostic(
+                element: v.declaredElement,
+                name: v.name,
+                type: v.declaredElement.type,
+              )) {
+            properties.add(v.name);
+          }
+        }
+      }
+    }
+
+    if (properties.isEmpty) {
+      return;
+    }
+
+    // todo (pq): move up to top when we're not counting anymore.
+    var debugFillProperties = node.getMethod('debugFillProperties');
+//    if (debugFillProperties == null) {
+//      ++classesWithPropertiesButNoDebugFill;
+//    }
+
+    var debugDescribeChildren = node.getMethod('debugDescribeChildren');
+    if (debugFillProperties == null && debugDescribeChildren == null) {
+      return;
+    }
+
+    // Remove any defined in debugFillProperties.
+    removeReferences(debugFillProperties, properties);
+
+    // Remove any defined in debugDescribeChildren.
+    removeReferences(debugDescribeChildren, properties);
+
+    // Flag the rest.
+    properties.forEach(rule.reportLint);
+
+// uncomment for data gathering
+//    for (var prop in properties) {
+//      var line = lineInfo.getLocation(prop.offset).lineNumber;
+//      var prefix =
+//          'https://github.com/flutter/flutter/blob/master/packages/flutter/';
+//      var path = node.element.source.fullName.split('packages/flutter/')[1];
+//      print('| [$path:$line]($prefix$path#L$line) | ${node.name}.$prop |');
+//      ++debugPropertyCount;
+//    }
+  }
+
+  void removeReferences(
+      MethodDeclaration method, List<SimpleIdentifier> properties) {
+    if (method == null) {
+      return;
+    }
+    DartTypeUtilities.traverseNodesInDFS(method.body)
+        .whereType<SimpleIdentifier>()
+        .forEach((p) {
+      var debugName;
+      var name;
+      const debugPrefix = 'debug';
+      if (p.name.startsWith(debugPrefix) &&
+          p.name.length > debugPrefix.length) {
+        debugName = p.name;
+        name =
+            '${p.name[debugPrefix.length].toLowerCase()}${p.name.substring(debugPrefix.length + 1)}';
+      } else {
+        name = p.name;
+        debugName =
+            '$debugPrefix${p.name[0].toUpperCase()}${p.name.substring(1)}';
+      }
+      properties.removeWhere(
+          (property) => property.name == debugName || property.name == name);
+    });
+  }
+
+  var collectionInterfaces = <InterfaceTypeDefinition>[
+    new InterfaceTypeDefinition('List', 'dart.core'),
+    new InterfaceTypeDefinition('Map', 'dart.core'),
+    new InterfaceTypeDefinition('LinkedHashMap', 'dart.collection'),
+    new InterfaceTypeDefinition('Set', 'dart.core'),
+    new InterfaceTypeDefinition('LinkedHashSet', 'dart.collection'),
+  ];
+
+  bool isWidgetProperty(DartType type) {
+    if (DartTypeUtilities.implementsInterface(type, 'Widget', '')) {
+      return true;
+    }
+    if (type is ParameterizedType &&
+        DartTypeUtilities.implementsAnyInterface(type, collectionInterfaces)) {
+      return type.typeParameters.length == 1 &&
+          isWidgetProperty(type.typeArguments.first);
+    }
+    return false;
+  }
+
+  bool skipForDiagnostic(
+          {Element element, DartType type, SimpleIdentifier name}) =>
+      isPrivate(name) || _isOverridingMember(element) || isWidgetProperty(type);
+}
diff --git a/linter/lib/src/rules/literal_only_boolean_expressions.dart b/linter/lib/src/rules/literal_only_boolean_expressions.dart
index b4ccaf1..6a7e3d9 100644
--- a/linter/lib/src/rules/literal_only_boolean_expressions.dart
+++ b/linter/lib/src/rules/literal_only_boolean_expressions.dart
@@ -111,7 +111,7 @@
       [LinterContext context]) {
     final visitor = new _Visitor(this);
     registry.addDoStatement(this, visitor);
-    registry.addForStatement2(this, visitor);
+    registry.addForStatement(this, visitor);
     registry.addIfStatement(this, visitor);
     registry.addWhileStatement(this, visitor);
   }
@@ -130,7 +130,7 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement2(ForStatement node) {
     final loopParts = node.forLoopParts;
     if (loopParts is ForParts) {
       if (_onlyLiterals(loopParts.condition)) {
diff --git a/linter/lib/src/rules/no_adjacent_strings_in_list.dart b/linter/lib/src/rules/no_adjacent_strings_in_list.dart
index 4bf30f5..7be89c9 100644
--- a/linter/lib/src/rules/no_adjacent_strings_in_list.dart
+++ b/linter/lib/src/rules/no_adjacent_strings_in_list.dart
@@ -57,7 +57,7 @@
 
   @override
   void visitListLiteral(ListLiteral node) {
-    node.elements2.forEach((CollectionElement e) {
+    node.elements.forEach((CollectionElement e) {
       if (e is AdjacentStrings) {
         rule.reportLint(e);
       }
diff --git a/linter/lib/src/rules/omit_local_variable_types.dart b/linter/lib/src/rules/omit_local_variable_types.dart
index 5ffcc0e..b9c8a73 100644
--- a/linter/lib/src/rules/omit_local_variable_types.dart
+++ b/linter/lib/src/rules/omit_local_variable_types.dart
@@ -55,7 +55,7 @@
   void registerNodeProcessors(NodeLintRegistry registry,
       [LinterContext context]) {
     final visitor = new _Visitor(this);
-    registry.addForStatement2(this, visitor);
+    registry.addForStatement(this, visitor);
     registry.addVariableDeclarationStatement(this, visitor);
   }
 }
@@ -66,7 +66,7 @@
   _Visitor(this.rule);
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement2(ForStatement node) {
     final loopParts = node.forLoopParts;
     if (loopParts is ForPartsWithDeclarations) {
       _visitVariableDeclarationList(loopParts.variables);
diff --git a/linter/lib/src/rules/prefer_asserts_with_message.dart b/linter/lib/src/rules/prefer_asserts_with_message.dart
new file mode 100644
index 0000000..91c638a
--- /dev/null
+++ b/linter/lib/src/rules/prefer_asserts_with_message.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.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:linter/src/analyzer.dart';
+
+const _desc = r'Prefer asserts with message.';
+
+const _details = r'''
+
+When assertions fail it's not always simple to understand why. Adding a message
+to the `assert` helps the developer to understand why the AssertionError occurs.
+
+**BAD:**
+```
+f(a) {
+  assert(a != null);
+}
+
+class A {
+  A(a) : assert(a != null);
+}
+```
+
+**GOOD:**
+```
+f(a) {
+  assert(a != null, 'a must not be null');
+}
+
+class A {
+  A(a) : assert(a != null, 'a must not be null');
+}
+```
+
+''';
+
+class PreferAssertsWithMessage extends LintRule implements NodeLintRule {
+  PreferAssertsWithMessage()
+      : super(
+            name: 'prefer_asserts_with_message',
+            description: _desc,
+            details: _details,
+            group: Group.style);
+
+  @override
+  void registerNodeProcessors(NodeLintRegistry registry,
+      [LinterContext context]) {
+    final visitor = new _Visitor(this);
+    registry.addAssertInitializer(this, visitor);
+    registry.addAssertStatement(this, visitor);
+  }
+}
+
+class _Visitor extends SimpleAstVisitor<void> {
+  final LintRule rule;
+
+  _Visitor(this.rule);
+
+  @override
+  void visitAssertInitializer(AssertInitializer node) {
+    if (node.message == null) {
+      rule.reportLint(node);
+    }
+  }
+
+  @override
+  void visitAssertStatement(AssertStatement node) {
+    if (node.message == null) {
+      rule.reportLint(node);
+    }
+  }
+}
diff --git a/linter/lib/src/rules/prefer_collection_literals.dart b/linter/lib/src/rules/prefer_collection_literals.dart
index 4c7d50d..101737f 100644
--- a/linter/lib/src/rules/prefer_collection_literals.dart
+++ b/linter/lib/src/rules/prefer_collection_literals.dart
@@ -96,10 +96,13 @@
         }
       }
 
+      var args = node.argumentList.arguments;
       if (constructorName == null) {
-        rule.reportLint(node);
+        // Skip: LinkedHashSet(equals: (a, b) => false, hashCode: (o) => 13)
+        if (args.isEmpty) {
+          rule.reportLint(node);
+        }
       } else if (constructorName == 'from' || constructorName == 'of') {
-        var args = node.argumentList.arguments;
         if (args.length != 1) {
           return;
         }
diff --git a/linter/lib/src/rules/prefer_final_in_for_each.dart b/linter/lib/src/rules/prefer_final_in_for_each.dart
index 700e190..3c6f5bc 100644
--- a/linter/lib/src/rules/prefer_final_in_for_each.dart
+++ b/linter/lib/src/rules/prefer_final_in_for_each.dart
@@ -54,7 +54,7 @@
   void registerNodeProcessors(NodeLintRegistry registry,
       [LinterContext context]) {
     final visitor = new _Visitor(this);
-    registry.addForStatement2(this, visitor);
+    registry.addForStatement(this, visitor);
   }
 }
 
@@ -64,7 +64,7 @@
   _Visitor(this.rule);
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement2(ForStatement node) {
     var forLoopParts = node.forLoopParts;
     // If the following `if` test fails, then either the statement is not a
     // for-each loop, or it is something like `for(a in b) { ... }`.  In the
diff --git a/linter/lib/src/rules/prefer_for_elements_to_map_fromIterable.dart b/linter/lib/src/rules/prefer_for_elements_to_map_fromIterable.dart
new file mode 100644
index 0000000..5403c48
--- /dev/null
+++ b/linter/lib/src/rules/prefer_for_elements_to_map_fromIterable.dart
@@ -0,0 +1,118 @@
+// 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/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:linter/src/analyzer.dart';
+
+const _desc = r'Prefer for elements when building maps from iterables.';
+
+const _details = r'''
+When building maps from iterables, it is preferable to use for elements.
+
+**BAD:**
+```
+Map<String, WidgetBuilder>.fromIterable(
+  kAllGalleryDemos,
+  key: (demo) => '${demo.routeName}',
+  value: (demo) => demo.buildRoute,
+);
+
+```
+
+**GOOD:**
+```
+return {
+  for (var demo in kAllGalleryDemos)
+    '${demo.routeName}': demo.buildRoute,
+};
+```
+''';
+
+class PreferForElementsToMapFromIterable extends LintRule
+    implements NodeLintRule {
+  PreferForElementsToMapFromIterable()
+      : super(
+            name: 'prefer_for_elements_to_map_fromIterable',
+            description: _desc,
+            details: _details,
+            group: Group.style);
+
+  @override
+  void registerNodeProcessors(NodeLintRegistry registry,
+      [LinterContext context]) {
+    final visitor = new _Visitor(this, context);
+    registry.addInstanceCreationExpression(this, visitor);
+  }
+}
+
+class _Visitor extends SimpleAstVisitor<void> {
+  final LintRule rule;
+  final LinterContext context;
+
+  _Visitor(this.rule, this.context);
+
+  @override
+  void visitInstanceCreationExpression(InstanceCreationExpression creation) {
+    ConstructorElement element = creation.staticElement;
+    if (element?.name != 'fromIterable' ||
+        element.enclosingElement != context.typeProvider.mapType.element) {
+      return;
+    }
+
+    //
+    // Ensure that the arguments have the right form.
+    //
+    NodeList<Expression> arguments = creation.argumentList.arguments;
+    if (arguments.length != 3) {
+      return;
+    }
+
+    Expression secondArg = arguments[1];
+    Expression thirdArg = arguments[2];
+
+    Expression extractBody(FunctionExpression expression) {
+      FunctionBody body = expression.body;
+      if (body is ExpressionFunctionBody) {
+        return body.expression;
+      } else if (body is BlockFunctionBody) {
+        NodeList<Statement> statements = body.block.statements;
+        if (statements.length == 1) {
+          Statement statement = statements[0];
+          if (statement is ReturnStatement) {
+            return statement.expression;
+          }
+        }
+      }
+      return null;
+    }
+
+    FunctionExpression extractClosure(String name, Expression argument) {
+      if (argument is NamedExpression && argument.name.label.name == name) {
+        Expression expression = argument.expression.unParenthesized;
+        if (expression is FunctionExpression) {
+          NodeList<FormalParameter> parameters =
+              expression.parameters.parameters;
+          if (parameters.length == 1 && parameters[0].isRequired) {
+            if (extractBody(expression) != null) {
+              return expression;
+            }
+          }
+        }
+      }
+      return null;
+    }
+
+    FunctionExpression keyClosure =
+        extractClosure('key', secondArg) ?? extractClosure('key', thirdArg);
+    FunctionExpression valueClosure =
+        extractClosure('value', thirdArg) ?? extractClosure('value', secondArg);
+    if (keyClosure == null || valueClosure == null) {
+      return;
+    }
+
+    rule.reportLint(creation);
+  }
+}
diff --git a/linter/lib/src/rules/prefer_foreach.dart b/linter/lib/src/rules/prefer_foreach.dart
index 5feb3ad..b14a015 100644
--- a/linter/lib/src/rules/prefer_foreach.dart
+++ b/linter/lib/src/rules/prefer_foreach.dart
@@ -55,14 +55,14 @@
   void registerNodeProcessors(NodeLintRegistry registry,
       [LinterContext context]) {
     final visitor = new _Visitor(this);
-    registry.addForStatement2(this, visitor);
+    registry.addForStatement(this, visitor);
   }
 }
 
 class _PreferForEachVisitor extends SimpleAstVisitor {
   final LintRule rule;
   LocalVariableElement element;
-  ForStatement2 forEachStatement;
+  ForStatement forEachStatement;
 
   _PreferForEachVisitor(this.rule);
 
@@ -79,7 +79,7 @@
   }
 
   @override
-  visitForStatement2(ForStatement2 node) {
+  visitForStatement2(ForStatement node) {
     final loopParts = node.forLoopParts;
     if (loopParts is ForEachPartsWithDeclaration) {
       final element = loopParts.loopVariable?.declaredElement;
@@ -128,7 +128,7 @@
   _Visitor(this.rule);
 
   @override
-  visitForStatement2(ForStatement2 node) {
+  visitForStatement2(ForStatement node) {
     final loopParts = node.forLoopParts;
     if (loopParts is ForEachParts) {
       final visitor = new _PreferForEachVisitor(rule);
diff --git a/linter/lib/src/rules/prefer_if_elements_to_conditional_expressions.dart b/linter/lib/src/rules/prefer_if_elements_to_conditional_expressions.dart
new file mode 100644
index 0000000..b7ac8ab
--- /dev/null
+++ b/linter/lib/src/rules/prefer_if_elements_to_conditional_expressions.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.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:linter/src/analyzer.dart';
+
+const _desc = r'Prefer if elements to conditional expressions where possible.';
+
+const _details = r'''
+When building collections, it is preferable to use `if` elements rather than
+conditionals.
+
+**BAD:**
+```
+Widget build(BuildContext context) {
+  return Row(
+    children: [
+      IconButton(icon: Icon(Icons.menu)),
+      Expanded(child: title),
+      isAndroid ? IconButton(icon: Icon(Icons.search)) : null,
+    ].where((child) => child != null).toList(),
+  );
+}
+```
+
+**GOOD:**
+```
+Widget build(BuildContext context) {
+  return Row(
+    children: [
+      IconButton(icon: Icon(Icons.menu)),
+      Expanded(child: title),
+      if (isAndroid) IconButton(icon: Icon(Icons.search)),
+    ]
+  );
+}
+''';
+
+class PreferIfElementsToConditionalExpressions extends LintRule
+    implements NodeLintRule {
+  PreferIfElementsToConditionalExpressions()
+      : super(
+            name: 'prefer_if_elements_to_conditional_expressions',
+            description: _desc,
+            details: _details,
+            group: Group.style);
+
+  @override
+  void registerNodeProcessors(NodeLintRegistry registry,
+      [LinterContext context]) {
+    final visitor = new _Visitor(this);
+    registry.addConditionalExpression(this, visitor);
+  }
+}
+
+class _Visitor extends SimpleAstVisitor<void> {
+  final LintRule rule;
+
+  _Visitor(this.rule);
+
+  @override
+  void visitConditionalExpression(ConditionalExpression node) {
+    AstNode nodeToReplace = node;
+    AstNode parent = node.parent;
+    while (parent is ParenthesizedExpression) {
+      nodeToReplace = parent;
+      parent = parent.parent;
+    }
+    if (parent is ListLiteral || (parent is SetOrMapLiteral && parent.isSet)) {
+      rule.reportLint(nodeToReplace);
+    }
+  }
+}
diff --git a/linter/lib/src/rules/prefer_inlined_adds.dart b/linter/lib/src/rules/prefer_inlined_adds.dart
new file mode 100644
index 0000000..8ee6d82
--- /dev/null
+++ b/linter/lib/src/rules/prefer_inlined_adds.dart
@@ -0,0 +1,74 @@
+// 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/dart/ast/visitor.dart';
+import 'package:linter/src/analyzer.dart';
+
+const _desc = r'Inline list item declarations where possible.';
+
+const _details = r'''
+Declare elements in list literals inline, rather than using `add` and 
+`addAll` methods where possible.
+
+
+**BAD:**
+```
+var l = ['a']..add('b')..add('c');
+var l2 = ['a']..addAll(['b', 'c'])
+```
+
+**GOOD:**
+```
+var l = ['a', 'b', 'c'];
+var 2 = ['a', 'b', 'c'];
+```
+''';
+
+class PreferInlinedAdds extends LintRule implements NodeLintRule {
+  PreferInlinedAdds()
+      : super(
+            name: 'prefer_inlined_adds',
+            description: _desc,
+            details: _details,
+            group: Group.style);
+
+  @override
+  void registerNodeProcessors(NodeLintRegistry registry,
+      [LinterContext context]) {
+    final visitor = new _Visitor(this);
+    registry.addMethodInvocation(this, visitor);
+  }
+}
+
+class _Visitor extends SimpleAstVisitor {
+  final LintRule rule;
+
+  _Visitor(this.rule);
+
+  @override
+  void visitMethodInvocation(MethodInvocation invocation) {
+    bool addAll = invocation.methodName.name == 'addAll';
+    if ((invocation.methodName.name != 'add' && !addAll) ||
+        !invocation.isCascaded ||
+        invocation.argumentList.arguments.length != 1) {
+      return;
+    }
+
+    CascadeExpression cascade = invocation.thisOrAncestorOfType();
+    NodeList<Expression> sections = cascade.cascadeSections;
+    Expression target = cascade.target;
+    if (target is! ListLiteral || sections[0] != invocation) {
+      // todo (pq): consider extending to handle set literals.
+      return;
+    }
+
+    if (addAll && invocation.argumentList.arguments[0] is! ListLiteral) {
+      // Handled by: prefer_spread_collections
+      return;
+    }
+
+    rule.reportLint(invocation.methodName);
+  }
+}
diff --git a/linter/lib/src/rules/prefer_iterable_whereType.dart b/linter/lib/src/rules/prefer_iterable_whereType.dart
index 2206963..2ebc879 100644
--- a/linter/lib/src/rules/prefer_iterable_whereType.dart
+++ b/linter/lib/src/rules/prefer_iterable_whereType.dart
@@ -76,7 +76,7 @@
         expression = body.expression;
       }
       expression = expression?.unParenthesized;
-      if (expression is IsExpression) {
+      if (expression is IsExpression && expression.notOperator == null) {
         final target = expression.expression;
         if (target is SimpleIdentifier &&
             target.name == arg.parameters.parameters.first.identifier.name) {
diff --git a/linter/lib/src/rules/prefer_spread_collections.dart b/linter/lib/src/rules/prefer_spread_collections.dart
new file mode 100644
index 0000000..e3d45ff
--- /dev/null
+++ b/linter/lib/src/rules/prefer_spread_collections.dart
@@ -0,0 +1,118 @@
+// 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/dart/ast/visitor.dart';
+import 'package:analyzer/src/dart/ast/ast.dart'; // ignore: implementation_imports
+import 'package:linter/src/analyzer.dart';
+
+const _desc = r'Use spread collections when possible.';
+
+const _details = r'''
+
+Use spread collections when possible.
+
+Collection literals are excellent when you want to create a new collection out 
+of individual items. But, when existing items are already stored in another 
+collection, spread collection syntax leads to simpler code.
+
+**BAD:**
+
+```
+Widget build(BuildContext context) {
+  return CupertinoPageScaffold(
+    child: ListView(
+      children: [
+        Tab2Header(),
+      ]..addAll(buildTab2Conversation()),
+    ),
+  );
+}
+```
+
+```
+var ints = [1, 2, 3];
+print(['a']..addAll(ints.map((i) => i.toString()))..addAll(['c']));
+```
+
+```
+var things;
+var l = ['a']..addAll(things ?? const []);
+```
+
+
+**GOOD:**
+
+```
+Widget build(BuildContext context) {
+  return CupertinoPageScaffold(
+    child: ListView(
+      children: [
+        Tab2Header(),
+        ...buildTab2Conversation(),
+      ],
+    ),
+  );
+}
+```
+
+```
+var ints = [1, 2, 3];
+print(['a', ...ints.map((i) => i.toString()), 'c');
+```
+
+```
+var things;
+var l = ['a', ...?things];
+```
+''';
+
+class PreferSpreadCollections extends LintRule implements NodeLintRule {
+  PreferSpreadCollections()
+      : super(
+            name: 'prefer_spread_collections',
+            description: _desc,
+            details: _details,
+            group: Group.style);
+
+  @override
+  void registerNodeProcessors(NodeLintRegistry registry,
+      [LinterContext context]) {
+    final visitor = new _Visitor(this);
+    registry.addMethodInvocation(this, visitor);
+  }
+}
+
+class _Visitor extends SimpleAstVisitor<void> {
+  final LintRule rule;
+
+  _Visitor(this.rule);
+
+  @override
+  void visitMethodInvocation(MethodInvocation invocation) {
+    if (invocation.methodName.name != 'addAll' ||
+        !invocation.isCascaded ||
+        invocation.argumentList.arguments.length != 1) {
+      return;
+    }
+
+    CascadeExpression cascade = invocation.thisOrAncestorOfType();
+    NodeList<Expression> sections = cascade.cascadeSections;
+    Expression target = cascade.target;
+    // todo (pq): add support for Set literals.
+    if (target is! ListLiteral ||
+        (target is ListLiteralImpl && target.inConstantContext) ||
+        sections[0] != invocation) {
+      return;
+    }
+
+    Expression argument = invocation.argumentList.arguments[0];
+    if (argument is ListLiteral) {
+      // Handled by: prefer_inlined_adds
+      return;
+    }
+
+    rule.reportLint(invocation.methodName);
+  }
+}
diff --git a/linter/lib/src/rules/prefer_void_to_null.dart b/linter/lib/src/rules/prefer_void_to_null.dart
index a409c59..767a684 100644
--- a/linter/lib/src/rules/prefer_void_to_null.dart
+++ b/linter/lib/src/rules/prefer_void_to_null.dart
@@ -90,9 +90,9 @@
       // <Null>[] or <Null, Null>{}
       if (parent is TypeArgumentList) {
         final literal = parent.parent;
-        if (literal is ListLiteral && literal.elements2.isEmpty) {
+        if (literal is ListLiteral && literal.elements.isEmpty) {
           return;
-        } else if (literal is SetOrMapLiteral && literal.elements2.isEmpty) {
+        } else if (literal is SetOrMapLiteral && literal.elements.isEmpty) {
           return;
         }
       }
diff --git a/linter/lib/src/rules/unnecessary_await_in_return.dart b/linter/lib/src/rules/unnecessary_await_in_return.dart
index d411989..9d926f5 100644
--- a/linter/lib/src/rules/unnecessary_await_in_return.dart
+++ b/linter/lib/src/rules/unnecessary_await_in_return.dart
@@ -96,7 +96,7 @@
     }
     if (returnType != null &&
         returnType.isDartAsyncFuture &&
-        type.isAssignableTo(returnType)) {
+        type.isSubtypeOf(returnType)) {
       rule.reportLintForToken((expression as AwaitExpression).awaitKeyword);
     }
   }
diff --git a/linter/lib/src/rules/unnecessary_parenthesis.dart b/linter/lib/src/rules/unnecessary_parenthesis.dart
index 44746e8..1dd2f35 100644
--- a/linter/lib/src/rules/unnecessary_parenthesis.dart
+++ b/linter/lib/src/rules/unnecessary_parenthesis.dart
@@ -97,7 +97,7 @@
             _expressionStartsWithWhitespace(node.expression)) return;
       }
 
-      if (parent.precedence2 < node.expression.precedence2) {
+      if (parent.precedence < node.expression.precedence) {
         rule.reportLint(node);
         return;
       }
diff --git a/linter/lib/src/rules/unnecessary_statements.dart b/linter/lib/src/rules/unnecessary_statements.dart
index d65720d..649f8c0 100644
--- a/linter/lib/src/rules/unnecessary_statements.dart
+++ b/linter/lib/src/rules/unnecessary_statements.dart
@@ -58,7 +58,7 @@
       [LinterContext context]) {
     final visitor = new _Visitor(new _ReportNoClearEffectVisitor(this));
     registry.addExpressionStatement(this, visitor);
-    registry.addForStatement2(this, visitor);
+    registry.addForStatement(this, visitor);
     registry.addCascadeExpression(this, visitor);
   }
 }
@@ -213,7 +213,7 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement2(ForStatement node) {
     final loopParts = node.forLoopParts;
     if (loopParts is ForPartsWithExpression) {
       loopParts.initialization?.accept(reportNoClearEffect);
diff --git a/linter/lib/src/rules/use_string_buffers.dart b/linter/lib/src/rules/use_string_buffers.dart
index aeab7fb..2e032d8 100644
--- a/linter/lib/src/rules/use_string_buffers.dart
+++ b/linter/lib/src/rules/use_string_buffers.dart
@@ -69,7 +69,7 @@
       [LinterContext context]) {
     final visitor = new _Visitor(this);
     registry.addDoStatement(this, visitor);
-    registry.addForStatement2(this, visitor);
+    registry.addForStatement(this, visitor);
     registry.addWhileStatement(this, visitor);
   }
 }
@@ -175,7 +175,7 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement2(ForStatement node) {
     final visitor = new _UseStringBufferVisitor(rule);
     node.body.accept(visitor);
   }
diff --git a/linter/lib/src/util/condition_scope_visitor.dart b/linter/lib/src/util/condition_scope_visitor.dart
index 9b2cc7d..ac70709 100644
--- a/linter/lib/src/util/condition_scope_visitor.dart
+++ b/linter/lib/src/util/condition_scope_visitor.dart
@@ -93,10 +93,10 @@
 /// When add a new local scope:
 /// - Visiting a non-empty function body: [BlockFunctionBody] [ExpressionFunctionBody].
 /// - Visiting a flow-control statement: [IfStatement] ElseStatement.
-/// - Visiting loop statements: [DoStatement] [WhileStatement] [ForStatement] [ForStatement2].
+/// - Visiting loop statements: [DoStatement] [WhileStatement] [ForStatement].
 ///
 /// When call the abstract method visitCondition(node.condition):
-/// - After visiting a conditional statements: [IfStatement] [DoStatement] [WhileStatement] [ForStatement2].
+/// - After visiting a conditional statements: [IfStatement] [DoStatement] [WhileStatement].
 ///
 /// When undefine an element:
 /// - Visiting reassignments of variables: [AssignmentExpression] [PrefixExpression] [PostfixExpression].
@@ -108,7 +108,7 @@
 ///
 /// When propagate undefined elements:
 /// - After visiting a flow-control statement: [IfStatement] ElseStatement.
-/// - After visiting loop statements: [DoStatement] [WhileStatement] [ForStatement] [ForStatement2].
+/// - After visiting loop statements: [DoStatement] [WhileStatement] [ForStatement].
 ///
 /// When add a Condition as true condition:
 /// - Inside an if body and after an else body with exit clause.
@@ -180,7 +180,7 @@
   }
 
   @override
-  visitForStatement2(ForStatement2 node) {
+  visitForStatement(ForStatement node) {
     _addScope();
     final loopParts = node.forLoopParts;
     if (loopParts is ForParts) {
@@ -332,7 +332,7 @@
 
   /// If any of the variables is declared inside the for statement then it does
   /// not mean anything afterwards.
-  bool _isRelevantOutsideOfForStatement(ForStatement2 node) {
+  bool _isRelevantOutsideOfForStatement(ForStatement node) {
     if (breakScope.hasBreak(node)) {
       return false;
     }
diff --git a/linter/lib/src/util/dart_type_utilities.dart b/linter/lib/src/util/dart_type_utilities.dart
index 226851a..d6af55f 100644
--- a/linter/lib/src/util/dart_type_utilities.dart
+++ b/linter/lib/src/util/dart_type_utilities.dart
@@ -324,7 +324,7 @@
   /// * Two types, each representing a type variable, are related if their
   ///   bounds are related.
   /// * Otherwise, the types are related.
-  // TODO(srawlins): typedefs :D
+  // TODO(srawlins): typedefs and functions in general.
   static bool unrelatedTypes(DartType leftType, DartType rightType) {
     // If we don't have enough information, or can't really compare the types,
     // return false as they _might_ be related.
@@ -373,9 +373,30 @@
     } else if (leftElement is TypeParameterElement &&
         rightElement is TypeParameterElement) {
       return unrelatedTypes(leftElement.bound, rightElement.bound);
+    } else if (leftType is FunctionType) {
+      if (_isFunctionTypeUnrelatedToType(leftType, rightType)) {
+        return true;
+      }
+    } else if (rightType is FunctionType) {
+      if (_isFunctionTypeUnrelatedToType(rightType, leftType)) {
+        return true;
+      }
     }
     return false;
   }
+
+  static bool _isFunctionTypeUnrelatedToType(
+      FunctionType type1, DartType type2) {
+    if (type2 is FunctionType) {
+      return false;
+    }
+    Element element2 = type2.element;
+    if (element2 is ClassElement &&
+        element2.lookUpConcreteMethod('call', element2.library) != null) {
+      return false;
+    }
+    return true;
+  }
 }
 
 class InterfaceTypeDefinition {
diff --git a/linter/lib/src/version.dart b/linter/lib/src/version.dart
index 5deccb1..d2f7505 100644
--- a/linter/lib/src/version.dart
+++ b/linter/lib/src/version.dart
@@ -3,4 +3,4 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Package version.  Synchronized w/ pubspec.yaml.
-const String version = '0.1.83';
+const String version = '0.1.87';
diff --git a/linter/pubspec.yaml b/linter/pubspec.yaml
index e7f478f..e85f8fe 100644
--- a/linter/pubspec.yaml
+++ b/linter/pubspec.yaml
@@ -1,5 +1,5 @@
 name: linter
-version: 0.1.83
+version: 0.1.87
 
 author: Dart Team <misc@dartlang.org>
 
@@ -13,7 +13,7 @@
   sdk: '>=2.2.0 <3.0.0'
 
 dependencies:
-  analyzer: ^0.35.3
+  analyzer: ^0.36.0
   args: '>=1.4.0 <2.0.0'
   glob: ^1.0.3
   meta: ^1.0.2
@@ -22,9 +22,10 @@
 
 dev_dependencies:
   cli_util: ^0.1.2
-  dart_style: ^1.1.0
+  dart_style: ^1.2.5
   github: ^4.0.1
   grinder: ^0.8.0
+  http: ^0.12.0
   markdown: ^2.0.0
   matcher: ^0.12.0
   path: ^1.2.0
diff --git a/linter/tool/bot/version_check.dart b/linter/tool/bot/version_check.dart
new file mode 100644
index 0000000..1fc0e0a
--- /dev/null
+++ b/linter/tool/bot/version_check.dart
@@ -0,0 +1,38 @@
+// 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:convert';
+import 'dart:io';
+
+import 'package:http/http.dart' as http;
+
+main() async {
+  print('Getting latest linter package info from pub...');
+
+  final packageInfo =
+      jsonDecode(await getBody('https://pub.dartlang.org/api/packages/linter'));
+  final latestVersion = packageInfo['latest']['pubspec']['version'];
+  print('Found: $latestVersion.');
+  print('Checking for a git release tag corresponding to $latestVersion...');
+
+  var client = http.Client();
+  var req = await client
+      .get('https://github.com/dart-lang/linter/releases/tag/$latestVersion');
+
+  if (req.statusCode == 404) {
+    print(
+        'No tagged release for $latestVersion found; this will cause problems when included in SDK DEPS.');
+    print(
+        'Be sure a $latestVersion release is tagged in https://github.com/dart-lang/linter/releases and re-run.');
+    exit(1);
+  } else {
+    print('Tag found 👍.');
+  }
+}
+
+final _client = http.Client();
+
+Future<String> getBody(String url) async => (await getResponse(url)).body;
+
+Future<http.Response> getResponse(String url) async => _client.get(url);
diff --git a/linter/tool/scorecard.dart b/linter/tool/scorecard.dart
index 8d31093..c6eea7c 100644
--- a/linter/tool/scorecard.dart
+++ b/linter/tool/scorecard.dart
@@ -136,7 +136,7 @@
   void visitNamedExpression(NamedExpression node) {
     if (node.name.toString() == 'associatedErrorCodes:') {
       ListLiteral list = node.expression;
-      for (var element in list.elements2) {
+      for (var element in list.elements) {
         var name =
             element.toString().substring(1, element.toString().length - 1);
         lintNames.add(name);
diff --git a/linter/tool/since/dart_sdk.yaml b/linter/tool/since/dart_sdk.yaml
index 10ef5ce..17269b7 100644
--- a/linter/tool/since/dart_sdk.yaml
+++ b/linter/tool/since/dart_sdk.yaml
@@ -1,3 +1,7 @@
+2.2.1-dev.3.1 : 0.1.83
+2.2.1-dev.3.0 : 0.1.83
+2.2.1-dev.2.1 : 0.1.82
+2.2.1-dev.2.0 : 0.1.82
 2.2.1-dev.1.1 : 0.1.82
 2.2.1-dev.1.0 : 0.1.82
 2.2.1-dev.0.0 : 0.1.82
diff --git a/linter/tool/travis.sh b/linter/tool/travis.sh
index 4f56bfc..f9ad6a8 100755
--- a/linter/tool/travis.sh
+++ b/linter/tool/travis.sh
@@ -7,14 +7,12 @@
 # Fast fail the script on failures.
 set -e
 
-# Verify that the libraries are error free.
-dartanalyzer --fatal-warnings \
-  bin/linter.dart \
-  test/all.dart
 
-echo ""
+if [ "$LINTER_BOT" = "release" ]; then
+  echo "Validating release..."
+  dart tool/bot/version_check.dart
 
-if [ "$LINTER_BOT" = "benchmark" ]; then
+elif [ "$LINTER_BOT" = "benchmark" ]; then
   echo "Running the linter benchmark..."
 
   # The actual lints can have errors - we don't want to fail the benchmark bot.
@@ -38,6 +36,13 @@
 else
   echo "Running main linter bot"
 
+  # Verify that the libraries are error free.
+  dartanalyzer --fatal-warnings \
+    bin/linter.dart \
+    test/all.dart
+
+  echo ""
+
   # Run the tests.
   dart --enable-asserts test/all.dart
   
diff --git a/multicast_dns/BUILD.gn b/multicast_dns/BUILD.gn
index ae02c63..a455dbe 100644
--- a/multicast_dns/BUILD.gn
+++ b/multicast_dns/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for multicast_dns-0.1.0+1
+# This file is generated by importer.py for multicast_dns-0.1.1
 
 import("//build/dart/dart_library.gni")
 
diff --git a/multicast_dns/CHANGELOG.md b/multicast_dns/CHANGELOG.md
index 9d66683..03dcad8 100644
--- a/multicast_dns/CHANGELOG.md
+++ b/multicast_dns/CHANGELOG.md
@@ -1,5 +1,9 @@
+## 0.1.1
+
+* Fixes [flutter/issue/31854](https://github.com/flutter/flutter/issues/31854) where `decodeMDnsResponse` advanced to incorrect code points and ignored some records.
+
 ## 0.1.0
 
 * Initial Open Source release.
 * Migrates the dartino-sdk's mDNS client to Dart 2.0 and Flutter's analysis rules
-* Breaks from original Dartino code, as it does not use native libraries for macOS and overhauls the `ResourceRecord` class.
\ No newline at end of file
+* Breaks from original Dartino code, as it does not use native libraries for macOS and overhauls the `ResourceRecord` class.
diff --git a/multicast_dns/lib/src/native_protocol_client.dart b/multicast_dns/lib/src/native_protocol_client.dart
index bef02bc..553d564 100644
--- a/multicast_dns/lib/src/native_protocol_client.dart
+++ b/multicast_dns/lib/src/native_protocol_client.dart
@@ -42,7 +42,9 @@
     // Clear the cache for all name/type combinations to be updated.
     final Map<int, Set<String>> seenRecordTypes = <int, Set<String>>{};
     for (ResourceRecord record in records) {
-      seenRecordTypes[record.resourceRecordType] ??= Set<String>();
+      // TODO(dnfield): Update this to use set literal syntax when we're able to bump the SDK constraint.
+      seenRecordTypes[record.resourceRecordType] ??=
+          Set<String>(); // ignore: prefer_collection_literals
       if (seenRecordTypes[record.resourceRecordType].add(record.name)) {
         _cache[record.resourceRecordType] ??=
             SplayTreeMap<String, List<ResourceRecord>>();
diff --git a/multicast_dns/lib/src/packet.dart b/multicast_dns/lib/src/packet.dart
index 8614f45..eac3f67 100644
--- a/multicast_dns/lib/src/packet.dart
+++ b/multicast_dns/lib/src/packet.dart
@@ -222,11 +222,15 @@
   final ByteData packetBytes = ByteData.view(data.buffer);
 
   final int answerCount = packetBytes.getUint16(_kAncountOffset);
-  if (answerCount == 0) {
+  final int authorityCount = packetBytes.getUint16(_kNscountOffset);
+  final int additionalCount = packetBytes.getUint16(_kArcountOffset);
+  final int remainingCount = answerCount + authorityCount + additionalCount;
+
+  if (remainingCount == 0) {
     return null;
   }
 
-  final int answerRecordCount = packetBytes.getUint16(_kArcountOffset);
+  final int questionCount = packetBytes.getUint16(_kQdcountOffset);
   int offset = _kHeaderSize;
 
   void checkLength(int required) {
@@ -346,7 +350,14 @@
   final List<ResourceRecord> result = <ResourceRecord>[];
 
   try {
-    for (int i = 0; i < answerCount + answerRecordCount; i++) {
+    for (int i = 0; i < questionCount; i++) {
+      final _FQDNReadResult result =
+          _readFQDN(data, packetBytes, offset, length);
+      offset += result.bytesRead;
+      checkLength(offset + 4);
+      offset += 4;
+    }
+    for (int i = 0; i < remainingCount; i++) {
       final ResourceRecord record = readResourceRecord();
       if (record != null) {
         result.add(record);
diff --git a/multicast_dns/pubspec.yaml b/multicast_dns/pubspec.yaml
index 8820dff..c1a1174 100644
--- a/multicast_dns/pubspec.yaml
+++ b/multicast_dns/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Dart package for mDNS queries (e.g. Bonjour, Avahi).
 author: Flutter Team <flutter-dev@googlegroups.com>
 homepage: https://github.com/flutter/packages/tree/master/packages/multicast_dns
-version: 0.1.0+1
+version: 0.1.1
 
 dependencies:
   meta: ^1.1.6
diff --git a/stream_transform/BUILD.gn b/stream_transform/BUILD.gn
index 530ce2d..1e4e037 100644
--- a/stream_transform/BUILD.gn
+++ b/stream_transform/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for stream_transform-0.0.17
+# This file is generated by importer.py for stream_transform-0.0.19
 
 import("//build/dart/dart_library.gni")
 
diff --git a/stream_transform/CHANGELOG.md b/stream_transform/CHANGELOG.md
index 9b8ab29..e631a97 100644
--- a/stream_transform/CHANGELOG.md
+++ b/stream_transform/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.0.19
+
+- Add `asyncMapSample` transform.
+
+## 0.0.18
+
+- Internal cleanup. Passed "trigger" streams or futures now allow `<void>`
+  generic type rather than an implicit `dynamic>`
+
 ## 0.0.17
 
 - Add concrete types to the `onError` callback in `tap`.
@@ -47,7 +56,7 @@
 
 - Updates to support Dart 2.0 core library changes (wave
   2.2). See [issue 31847][sdk#31847] for details.
-  
+
   [sdk#31847]: https://github.com/dart-lang/sdk/issues/31847
 
 ## 0.0.9
diff --git a/stream_transform/README.md b/stream_transform/README.md
index 5d24caf..fc44207 100644
--- a/stream_transform/README.md
+++ b/stream_transform/README.md
@@ -5,6 +5,11 @@
 Like `asyncMap` but events are buffered in a List until previous events have
 been processed rather than being called for each element individually.
 
+# asyncMapSample
+
+Like `asyncMap` but events are discarded, keeping only the latest, until
+previous events have been processed rather than being called for every element.
+
 # asyncWhere
 
 Like `where` but allows an asynchronous predicate.
diff --git a/stream_transform/analysis_options.yaml b/stream_transform/analysis_options.yaml
index 82dd7e8..67baa3e 100644
--- a/stream_transform/analysis_options.yaml
+++ b/stream_transform/analysis_options.yaml
@@ -2,6 +2,8 @@
 analyzer:
   strong-mode:
     implicit-casts: false
+  language:
+    strict-raw-types: true
   errors:
     todo: ignore
     dead_code: error
diff --git a/stream_transform/lib/src/aggregate_sample.dart b/stream_transform/lib/src/aggregate_sample.dart
new file mode 100644
index 0000000..a069af7
--- /dev/null
+++ b/stream_transform/lib/src/aggregate_sample.dart
@@ -0,0 +1,116 @@
+// 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';
+
+/// A StreamTransformer which aggregates values and emits when it sees a value
+/// on [_trigger].
+///
+/// If there are no pending values when [_trigger] emits the first value on the
+/// source Stream will immediately flow through. Otherwise, the pending values
+/// and released when [_trigger] emits.
+///
+/// Errors from the source stream or the trigger are immediately forwarded to
+/// the output.
+class AggregateSample<S, T> extends StreamTransformerBase<S, T> {
+  final Stream<void> _trigger;
+  final T Function(S, T) _aggregate;
+
+  AggregateSample(this._trigger, this._aggregate);
+
+  @override
+  Stream<T> bind(Stream<S> values) {
+    var controller = values.isBroadcast
+        ? StreamController<T>.broadcast(sync: true)
+        : StreamController<T>(sync: true);
+
+    T currentResults;
+    var waitingForTrigger = true;
+    var isTriggerDone = false;
+    var isValueDone = false;
+    StreamSubscription<S> valueSub;
+    StreamSubscription<void> triggerSub;
+
+    emit() {
+      controller.add(currentResults);
+      currentResults = null;
+      waitingForTrigger = true;
+    }
+
+    onValue(S value) {
+      currentResults = _aggregate(value, currentResults);
+
+      if (!waitingForTrigger) emit();
+
+      if (isTriggerDone) {
+        valueSub.cancel();
+        controller.close();
+      }
+    }
+
+    onValuesDone() {
+      isValueDone = true;
+      if (currentResults == null) {
+        triggerSub?.cancel();
+        controller.close();
+      }
+    }
+
+    onTrigger(_) {
+      waitingForTrigger = false;
+
+      if (currentResults != null) emit();
+
+      if (isValueDone) {
+        triggerSub.cancel();
+        controller.close();
+      }
+    }
+
+    onTriggerDone() {
+      isTriggerDone = true;
+      if (waitingForTrigger) {
+        valueSub?.cancel();
+        controller.close();
+      }
+    }
+
+    controller.onListen = () {
+      assert(valueSub == null);
+      valueSub = values.listen(onValue,
+          onError: controller.addError, onDone: onValuesDone);
+      if (triggerSub != null) {
+        if (triggerSub.isPaused) triggerSub.resume();
+      } else {
+        triggerSub = _trigger.listen(onTrigger,
+            onError: controller.addError, onDone: onTriggerDone);
+      }
+      if (!values.isBroadcast) {
+        controller
+          ..onPause = () {
+            valueSub?.pause();
+            triggerSub?.pause();
+          }
+          ..onResume = () {
+            valueSub?.resume();
+            triggerSub?.resume();
+          };
+      }
+      controller.onCancel = () {
+        var toCancel = <StreamSubscription<void>>[];
+        if (!isValueDone) toCancel.add(valueSub);
+        valueSub = null;
+        if (_trigger.isBroadcast || !values.isBroadcast) {
+          if (!isTriggerDone) toCancel.add(triggerSub);
+          triggerSub = null;
+        } else {
+          triggerSub.pause();
+        }
+        if (toCancel.isEmpty) return null;
+        return Future.wait(toCancel.map((s) => s.cancel()));
+      };
+    };
+    return controller.stream;
+  }
+}
diff --git a/stream_transform/lib/src/async_map_buffer.dart b/stream_transform/lib/src/async_map_buffer.dart
index fd25a21..70c5bdb 100644
--- a/stream_transform/lib/src/async_map_buffer.dart
+++ b/stream_transform/lib/src/async_map_buffer.dart
@@ -4,6 +4,7 @@
 
 import 'dart:async';
 
+import 'aggregate_sample.dart';
 import 'buffer.dart';
 import 'chain_transformers.dart';
 import 'from_handlers.dart';
@@ -27,20 +28,49 @@
 /// The result stream will not close until the source stream closes and all
 /// pending conversions have finished.
 StreamTransformer<S, T> asyncMapBuffer<S, T>(
-    Future<T> convert(List<S> collected)) {
-  var workFinished = StreamController()
+    Future<T> Function(List<S>) convert) {
+  var workFinished = StreamController<void>()
     // Let the first event through.
     ..add(null);
   return chainTransformers(
       buffer(workFinished.stream), _asyncMapThen(convert, workFinished.add));
 }
 
+/// Like [Stream.asyncMap] but events are discarded while work is happening in
+/// [convert].
+///
+/// If the source stream is a broadcast stream the result will be as well. When
+/// used with a broadcast stream behavior also differs from [Stream.asyncMap] in
+/// that the [convert] function is only called once per event, rather than once
+/// per listener per event.
+///
+/// If no work is happening when an event is emitted it will be immediately
+/// passed to [convert]. If there is ongoing work when an event is emitted it
+/// will be held until the work is finished. New events emitted will replace a
+/// pending event.
+///
+/// Errors from the source stream are forwarded directly to the result stream.
+/// Errors during the conversion are also forwarded to the result stream and are
+/// considered completing work so the next values are let through.
+///
+/// The result stream will not close until the source stream closes and all
+/// pending conversions have finished.
+StreamTransformer<S, T> asyncMapSample<S, T>(Future<T> Function(S) convert) {
+  var workFinished = StreamController<void>()
+    // Let the first event through.
+    ..add(null);
+  return chainTransformers(AggregateSample(workFinished.stream, _dropPrevious),
+      _asyncMapThen(convert, workFinished.add));
+}
+
+T _dropPrevious<T>(T event, _) => event;
+
 /// Like [Stream.asyncMap] but the [convert] is only called once per event,
 /// rather than once per listener, and [then] is called after completing the
 /// work.
 StreamTransformer<S, T> _asyncMapThen<S, T>(
-    Future<T> convert(S event), void then(Object _)) {
-  Future pendingEvent;
+    Future<T> convert(S event), void Function(void) then) {
+  Future<void> pendingEvent;
   return fromHandlers(handleData: (event, sink) {
     pendingEvent =
         convert(event).then(sink.add).catchError(sink.addError).then(then);
diff --git a/stream_transform/lib/src/buffer.dart b/stream_transform/lib/src/buffer.dart
index d09d2da..3478a52 100644
--- a/stream_transform/lib/src/buffer.dart
+++ b/stream_transform/lib/src/buffer.dart
@@ -1,8 +1,11 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 import 'dart:async';
 
+import 'aggregate_sample.dart';
+
 /// Creates a [StreamTransformer] which collects values and emits when it sees a
 /// value on [trigger].
 ///
@@ -12,114 +15,7 @@
 ///
 /// Errors from the source stream or the trigger are immediately forwarded to
 /// the output.
-StreamTransformer<T, List<T>> buffer<T>(Stream trigger) => _Buffer<T>(trigger);
+StreamTransformer<T, List<T>> buffer<T>(Stream<void> trigger) =>
+    AggregateSample<T, List<T>>(trigger, _collect);
 
-/// A StreamTransformer which aggregates values and emits when it sees a value
-/// on [_trigger].
-///
-/// If there are no pending values when [_trigger] emits the first value on the
-/// source Stream will immediately flow through. Otherwise, the pending values
-/// and released when [_trigger] emits.
-///
-/// Errors from the source stream or the trigger are immediately forwarded to
-/// the output.
-class _Buffer<T> extends StreamTransformerBase<T, List<T>> {
-  final Stream _trigger;
-
-  _Buffer(this._trigger);
-
-  @override
-  Stream<List<T>> bind(Stream<T> values) {
-    var controller = values.isBroadcast
-        ? StreamController<List<T>>.broadcast(sync: true)
-        : StreamController<List<T>>(sync: true);
-
-    List<T> currentResults;
-    var waitingForTrigger = true;
-    var isTriggerDone = false;
-    var isValueDone = false;
-    StreamSubscription valueSub;
-    StreamSubscription triggerSub;
-
-    emit() {
-      controller.add(currentResults);
-      currentResults = null;
-      waitingForTrigger = true;
-    }
-
-    onValue(T value) {
-      (currentResults ??= <T>[]).add(value);
-
-      if (!waitingForTrigger) emit();
-
-      if (isTriggerDone) {
-        valueSub.cancel();
-        controller.close();
-      }
-    }
-
-    onValuesDone() {
-      isValueDone = true;
-      if (currentResults == null) {
-        triggerSub?.cancel();
-        controller.close();
-      }
-    }
-
-    onTrigger(_) {
-      waitingForTrigger = false;
-
-      if (currentResults != null) emit();
-
-      if (isValueDone) {
-        triggerSub.cancel();
-        controller.close();
-      }
-    }
-
-    onTriggerDone() {
-      isTriggerDone = true;
-      if (waitingForTrigger) {
-        valueSub?.cancel();
-        controller.close();
-      }
-    }
-
-    controller.onListen = () {
-      assert(valueSub == null);
-      valueSub = values.listen(onValue,
-          onError: controller.addError, onDone: onValuesDone);
-      if (triggerSub != null) {
-        if (triggerSub.isPaused) triggerSub.resume();
-      } else {
-        triggerSub = _trigger.listen(onTrigger,
-            onError: controller.addError, onDone: onTriggerDone);
-      }
-      if (!values.isBroadcast) {
-        controller
-          ..onPause = () {
-            valueSub?.pause();
-            triggerSub?.pause();
-          }
-          ..onResume = () {
-            valueSub?.resume();
-            triggerSub?.resume();
-          };
-      }
-      controller.onCancel = () {
-        var toCancel = <StreamSubscription>[];
-        if (!isValueDone) toCancel.add(valueSub);
-        valueSub = null;
-        if (_trigger.isBroadcast || !values.isBroadcast) {
-          if (!isTriggerDone) toCancel.add(triggerSub);
-          triggerSub = null;
-        } else {
-          triggerSub.pause();
-        }
-        if (toCancel.isEmpty) return null;
-        return Future.wait(toCancel.map((s) => s.cancel()));
-      };
-    };
-    return controller.stream;
-  }
-}
+List<T> _collect<T>(T event, List<T> soFar) => (soFar ?? <T>[])..add(event);
diff --git a/stream_transform/lib/src/combine_latest.dart b/stream_transform/lib/src/combine_latest.dart
index 1fe7d85..489f344 100644
--- a/stream_transform/lib/src/combine_latest.dart
+++ b/stream_transform/lib/src/combine_latest.dart
@@ -51,8 +51,8 @@
         ? _other.asBroadcastStream()
         : _other;
 
-    StreamSubscription sourceSubscription;
-    StreamSubscription otherSubscription;
+    StreamSubscription<S> sourceSubscription;
+    StreamSubscription<T> otherSubscription;
 
     var sourceDone = false;
     var otherDone = false;
diff --git a/stream_transform/lib/src/combine_latest_all.dart b/stream_transform/lib/src/combine_latest_all.dart
index 16f2e80..045ccdc 100644
--- a/stream_transform/lib/src/combine_latest_all.dart
+++ b/stream_transform/lib/src/combine_latest_all.dart
@@ -60,7 +60,7 @@
           .toList();
     }
 
-    List<StreamSubscription> subscriptions;
+    List<StreamSubscription<T>> subscriptions;
 
     controller.onListen = () {
       assert(subscriptions == null);
diff --git a/stream_transform/lib/src/followed_by.dart b/stream_transform/lib/src/followed_by.dart
index 779831f..3c5c6b3 100644
--- a/stream_transform/lib/src/followed_by.dart
+++ b/stream_transform/lib/src/followed_by.dart
@@ -33,7 +33,7 @@
         ? _next.asBroadcastStream()
         : _next;
 
-    StreamSubscription subscription;
+    StreamSubscription<T> subscription;
     var currentStream = first;
     var firstDone = false;
     var secondDone = false;
diff --git a/stream_transform/lib/src/merge.dart b/stream_transform/lib/src/merge.dart
index a5b4cf3..74a1e1a 100644
--- a/stream_transform/lib/src/merge.dart
+++ b/stream_transform/lib/src/merge.dart
@@ -39,7 +39,7 @@
           .toList();
     }
 
-    List<StreamSubscription> subscriptions;
+    List<StreamSubscription<T>> subscriptions;
 
     controller.onListen = () {
       assert(subscriptions == null);
diff --git a/stream_transform/lib/src/switch.dart b/stream_transform/lib/src/switch.dart
index 2f24704..e02917d 100644
--- a/stream_transform/lib/src/switch.dart
+++ b/stream_transform/lib/src/switch.dart
@@ -69,7 +69,7 @@
           };
       }
       controller.onCancel = () {
-        var toCancel = <StreamSubscription>[];
+        var toCancel = <StreamSubscription<void>>[];
         if (!outerStreamDone) toCancel.add(outerSubscription);
         if (innerSubscription != null) {
           toCancel.add(innerSubscription);
diff --git a/stream_transform/lib/src/take_until.dart b/stream_transform/lib/src/take_until.dart
index 62b1013..ad12ae8 100644
--- a/stream_transform/lib/src/take_until.dart
+++ b/stream_transform/lib/src/take_until.dart
@@ -10,10 +10,11 @@
 /// which are emitted before the trigger, but have further asynchronous delays
 /// in transformations following the takeUtil, will still go through. Cancelling
 /// a subscription immediately stops values.
-StreamTransformer<T, T> takeUntil<T>(Future trigger) => _TakeUntil(trigger);
+StreamTransformer<T, T> takeUntil<T>(Future<void> trigger) =>
+    _TakeUntil(trigger);
 
 class _TakeUntil<T> extends StreamTransformerBase<T, T> {
-  final Future _trigger;
+  final Future<void> _trigger;
 
   _TakeUntil(this._trigger);
 
@@ -23,7 +24,7 @@
         ? StreamController<T>.broadcast(sync: true)
         : StreamController<T>(sync: true);
 
-    StreamSubscription subscription;
+    StreamSubscription<T> subscription;
     var isDone = false;
     _trigger.then((_) {
       if (isDone) return;
diff --git a/stream_transform/pubspec.yaml b/stream_transform/pubspec.yaml
index a9be968..38ad8d5 100644
--- a/stream_transform/pubspec.yaml
+++ b/stream_transform/pubspec.yaml
@@ -2,7 +2,7 @@
 description: A collection of utilities to transform and manipulate streams.
 author: Dart Team <misc@dartlang.org>
 homepage: https://www.github.com/dart-lang/stream_transform
-version: 0.0.17
+version: 0.0.19
 
 environment:
   sdk: ">=2.2.0 <3.0.0"
diff --git a/test/BUILD.gn b/test/BUILD.gn
index 02285cd..40e1049 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for test-1.6.2
+# This file is generated by importer.py for test-1.6.3
 
 import("//build/dart/dart_library.gni")
 
diff --git a/test/CHANGELOG.md b/test/CHANGELOG.md
index ed467e4..954c787 100644
--- a/test/CHANGELOG.md
+++ b/test/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 1.6.3
+
+* Depend on latests `package:test_core`.
+  * This fixes an issue where non-completed tests were considered passing.
+
 ## 1.6.2
 
 * Avoid `dart:isolate` imports on code loaded in tests.
diff --git a/test/pubspec.yaml b/test/pubspec.yaml
index 9bf320c..862e06e 100644
--- a/test/pubspec.yaml
+++ b/test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: test
-version: 1.6.2
+version: 1.6.3
 author: Dart Team <misc@dartlang.org>
 description: A full featured library for writing and running Dart tests.
 homepage: https://github.com/dart-lang/test/blob/master/pkgs/test
@@ -34,7 +34,7 @@
   yaml: ^2.0.0
   # Use an exact version until the test_api and test_core package are stable.
   test_api: 0.2.5
-  test_core: 0.2.4
+  test_core: 0.2.5
 
 dev_dependencies:
   fake_async: ^1.0.0
@@ -42,8 +42,4 @@
   test_descriptor: ^1.0.0
   test_process: ^1.0.0
 
-# dependency_overrides:
-#   test_api:
-#     path: ./../test_api
-#   test_core:
-#     path: ./../test_core
+
diff --git a/test_core/BUILD.gn b/test_core/BUILD.gn
index 4752f4d..511082e 100644
--- a/test_core/BUILD.gn
+++ b/test_core/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for test_core-0.2.4
+# This file is generated by importer.py for test_core-0.2.5
 
 import("//build/dart/dart_library.gni")
 
diff --git a/test_core/CHANGELOG.md b/test_core/CHANGELOG.md
index a02302f..fa53a1c 100644
--- a/test_core/CHANGELOG.md
+++ b/test_core/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.2.5
+
+* Fix an issue where non-completed tests were considered passing.
+* Updated `compact` and `expanded` reporters to display non-completed tests.
+
 ## 0.2.4
 
 * Avoid `dart:isolate` imports on code loaded in tests.
diff --git a/test_core/lib/src/runner/engine.dart b/test_core/lib/src/runner/engine.dart
index 5f1b2c1..812d47e 100644
--- a/test_core/lib/src/runner/engine.dart
+++ b/test_core/lib/src/runner/engine.dart
@@ -95,7 +95,9 @@
     await Future.wait(<Future>[_group.future, _loadPool.done],
         eagerError: true);
     if (_closedBeforeDone) return null;
-    return liveTests.every((liveTest) => liveTest.state.result.isPassing);
+    return liveTests.every((liveTest) =>
+        liveTest.state.result.isPassing &&
+        liveTest.state.status == Status.complete);
   }
 
   /// A group of futures for each test suite.
diff --git a/test_core/lib/src/runner/reporter/compact.dart b/test_core/lib/src/runner/reporter/compact.dart
index 30d0356..a0a6507 100644
--- a/test_core/lib/src/runner/reporter/compact.dart
+++ b/test_core/lib/src/runner/reporter/compact.dart
@@ -253,6 +253,12 @@
       if (!_printedNewline) stdout.write(" " * (lineLength - message.length));
       stdout.writeln();
     } else if (!success) {
+      for (var liveTest in _engine.active) {
+        _progressLine(_description(liveTest),
+            truncate: false,
+            suffix: " - did not complete $_bold$_red[E]$_noColor");
+        print('');
+      }
       _progressLine('Some tests failed.', color: _red);
       print('');
     } else if (_engine.passed.isEmpty) {
diff --git a/test_core/lib/src/runner/reporter/expanded.dart b/test_core/lib/src/runner/reporter/expanded.dart
index ef6c225..d2b3454 100644
--- a/test_core/lib/src/runner/reporter/expanded.dart
+++ b/test_core/lib/src/runner/reporter/expanded.dart
@@ -222,6 +222,10 @@
     if (_engine.liveTests.isEmpty) {
       print("No tests ran.");
     } else if (!success) {
+      for (var liveTest in _engine.active) {
+        _progressLine(_description(liveTest),
+            suffix: " - did not complete $_bold$_red[E]$_noColor");
+      }
       _progressLine('Some tests failed.', color: _red);
     } else if (_engine.passed.isEmpty) {
       _progressLine("All tests skipped.");
diff --git a/test_core/pubspec.yaml b/test_core/pubspec.yaml
index d922888..a026fbd 100644
--- a/test_core/pubspec.yaml
+++ b/test_core/pubspec.yaml
@@ -1,5 +1,5 @@
 name: test_core
-version: 0.2.4
+version: 0.2.5
 author: Dart Team <misc@dartlang.org>
 description: A basic library for writing tests and running them on the VM.
 homepage: https://github.com/dart-lang/test/blob/master/pkgs/test_core
@@ -33,7 +33,3 @@
   matcher: ">=0.12.5 <0.12.6"
   # Use an exact version until the test_api package is stable.
   test_api: 0.2.5
-
-# dependency_overrides:
-#   test_api:
-#     path: ./../test_api
diff --git a/video_player/BUILD.gn b/video_player/BUILD.gn
index 745cdfc..26b49a4 100644
--- a/video_player/BUILD.gn
+++ b/video_player/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for video_player-0.10.0+5
+# This file is generated by importer.py for video_player-0.10.0+8
 
 import("//build/dart/dart_library.gni")
 
diff --git a/video_player/CHANGELOG.md b/video_player/CHANGELOG.md
index 2cc77e4..e3e9d9d 100644
--- a/video_player/CHANGELOG.md
+++ b/video_player/CHANGELOG.md
@@ -1,3 +1,20 @@
+## 0.10.0+8
+
+* iOS: Fix an issue where the player sends initialization message incorrectly.
+
+* Fix a few other IDE warnings.
+
+
+## 0.10.0+7
+
+* Android: Fix issue where buffering status in percentage instead of milliseconds
+
+* Android: Update buffering status everytime we notify for position change
+
+## 0.10.0+6
+
+* Android: Fix missing call to `event.put("event", "completed");` which makes it possible to detect when the video is over.
+
 ## 0.10.0+5
 
 * Fixed iOS build warnings about implicit retains.
diff --git a/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java b/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java
index de4f44c..0be5e77 100644
--- a/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java
+++ b/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java
@@ -8,16 +8,16 @@
 import static com.google.android.exoplayer2.Player.REPEAT_MODE_OFF;
 
 import android.content.Context;
-import android.media.AudioManager;
 import android.net.Uri;
 import android.os.Build;
+import android.util.LongSparseArray;
 import android.view.Surface;
 import com.google.android.exoplayer2.C;
 import com.google.android.exoplayer2.ExoPlaybackException;
 import com.google.android.exoplayer2.ExoPlayerFactory;
 import com.google.android.exoplayer2.Format;
 import com.google.android.exoplayer2.Player;
-import com.google.android.exoplayer2.Player.DefaultEventListener;
+import com.google.android.exoplayer2.Player.EventListener;
 import com.google.android.exoplayer2.SimpleExoPlayer;
 import com.google.android.exoplayer2.audio.AudioAttributes;
 import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
@@ -52,8 +52,6 @@
 
 public class VideoPlayerPlugin implements MethodCallHandler {
 
-  private static final String TAG = "VideoPlayerPlugin";
-
   private static class VideoPlayer {
 
     private SimpleExoPlayer exoPlayer;
@@ -83,7 +81,7 @@
       Uri uri = Uri.parse(dataSource);
 
       DataSource.Factory dataSourceFactory;
-      if (uri.getScheme().equals("asset") || uri.getScheme().equals("file")) {
+      if (isFileOrAsset(uri)) {
         dataSourceFactory = new DefaultDataSourceFactory(context, "ExoPlayer");
       } else {
         dataSourceFactory =
@@ -101,6 +99,14 @@
       setupVideoPlayer(eventChannel, textureEntry, result);
     }
 
+    private static boolean isFileOrAsset(Uri uri) {
+      if (uri == null || uri.getScheme() == null) {
+        return false;
+      }
+      String scheme = uri.getScheme();
+      return scheme.equals("file") || scheme.equals("asset");
+    }
+
     private MediaSource buildMediaSource(
         Uri uri, DataSource.Factory mediaDataSourceFactory, Context context) {
       int type = Util.inferContentType(uri.getLastPathSegment());
@@ -151,27 +157,26 @@
       setAudioAttributes(exoPlayer);
 
       exoPlayer.addListener(
-          new DefaultEventListener() {
+          new EventListener() {
 
             @Override
             public void onPlayerStateChanged(final boolean playWhenReady, final int playbackState) {
-              super.onPlayerStateChanged(playWhenReady, playbackState);
               if (playbackState == Player.STATE_BUFFERING) {
+                sendBufferingUpdate();
+              } else if (playbackState == Player.STATE_READY) {
+                if (!isInitialized) {
+                  isInitialized = true;
+                  sendInitialized();
+                }
+              } else if (playbackState == Player.STATE_ENDED) {
                 Map<String, Object> event = new HashMap<>();
-                event.put("event", "bufferingUpdate");
-                List<Integer> range = Arrays.asList(0, exoPlayer.getBufferedPercentage());
-                // iOS supports a list of buffered ranges, so here is a list with a single range.
-                event.put("values", Collections.singletonList(range));
+                event.put("event", "completed");
                 eventSink.success(event);
-              } else if (playbackState == Player.STATE_READY && !isInitialized) {
-                isInitialized = true;
-                sendInitialized();
               }
             }
 
             @Override
             public void onPlayerError(final ExoPlaybackException error) {
-              super.onPlayerError(error);
               if (eventSink != null) {
                 eventSink.error("VideoError", "Video player had error " + error, null);
               }
@@ -183,13 +188,22 @@
       result.success(reply);
     }
 
+    private void sendBufferingUpdate() {
+      Map<String, Object> event = new HashMap<>();
+      event.put("event", "bufferingUpdate");
+      List<? extends Number> range = Arrays.asList(0, exoPlayer.getBufferedPosition());
+      // iOS supports a list of buffered ranges, so here is a list with a single range.
+      event.put("values", Collections.singletonList(range));
+      eventSink.success(event);
+    }
+
     @SuppressWarnings("deprecation")
     private static void setAudioAttributes(SimpleExoPlayer exoPlayer) {
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
         exoPlayer.setAudioAttributes(
             new AudioAttributes.Builder().setContentType(C.CONTENT_TYPE_MOVIE).build());
       } else {
-        exoPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+        exoPlayer.setAudioStreamType(C.STREAM_TYPE_MUSIC);
       }
     }
 
@@ -218,6 +232,7 @@
       return exoPlayer.getCurrentPosition();
     }
 
+    @SuppressWarnings("SuspiciousNameCombination")
     private void sendInitialized() {
       if (isInitialized) {
         Map<String, Object> event = new HashMap<>();
@@ -273,22 +288,26 @@
 
   private VideoPlayerPlugin(Registrar registrar) {
     this.registrar = registrar;
-    this.videoPlayers = new HashMap<>();
+    this.videoPlayers = new LongSparseArray<>();
   }
 
-  private final Map<Long, VideoPlayer> videoPlayers;
+  private final LongSparseArray<VideoPlayer> videoPlayers;
 
   private final Registrar registrar;
 
-  void onDestroy() {
+  private void disposeAllPlayers() {
+    for (int i = 0; i < videoPlayers.size(); i++) {
+      videoPlayers.valueAt(i).dispose();
+    }
+    videoPlayers.clear();
+  }
+
+  private void onDestroy() {
     // The whole FlutterView is being destroyed. Here we release resources acquired for all instances
     // of VideoPlayer. Once https://github.com/flutter/flutter/issues/19358 is resolved this may
     // be replaced with just asserting that videoPlayers.isEmpty().
     // https://github.com/flutter/flutter/issues/20989 tracks this.
-    for (VideoPlayer player : videoPlayers.values()) {
-      player.dispose();
-    }
-    videoPlayers.clear();
+    disposeAllPlayers();
   }
 
   @Override
@@ -300,10 +319,7 @@
     }
     switch (call.method) {
       case "init":
-        for (VideoPlayer player : videoPlayers.values()) {
-          player.dispose();
-        }
-        videoPlayers.clear();
+        disposeAllPlayers();
         break;
       case "create":
         {
@@ -317,10 +333,9 @@
             String assetLookupKey;
             if (call.argument("package") != null) {
               assetLookupKey =
-                  registrar.lookupKeyForAsset(
-                      (String) call.argument("asset"), (String) call.argument("package"));
+                  registrar.lookupKeyForAsset(call.argument("asset"), call.argument("package"));
             } else {
-              assetLookupKey = registrar.lookupKeyForAsset((String) call.argument("asset"));
+              assetLookupKey = registrar.lookupKeyForAsset(call.argument("asset"));
             }
             player =
                 new VideoPlayer(
@@ -333,11 +348,7 @@
           } else {
             player =
                 new VideoPlayer(
-                    registrar.context(),
-                    eventChannel,
-                    handle,
-                    (String) call.argument("uri"),
-                    result);
+                    registrar.context(), eventChannel, handle, call.argument("uri"), result);
             videoPlayers.put(handle.id(), player);
           }
           break;
@@ -362,11 +373,11 @@
   private void onMethodCall(MethodCall call, Result result, long textureId, VideoPlayer player) {
     switch (call.method) {
       case "setLooping":
-        player.setLooping((Boolean) call.argument("looping"));
+        player.setLooping(call.argument("looping"));
         result.success(null);
         break;
       case "setVolume":
-        player.setVolume((Double) call.argument("volume"));
+        player.setVolume(call.argument("volume"));
         result.success(null);
         break;
       case "play":
@@ -384,6 +395,7 @@
         break;
       case "position":
         result.success(player.getPosition());
+        player.sendBufferingUpdate();
         break;
       case "dispose":
         player.dispose();
diff --git a/video_player/ios/Classes/VideoPlayerPlugin.m b/video_player/ios/Classes/VideoPlayerPlugin.m
index 5554b21..ded94ab 100644
--- a/video_player/ios/Classes/VideoPlayerPlugin.m
+++ b/video_player/ios/Classes/VideoPlayerPlugin.m
@@ -39,7 +39,7 @@
 @property(nonatomic) CGAffineTransform preferredTransform;
 @property(nonatomic, readonly) bool disposed;
 @property(nonatomic, readonly) bool isPlaying;
-@property(nonatomic, readonly) bool isLooping;
+@property(nonatomic) bool isLooping;
 @property(nonatomic, readonly) bool isInitialized;
 - (instancetype)initWithURL:(NSURL*)url frameUpdater:(FLTFrameUpdater*)frameUpdater;
 - (void)play;
@@ -97,6 +97,17 @@
                                                 }];
 }
 
+static inline CGFloat radiansToDegrees(CGFloat radians) {
+  // Input range [-pi, pi] or [-180, 180]
+  CGFloat degrees = GLKMathRadiansToDegrees((float)radians);
+  if (degrees < 0) {
+    // Convert -90 to 270 and -180 to 180
+    return degrees + 360;
+  }
+  // Output degrees in between [0, 360[
+  return degrees;
+};
+
 - (AVMutableVideoComposition*)getVideoCompositionWithTransform:(CGAffineTransform)transform
                                                      withAsset:(AVAsset*)asset
                                                 withVideoTrack:(AVAssetTrack*)videoTrack {
@@ -113,8 +124,8 @@
   videoComposition.instructions = @[ instruction ];
 
   // If in portrait mode, switch the width and height of the video
-  float width = videoTrack.naturalSize.width;
-  float height = videoTrack.naturalSize.height;
+  CGFloat width = videoTrack.naturalSize.width;
+  CGFloat height = videoTrack.naturalSize.height;
   NSInteger rotationDegrees =
       (NSInteger)round(radiansToDegrees(atan2(_preferredTransform.b, _preferredTransform.a)));
   if (rotationDegrees == 90 || rotationDegrees == 270) {
@@ -183,7 +194,7 @@
     if ([asset statusOfValueForKey:@"tracks" error:nil] == AVKeyValueStatusLoaded) {
       NSArray* tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
       if ([tracks count] > 0) {
-        AVAssetTrack* videoTrack = [tracks objectAtIndex:0];
+        AVAssetTrack* videoTrack = tracks[0];
         void (^trackCompletionHandler)(void) = ^{
           if (self->_disposed) return;
           if ([videoTrack statusOfValueForKey:@"preferredTransform"
@@ -236,7 +247,7 @@
   } else if (context == statusContext) {
     AVPlayerItem* item = (AVPlayerItem*)object;
     switch (item.status) {
-      case AVPlayerStatusFailed:
+      case AVPlayerItemStatusFailed:
         if (_eventSink != nil) {
           _eventSink([FlutterError
               errorWithCode:@"VideoError"
@@ -248,7 +259,6 @@
       case AVPlayerItemStatusUnknown:
         break;
       case AVPlayerItemStatusReadyToPlay:
-        _isInitialized = true;
         [item addOutput:_videoOutput];
         [self sendInitialized];
         [self updatePlayingState];
@@ -284,23 +294,18 @@
   _displayLink.paused = !_isPlaying;
 }
 
-static inline CGFloat radiansToDegrees(CGFloat radians) {
-  // Input range [-pi, pi] or [-180, 180]
-  CGFloat degrees = GLKMathRadiansToDegrees(radians);
-  if (degrees < 0) {
-    // Convert -90 to 270 and -180 to 180
-    return degrees + 360;
-  }
-  // Output degrees in between [0, 360[
-  return degrees;
-};
-
 - (void)sendInitialized {
-  if (_eventSink && _isInitialized) {
+  if (_eventSink && !_isInitialized) {
     CGSize size = [self.player currentItem].presentationSize;
     CGFloat width = size.width;
     CGFloat height = size.height;
 
+    // The player has not yet initialized.
+    if (height == CGSizeZero.height && width == CGSizeZero.width) {
+      return;
+    }
+
+    _isInitialized = true;
     _eventSink(@{
       @"event" : @"initialized",
       @"duration" : @([self duration]),
@@ -339,7 +344,7 @@
 }
 
 - (void)setVolume:(double)volume {
-  _player.volume = (volume < 0.0) ? 0.0 : ((volume > 1.0) ? 1.0 : volume);
+  _player.volume = (float)((volume < 0.0) ? 0.0 : ((volume > 1.0) ? 1.0 : volume));
 }
 
 - (CVPixelBufferRef)copyPixelBuffer {
@@ -440,7 +445,7 @@
 
     for (NSNumber* textureId in _players) {
       [_registry unregisterTexture:[textureId unsignedIntegerValue]];
-      [[_players objectForKey:textureId] dispose];
+      [_players[textureId] dispose];
     }
     [_players removeAllObjects];
     result(nil);
@@ -478,10 +483,10 @@
       [player dispose];
       result(nil);
     } else if ([@"setLooping" isEqualToString:call.method]) {
-      [player setIsLooping:[[argsMap objectForKey:@"looping"] boolValue]];
+      [player setIsLooping:[argsMap[@"looping"] boolValue]];
       result(nil);
     } else if ([@"setVolume" isEqualToString:call.method]) {
-      [player setVolume:[[argsMap objectForKey:@"volume"] doubleValue]];
+      [player setVolume:[argsMap[@"volume"] doubleValue]];
       result(nil);
     } else if ([@"play" isEqualToString:call.method]) {
       [player play];
@@ -489,7 +494,7 @@
     } else if ([@"position" isEqualToString:call.method]) {
       result(@([player position]));
     } else if ([@"seekTo" isEqualToString:call.method]) {
-      [player seekTo:[[argsMap objectForKey:@"location"] intValue]];
+      [player seekTo:[argsMap[@"location"] intValue]];
       result(nil);
     } else if ([@"pause" isEqualToString:call.method]) {
       [player pause];
diff --git a/video_player/lib/video_player.dart b/video_player/lib/video_player.dart
index 441057d..ce4ac70 100644
--- a/video_player/lib/video_player.dart
+++ b/video_player/lib/video_player.dart
@@ -242,7 +242,7 @@
           _applyPlayPause();
           break;
         case 'completed':
-          value = value.copyWith(isPlaying: false);
+          value = value.copyWith(isPlaying: false, position: value.duration);
           _timer?.cancel();
           break;
         case 'bufferingUpdate':
diff --git a/video_player/pubspec.yaml b/video_player/pubspec.yaml
index 8cae1f2..e469a12 100644
--- a/video_player/pubspec.yaml
+++ b/video_player/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Flutter plugin for displaying inline video with other Flutter
   widgets on Android and iOS.
 author: Flutter Team <flutter-dev@googlegroups.com>
-version: 0.10.0+5
+version: 0.10.0+8
 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player
 
 flutter:
diff --git a/vm_service_client/BUILD.gn b/vm_service_client/BUILD.gn
index fd45d89..cab548b 100644
--- a/vm_service_client/BUILD.gn
+++ b/vm_service_client/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for vm_service_client-0.2.6+1
+# This file is generated by importer.py for vm_service_client-0.2.6+2
 
 import("//build/dart/dart_library.gni")
 
diff --git a/vm_service_client/CHANGELOG.md b/vm_service_client/CHANGELOG.md
index b98e767..75ea04d 100644
--- a/vm_service_client/CHANGELOG.md
+++ b/vm_service_client/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.2.6+2
+
+* Do not override path during `VMServiceClient.connect`.
+  * Fixes issues with connecting to Dart `2.3` observatory URIs.
+
 ## 0.2.6+1
 
 * Allow `stream_channel` version 2.x
diff --git a/vm_service_client/lib/src/instance.dart b/vm_service_client/lib/src/instance.dart
index e27df49..aa60a75 100644
--- a/vm_service_client/lib/src/instance.dart
+++ b/vm_service_client/lib/src/instance.dart
@@ -7,7 +7,6 @@
 import 'dart:convert';
 import 'dart:typed_data';
 
-import 'package:async/async.dart';
 import 'package:stack_trace/stack_trace.dart';
 
 import 'bound_field.dart';
@@ -299,7 +298,7 @@
   Future<VMValueInstance<T>> load();
 
   Future<T> getValue({onUnknownValue(value)}) =>
-      DelegatingFuture.typed(super.getValue(onUnknownValue: onUnknownValue));
+      super.getValue(onUnknownValue: onUnknownValue).then((v) => v as T);
 
   Future<T> _getValue(onUnknownValue(value)) async => value;
 
diff --git a/vm_service_client/lib/src/isolate.dart b/vm_service_client/lib/src/isolate.dart
index a7621b5..9d06391 100644
--- a/vm_service_client/lib/src/isolate.dart
+++ b/vm_service_client/lib/src/isolate.dart
@@ -484,7 +484,8 @@
 
   Future<VMRunnableIsolate> loadRunnable() => load();
 
-  Future<VMRunnableIsolate> load() => DelegatingFuture.typed(super.load());
+  Future<VMRunnableIsolate> load() =>
+      super.load().then((v) => v as VMRunnableIsolate);
 
   String toString() => "Isolate running $rootLibrary";
 }
diff --git a/vm_service_client/lib/vm_service_client.dart b/vm_service_client/lib/vm_service_client.dart
index 9bdb474..18177aa 100644
--- a/vm_service_client/lib/vm_service_client.dart
+++ b/vm_service_client/lib/vm_service_client.dart
@@ -109,7 +109,10 @@
     }
 
     var uri = url is String ? Uri.parse(url) : url;
-    if (uri.scheme == 'http') uri = uri.replace(scheme: 'ws', path: '/ws');
+    if (uri.scheme == 'http') {
+      var path = uri.path.endsWith('/') ? uri.path : uri.path + '/';
+      uri = uri.replace(scheme: 'ws', path: '${path}ws');
+    }
 
     // TODO(nweiz): Just use [WebSocketChannel.connect] when cross-platform
     // libraries work.
diff --git a/vm_service_client/pubspec.yaml b/vm_service_client/pubspec.yaml
index 246c64f..6b3b5fb 100644
--- a/vm_service_client/pubspec.yaml
+++ b/vm_service_client/pubspec.yaml
@@ -1,5 +1,5 @@
 name: vm_service_client
-version: 0.2.6+1
+version: 0.2.6+2
 description: A client for the Dart VM service.
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/vm_service_client
@@ -18,4 +18,4 @@
   web_socket_channel: ^1.0.0
 
 dev_dependencies:
-  test: ^1.2.0
+  test: ^1.6.0
diff --git a/vm_service_lib/BUILD.gn b/vm_service_lib/BUILD.gn
index 1238f34..0bf2fd5 100644
--- a/vm_service_lib/BUILD.gn
+++ b/vm_service_lib/BUILD.gn
@@ -1,4 +1,4 @@
-# This file is generated by importer.py for vm_service_lib-3.15.1+1
+# This file is generated by importer.py for vm_service_lib-3.15.1+2
 
 import("//build/dart/dart_library.gni")
 
diff --git a/vm_service_lib/CHANGELOG.md b/vm_service_lib/CHANGELOG.md
index cf33f5c..dfdaf20 100644
--- a/vm_service_lib/CHANGELOG.md
+++ b/vm_service_lib/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+## 3.15.1+2
+- fix handling of errors in registered service callbacks to return valid
+  JSON-RPC errors and avoid the client getting "Service Disappeared" responses
+
 ## 3.15.1+1
 - rename `getVmWsUriFromObservatoryUri` to `convertToWebSocketUrl`
 - fix an assignment issue in `evaluate`
diff --git a/vm_service_lib/lib/vm_service_lib.dart b/vm_service_lib/lib/vm_service_lib.dart
index 281480b..82bf035 100644
--- a/vm_service_lib/lib/vm_service_lib.dart
+++ b/vm_service_lib/lib/vm_service_lib.dart
@@ -1449,13 +1449,15 @@
       return {
         'error': {
           'code': -32601, // Method not found
-          'message': 'Method not found \'${method}\''
+          'message': 'Method not found \'$method\''
         }
       };
-    } catch (e, s) {
-      return <String, dynamic>{
-        'code': -32000, // SERVER ERROR
-        'message': 'Unexpected Server Error ${e}\n${s}'
+    } catch (e, st) {
+      return {
+        'error': {
+          'code': -32000, // SERVER ERROR
+          'message': 'Unexpected Server Error $e\n$st'
+        }
       };
     }
   }
diff --git a/vm_service_lib/pubspec.yaml b/vm_service_lib/pubspec.yaml
index 40de4b9..1e8309f 100644
--- a/vm_service_lib/pubspec.yaml
+++ b/vm_service_lib/pubspec.yaml
@@ -1,6 +1,6 @@
 name: vm_service_lib
 description: A library to access the VM Service API.
-version: 3.15.1+1
+version: 3.15.1+2
 
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/vm_service_drivers
diff --git a/vm_service_lib/tool/dart/generate_dart.dart b/vm_service_lib/tool/dart/generate_dart.dart
index 3bf4469..1391d7e 100644
--- a/vm_service_lib/tool/dart/generate_dart.dart
+++ b/vm_service_lib/tool/dart/generate_dart.dart
@@ -220,13 +220,15 @@
       return {
         'error': {
           'code': -32601, // Method not found
-          'message': 'Method not found \'${method}\''
+          'message': 'Method not found \'$method\''
         }
       };
-    } catch (e, s) {
-      return <String, dynamic>{
-        'code': -32000, // SERVER ERROR
-        'message': 'Unexpected Server Error ${e}\n${s}'
+    } catch (e, st) {
+      return {
+        'error': {
+          'code': -32000, // SERVER ERROR
+          'message': 'Unexpected Server Error $e\n$st'
+        }
       };
     }
   }
