Version 2.2.1-dev.3.0

Merge commit '3a93cf9464cb2e664eb3802518fe8e824a09e1f1' into dev
diff --git a/.packages b/.packages
index 87f497f..cf69a8b 100644
--- a/.packages
+++ b/.packages
@@ -62,6 +62,7 @@
 mustache:third_party/pkg/mustache/lib
 oauth2:third_party/pkg/oauth2/lib
 observatory:runtime/observatory/lib
+observatory_test_package:runtime/observatory/tests/service/observatory_test_package
 package_config:third_party/pkg_tested/package_config/lib
 package_resolver:third_party/pkg_tested/package_resolver/lib
 path:third_party/pkg/path/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0c8043b..29f220f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,12 +1,34 @@
-## 2.2.1-dev.2.1
+## 2.2.1-dev.3.0
 
-* Cherry-pick 611a53ee5eb091af491ed8fa74295ee779743a90 to dev
+### Core library changes
+
+#### `dart:isolate`
+
+* Added `debugName` property to `Isolate`.
+* Added `debugName` optional parameter to `Isolate.spawn` and
+  `Isolate.spawnUri`.
+
+### Tool Changes
 
 #### dartfmt
 
 * Tweak set literal formatting to follow other collection literals.
 * Add support for "UI as code" features.
 
+#### Linter
+
+The Linter was updated to `0.1.83` which includes the following changes:
+
+* updated `file_names` to skip prefixed-extension Dart files (e.g., `.css.dart`, `.g.dart`)
+* updated SDK constraint to `2.2.0`
+* miscellaneous rule documentation fixes
+* (internal) updated sources to use Set literals
+* fixed NPE in `avoid_shadowing_type_parameters`
+* added linter version numbering for use in analyzer summaries
+* fixed type utilities to handle inheritance cycles
+* (internal) changes to adopt new `package:analyzer` APIs
+* fixed `unnecessary_parenthesis` false positives
+
 ## 2.2.1-dev.2.0
 
 ## 2.2.1-dev.1.1
@@ -16,7 +38,13 @@
 
 ## 2.2.1-dev.1.0
 
+* Support for deprecated flags '-c' and '--checked' has been removed
 * RegExp patterns can now use lookbehind assertions.
+* RegExp patterns can now use named capture groups and named backreferences.
+  Currently, named group matches can only be retrieved in Dart either by
+  the implicit index of the named group or by downcasting the returned Match
+  object to the type RegExpMatch. The RegExpMatch interface contains methods
+  for retrieving the available group names and retrieving a match by group name.
 
 ### Tool Changes
 
@@ -24,8 +52,10 @@
 
 * Added a CHANGELOG validator that complains if you `pub publish` without mentioning the current
   version.
+* Removed validation of library names when doing `pub publish`.
 * Added support for `pub global activate`ing package from a custom pub URL.
 * Added subcommand: `pub logout`. Logs you out of the current session.
+* Fix: Use default server for `pub uploader` command.
 
 #### dart2js
 
diff --git a/DEPS b/DEPS
index 724eb2b..cc1d44e 100644
--- a/DEPS
+++ b/DEPS
@@ -36,7 +36,7 @@
   "chromium_git": "https://chromium.googlesource.com",
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
-  "co19_2_rev": "2d157d6b9135f891ffd1d35b7a2d5dfa57611f63",
+  "co19_2_rev": "c3b33ee90c5ee7f88fdb0ead08fdbb40c54954d2",
 
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
   # should be kept up to date with the revisions pulled by the Flutter engine.
@@ -95,7 +95,7 @@
   "intl_tag": "0.15.7",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "2.0.9",
-  "linter_tag": "0.1.82",
+  "linter_tag": "0.1.83",
   "logging_tag": "0.11.3+2",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
   "markdown_tag": "2.0.2",
@@ -111,7 +111,7 @@
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.6",
   "protobuf_rev": "0c77167b16d00b561a6055bfe26690af7f26ae88",
-  "pub_rev": "3c060aae47985e9a248b850f1d0450304a5c97e3",
+  "pub_rev": "8c363fe26f059c3063f1129adbb3c4e22a8ce954",
   "pub_semver_tag": "1.4.2",
   "quiver_tag": "2.0.0+1",
   "resource_rev": "2.1.5",
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index c8b0845..f384766 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -2891,6 +2891,11 @@
         <p>
           The name, as a string, of the error code associated with this error.
         </p>
+      </dd><dt class="field"><b>url: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The URL of a page containing documentation associated with this error.
+        </p>
       </dd><dt class="field"><b>hasFix: bool<span style="color:#999999"> (optional)</span></b></dt><dd>
         
         <p>
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index 72a9529..ad7e249 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -21542,7 +21542,7 @@
  * {
  *   "lexeme": String
  *   "type": String
- *   "validElementKinds": List<ElementKind>
+ *   "validElementKinds": optional List<String>
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -21552,7 +21552,7 @@
 
   String _type;
 
-  List<ElementKind> _validElementKinds;
+  List<String> _validElementKinds;
 
   /**
    * The raw token text.
@@ -21583,18 +21583,16 @@
   /**
    * The kinds of elements which could validly replace this token.
    */
-  List<ElementKind> get validElementKinds => _validElementKinds;
+  List<String> get validElementKinds => _validElementKinds;
 
   /**
    * The kinds of elements which could validly replace this token.
    */
-  void set validElementKinds(List<ElementKind> value) {
-    assert(value != null);
+  void set validElementKinds(List<String> value) {
     this._validElementKinds = value;
   }
 
-  TokenDetails(
-      String lexeme, String type, List<ElementKind> validElementKinds) {
+  TokenDetails(String lexeme, String type, {List<String> validElementKinds}) {
     this.lexeme = lexeme;
     this.type = type;
     this.validElementKinds = validElementKinds;
@@ -21618,17 +21616,15 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, "type");
       }
-      List<ElementKind> validElementKinds;
+      List<String> validElementKinds;
       if (json.containsKey("validElementKinds")) {
         validElementKinds = jsonDecoder.decodeList(
             jsonPath + ".validElementKinds",
             json["validElementKinds"],
-            (String jsonPath, Object json) =>
-                new ElementKind.fromJson(jsonDecoder, jsonPath, json));
-      } else {
-        throw jsonDecoder.mismatch(jsonPath, "validElementKinds");
+            jsonDecoder.decodeString);
       }
-      return new TokenDetails(lexeme, type, validElementKinds);
+      return new TokenDetails(lexeme, type,
+          validElementKinds: validElementKinds);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "TokenDetails", json);
     }
@@ -21639,8 +21635,9 @@
     Map<String, dynamic> result = {};
     result["lexeme"] = lexeme;
     result["type"] = type;
-    result["validElementKinds"] =
-        validElementKinds.map((ElementKind value) => value.toJson()).toList();
+    if (validElementKinds != null) {
+      result["validElementKinds"] = validElementKinds;
+    }
     return result;
   }
 
@@ -21653,7 +21650,7 @@
       return lexeme == other.lexeme &&
           type == other.type &&
           listEqual(validElementKinds, other.validElementKinds,
-              (ElementKind a, ElementKind b) => a == b);
+              (String a, String b) => a == b);
     }
     return false;
   }
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 11a75c4..7c150bab 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -494,10 +494,10 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement(ForStatement node) {
     computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
-    super.visitForStatement2(node);
+    super.visitForStatement(node);
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
index ad84927..fe52ab6 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
@@ -585,10 +585,10 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement(ForStatement node) {
     computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
-    super.visitForStatement2(node);
+    super.visitForStatement(node);
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/computer/computer_hover.dart b/pkg/analysis_server/lib/src/computer/computer_hover.dart
index 3af0fbd..4229e9c 100644
--- a/pkg/analysis_server/lib/src/computer/computer_hover.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_hover.dart
@@ -10,16 +10,17 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/util/comment.dart';
+import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 
 /**
  * A computer for the hover at the specified offset of a Dart [CompilationUnit].
  */
 class DartUnitHoverComputer {
+  final DartdocDirectiveInfo _dartdocInfo;
   final CompilationUnit _unit;
   final int _offset;
 
-  DartUnitHoverComputer(this._unit, this._offset);
+  DartUnitHoverComputer(this._dartdocInfo, this._unit, this._offset);
 
   /**
    * Returns the computed hover, maybe `null`.
@@ -76,7 +77,7 @@
           }
         }
         // documentation
-        hover.dartdoc = computeDocumentation(element);
+        hover.dartdoc = computeDocumentation(_dartdocInfo, element);
       }
       // parameter
       hover.parameter = _safeToString(expression.staticParameterElement);
@@ -104,7 +105,8 @@
     return null;
   }
 
-  static String computeDocumentation(Element element) {
+  static String computeDocumentation(
+      DartdocDirectiveInfo dartdocInfo, Element element) {
     // TODO(dantup) We're reusing this in parameter information - move it somewhere shared?
     if (element is FieldFormalParameterElement) {
       element = (element as FieldFormalParameterElement).field;
@@ -119,7 +121,7 @@
     }
     // The documentation of the element itself.
     if (element.documentationComment != null) {
-      return getDartDocPlainText(element.documentationComment);
+      return dartdocInfo.processDartdoc(element.documentationComment);
     }
     // Look for documentation comments of overridden members.
     OverriddenElements overridden = findOverriddenElements(element);
@@ -129,7 +131,7 @@
       String rawDoc = superElement.documentationComment;
       if (rawDoc != null) {
         Element interfaceClass = superElement.enclosingElement;
-        return getDartDocPlainText(rawDoc) +
+        return dartdocInfo.processDartdoc(rawDoc) +
             '\n\nCopied from `${interfaceClass.displayName}`.';
       }
     }
diff --git a/pkg/analysis_server/lib/src/computer/computer_signature.dart b/pkg/analysis_server/lib/src/computer/computer_signature.dart
index 2dd950c..81f8cea 100644
--- a/pkg/analysis_server/lib/src/computer/computer_signature.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_signature.dart
@@ -10,13 +10,16 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 
 /**
  * A computer for the signature at the specified offset of a Dart [CompilationUnit].
  */
 class DartUnitSignatureComputer {
+  final DartdocDirectiveInfo _dartdocInfo;
   final AstNode _node;
-  DartUnitSignatureComputer(CompilationUnit _unit, int _offset)
+  DartUnitSignatureComputer(
+      this._dartdocInfo, CompilationUnit _unit, int _offset)
       : _node = new NodeLocator(_offset).searchWithin(_unit);
 
   bool get offsetIsValid => _node != null;
@@ -68,7 +71,8 @@
         execElement.parameters.map((p) => _convertParam(p)).toList();
 
     return new AnalysisGetSignatureResult(name, parameters,
-        dartdoc: DartUnitHoverComputer.computeDocumentation(execElement));
+        dartdoc: DartUnitHoverComputer.computeDocumentation(
+            _dartdocInfo, execElement));
   }
 
   ParameterInfo _convertParam(ParameterElement param) {
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index b7312d6..f9ce8ac 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -846,11 +846,10 @@
     try {
       String content = _readFile(path);
       LineInfo lineInfo = _computeLineInfo(content);
-      List<AnalysisError> errors =
-          GenerateOptionsErrorsTask.analyzeAnalysisOptions(
-              resourceProvider.getFile(path).createSource(),
-              content,
-              driver.sourceFactory);
+      List<AnalysisError> errors = analyzeAnalysisOptions(
+          resourceProvider.getFile(path).createSource(),
+          content,
+          driver.sourceFactory);
       AnalyzerConverter converter = new AnalyzerConverter();
       convertedErrors = converter.convertAnalysisErrors(errors,
           lineInfo: lineInfo, options: driver.analysisOptions);
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index d284e43..53a2d7f 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -21,6 +21,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart' as engine;
 import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -87,8 +88,9 @@
     // Prepare the hovers.
     List<HoverInformation> hovers = <HoverInformation>[];
     if (unit != null) {
-      HoverInformation hoverInformation =
-          new DartUnitHoverComputer(unit, params.offset).compute();
+      HoverInformation hoverInformation = new DartUnitHoverComputer(
+              _getDartdocDirectiveInfoFor(result), unit, params.offset)
+          .compute();
       if (hoverInformation != null) {
         hovers.add(hoverInformation);
       }
@@ -276,7 +278,8 @@
 
     // Ensure the offset provided is a valid location in the file.
     final unit = result.unit;
-    final computer = new DartUnitSignatureComputer(unit, params.offset);
+    final computer = new DartUnitSignatureComputer(
+        _getDartdocDirectiveInfoFor(result), unit, params.offset);
     if (!computer.offsetIsValid) {
       server.sendResponse(new Response.getSignatureInvalidOffset(request));
       return;
@@ -506,4 +509,12 @@
     server.updateOptions(updaters);
     return new AnalysisUpdateOptionsResult().toResponse(request.id);
   }
+
+  DartdocDirectiveInfo _getDartdocDirectiveInfoFor(ResolvedUnitResult result) {
+    // TODO(brianwilkerson) Consider moving this to AnalysisServer.
+    return server.declarationsTracker
+            ?.getContext(result.session.analysisContext)
+            ?.dartdocDirectiveInfo ??
+        new DartdocDirectiveInfo();
+  }
 }
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index a08c3bc..e5d221d 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -16,6 +16,7 @@
 import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
+import 'package:analysis_server/src/services/completion/token_details/token_detail_builder.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
@@ -260,6 +261,9 @@
       } else if (requestName == COMPLETION_REQUEST_GET_SUGGESTIONS) {
         processRequest(request);
         return Response.DELAYED_RESPONSE;
+      } else if (requestName == COMPLETION_REQUEST_LIST_TOKEN_DETAILS) {
+        listTokenDetails(request);
+        return Response.DELAYED_RESPONSE;
       } else if (requestName == COMPLETION_REQUEST_SET_SUBSCRIPTIONS) {
         return setSubscriptions(request);
       }
@@ -279,6 +283,43 @@
   }
 
   /**
+   * Process a `completion.listTokenDetails` request.
+   */
+  Future<void> listTokenDetails(Request request) async {
+    CompletionListTokenDetailsParams params =
+        CompletionListTokenDetailsParams.fromRequest(request);
+
+    String file = params.file;
+    if (server.sendResponseErrorIfInvalidFilePath(request, file)) {
+      return;
+    }
+
+    AnalysisDriver analysisDriver = server.getAnalysisDriver(file);
+    if (analysisDriver == null) {
+      server.sendResponse(Response.invalidParameter(
+        request,
+        'file',
+        'File is not being analyzed: $file',
+      ));
+    }
+    AnalysisSession session = analysisDriver.currentSession;
+    ResolvedUnitResult result = await session.getResolvedUnit(file);
+    if (result.state != ResultState.VALID) {
+      server.sendResponse(Response.invalidParameter(
+        request,
+        'file',
+        'File does not exist or cannot be read: $file',
+      ));
+    }
+
+    TokenDetailBuilder builder = new TokenDetailBuilder();
+    builder.visitNode(result.unit);
+    server.sendResponse(
+      CompletionListTokenDetailsResult(builder.details).toResponse(request.id),
+    );
+  }
+
+  /**
    * Process a `completion.getSuggestions` request.
    */
   Future<void> processRequest(Request request) async {
diff --git a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
index d8fbb56..a04b33f 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
@@ -356,8 +356,8 @@
    * then add the navigation region from the [node] to the [element].
    */
   void _addUriDirectiveRegion(UriBasedDirective node, Element element) {
-    if (element != null) {
-      Source source = element.source;
+    Source source = element?.source;
+    if (source != null) {
       if (resourceProvider.getResource(source.fullName).exists) {
         computer._addRegionForNode(node.uri, element);
       }
diff --git a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
index 9b00766..c3085a7 100644
--- a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
+++ b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
@@ -102,6 +102,12 @@
 protocol.AvailableSuggestion _protocolAvailableSuggestion(
     Declaration declaration) {
   var label = declaration.name;
+  if (declaration.kind == DeclarationKind.CONSTRUCTOR) {
+    label = declaration.name2;
+    if (declaration.name.isNotEmpty) {
+      label += '.${declaration.name}';
+    }
+  }
   if (declaration.kind == DeclarationKind.ENUM_CONSTANT) {
     label = '${declaration.name2}.${declaration.name}';
   }
@@ -161,6 +167,8 @@
       return protocol.ElementKind.CLASS;
     case DeclarationKind.CLASS_TYPE_ALIAS:
       return protocol.ElementKind.CLASS_TYPE_ALIAS;
+    case DeclarationKind.CONSTRUCTOR:
+      return protocol.ElementKind.CONSTRUCTOR;
     case DeclarationKind.ENUM:
       return protocol.ElementKind.ENUM;
     case DeclarationKind.ENUM_CONSTANT:
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index efccaeb..6b7a5a9 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -842,7 +842,8 @@
       result.potentialEdits = nullIfEmpty(refactoring.potentialEditIds);
       _sendResultResponse();
     }, onError: (exception, stackTrace) {
-      if (exception is _ResetError) {
+      if (exception is _ResetError ||
+          exception is InconsistentAnalysisException) {
         cancel();
       } else {
         server.instrumentationService.logException(exception, stackTrace);
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
index 2239929..59c4686 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
@@ -201,7 +201,7 @@
           }
         } else if (isWidgetListArgument) {
           if (childrenExpression is ListLiteral) {
-            for (var element in childrenExpression.elements2) {
+            for (var element in childrenExpression.elements) {
               var child = _createOutline(element, true);
               if (child != null) {
                 children.add(child);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
index aba64c8..7d0db4f 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 
 class HoverHandler extends MessageHandler<TextDocumentPositionParams, Hover> {
   HoverHandler(LspAnalysisServer server) : super(server);
@@ -82,7 +83,16 @@
   }
 
   ErrorOr<Hover> _getHover(ResolvedUnitResult unit, int offset) {
-    final hover = new DartUnitHoverComputer(unit.unit, offset).compute();
+    final hover = new DartUnitHoverComputer(
+            // TODO(brianwilkerson) Add declarationsTracker to server in order to
+            //  enable dartdoc processing.
+//            server.declarationsTracker
+//                .getContext(unit.session.analysisContext)
+//                .dartdocDirectiveInfo,
+            new DartdocDirectiveInfo(),
+            unit.unit,
+            offset)
+        .compute();
     return success(toHover(unit.lineInfo, hover));
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
index 53ced13..7fa60a7 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 
 class SignatureHelpHandler
     extends MessageHandler<TextDocumentPositionParams, SignatureHelp> {
@@ -28,7 +29,15 @@
     final offset = await unit.mapResult((unit) => toOffset(unit.lineInfo, pos));
 
     return offset.mapResult((offset) {
-      final computer = new DartUnitSignatureComputer(unit.result.unit, offset);
+      final computer = new DartUnitSignatureComputer(
+          // TODO(brianwilkerson) Add declarationsTracker to server in order to
+          //  enable dartdoc processing.
+//          server.declarationsTracker
+//              .getContext(unit.result.session.analysisContext)
+//              .dartdocDirectiveInfo,
+          new DartdocDirectiveInfo(),
+          unit.result.unit,
+          offset);
       if (!computer.offsetIsValid) {
         return success(); // No error, just no valid hover.
       }
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index fc2d22a..e24d2db 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -40,34 +40,6 @@
 }
 
 /**
- * Translates engine errors through the ErrorProcessor.
- */
-List<T> mapEngineErrors<T>(
-    engine.AnalysisOptions analysisOptions,
-    engine.LineInfo lineInfo,
-    List<engine.AnalysisError> errors,
-    T Function(engine.LineInfo lineInfo, engine.AnalysisError error,
-            [engine.ErrorSeverity errorSeverity])
-        constructor) {
-  List<T> serverErrors = <T>[];
-  for (engine.AnalysisError error in errors) {
-    ErrorProcessor processor =
-        ErrorProcessor.getProcessor(analysisOptions, error);
-    if (processor != null) {
-      engine.ErrorSeverity severity = processor.severity;
-      // Errors with null severity are filtered out.
-      if (severity != null) {
-        // Specified severities override.
-        serverErrors.add(constructor(lineInfo, error, severity));
-      }
-    } else {
-      serverErrors.add(constructor(lineInfo, error));
-    }
-  }
-  return serverErrors;
-}
-
-/**
  * Adds [edit] to the file containing the given [element].
  */
 void doSourceChange_addElementEdit(
@@ -104,6 +76,34 @@
 }
 
 /**
+ * Translates engine errors through the ErrorProcessor.
+ */
+List<T> mapEngineErrors<T>(
+    engine.AnalysisOptions analysisOptions,
+    engine.LineInfo lineInfo,
+    List<engine.AnalysisError> errors,
+    T Function(engine.LineInfo lineInfo, engine.AnalysisError error,
+            [engine.ErrorSeverity errorSeverity])
+        constructor) {
+  List<T> serverErrors = <T>[];
+  for (engine.AnalysisError error in errors) {
+    ErrorProcessor processor =
+        ErrorProcessor.getProcessor(analysisOptions, error);
+    if (processor != null) {
+      engine.ErrorSeverity severity = processor.severity;
+      // Errors with null severity are filtered out.
+      if (severity != null) {
+        // Specified severities override.
+        serverErrors.add(constructor(lineInfo, error, severity));
+      }
+    } else {
+      serverErrors.add(constructor(lineInfo, error));
+    }
+  }
+  return serverErrors;
+}
+
+/**
  * Construct based on error information from the analyzer engine.
  *
  * If an [errorSeverity] is specified, it will override the one in [error].
@@ -140,8 +140,13 @@
   String code = errorCode.name.toLowerCase();
   String correction = error.correction;
   bool fix = hasFix(error.errorCode);
+  String url = errorCode.url;
+  if (url == null && errorCode is engine.LintCode) {
+    String lintName = errorCode.name.toLowerCase();
+    url = 'https://dart-lang.github.io/linter/lints/$lintName.html';
+  }
   return new AnalysisError(severity, type, location, message, code,
-      correction: correction, hasFix: fix);
+      correction: correction, hasFix: fix, url: url);
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 710ca2d..942ace0 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -184,6 +184,9 @@
 
     var kinds = includedElementKinds;
     if (kinds != null) {
+      if (opType.includeConstructorSuggestions) {
+        kinds.add(protocol.ElementKind.CONSTRUCTOR);
+      }
       if (opType.includeTypeNameSuggestions) {
         kinds.add(protocol.ElementKind.CLASS);
         kinds.add(protocol.ElementKind.CLASS_TYPE_ALIAS);
@@ -192,6 +195,7 @@
         kinds.add(protocol.ElementKind.MIXIN);
       }
       if (opType.includeReturnValueSuggestions) {
+        kinds.add(protocol.ElementKind.CONSTRUCTOR);
         kinds.add(protocol.ElementKind.ENUM_CONSTANT);
         kinds.add(protocol.ElementKind.FUNCTION);
         kinds.add(protocol.ElementKind.TOP_LEVEL_VARIABLE);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index fb9885d..9da6534 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -367,7 +367,7 @@
   }
 
   @override
-  visitForStatement2(ForStatement2 node) {
+  visitForStatement(ForStatement node) {
     // Actual: for (va^)
     // Parsed: for (va^; ;)
     if (node.forLoopParts == entity) {
@@ -823,7 +823,7 @@
       node.thisOrAncestorOfType<DoStatement>() != null;
 
   bool _inForLoop(AstNode node) =>
-      node.thisOrAncestorMatching((p) => p is ForStatement2) != null;
+      node.thisOrAncestorMatching((p) => p is ForStatement) != null;
 
   bool _inLoop(AstNode node) =>
       _inDoLoop(node) || _inForLoop(node) || _inWhileLoop(node);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index 50be06c..e4d6e0f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -54,7 +54,7 @@
 
         // Do not suggest loop variable of a ForEachStatement
         // when completing the expression of the ForEachStatement
-        if (node is ForStatement2 && node.forLoopParts is ForEachParts) {
+        if (node is ForStatement && node.forLoopParts is ForEachParts) {
           node = node.parent;
         } else if (node is ForEachParts) {
           node = node.parent.parent;
diff --git a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
index b159f5d..9fa7d7e 100644
--- a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
@@ -460,7 +460,7 @@
         // Disallow control-flow statements.
         if (astNode is DoStatement ||
             astNode is IfStatement ||
-            astNode is ForStatement2 ||
+            astNode is ForStatement ||
             astNode is SwitchStatement ||
             astNode is TryStatement ||
             astNode is WhileStatement) {
diff --git a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
index f32aa2d..6c73922 100644
--- a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
@@ -393,7 +393,7 @@
     }
     AstNode outer = node.parent.parent;
     if (!(outer is DoStatement ||
-        outer is ForStatement2 ||
+        outer is ForStatement ||
         outer is IfStatement ||
         outer is WhileStatement)) {
       return false;
@@ -521,7 +521,7 @@
   }
 
   bool _complete_forEachStatement(
-      ForStatement2 forNode, ForEachParts forEachParts) {
+      ForStatement forNode, ForEachParts forEachParts) {
     AstNode name;
     if (forEachParts is ForEachPartsWithIdentifier) {
       name = forEachParts.identifier;
@@ -586,7 +586,7 @@
     return true;
   }
 
-  bool _complete_forStatement(ForStatement2 forNode, ForParts forParts) {
+  bool _complete_forStatement(ForStatement forNode, ForParts forParts) {
     SourceBuilder sb;
     int replacementLength = 0;
     if (forNode.leftParenthesis.isSynthetic) {
@@ -689,7 +689,7 @@
 
   bool _complete_forStatement2() {
     var node = this.node;
-    if (node is ForStatement2) {
+    if (node is ForStatement) {
       var forLoopParts = node.forLoopParts;
       if (forLoopParts is ForParts) {
         return _complete_forStatement(node, forLoopParts);
diff --git a/pkg/analysis_server/lib/src/services/completion/token_details/token_detail_builder.dart b/pkg/analysis_server/lib/src/services/completion/token_details/token_detail_builder.dart
new file mode 100644
index 0000000..7da4335
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/token_details/token_detail_builder.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/syntactic_entity.dart';
+import 'package:analyzer/dart/ast/token.dart';
+
+/// An object used to build the details for each token in the code being
+/// analyzed.
+class TokenDetailBuilder {
+  /// The list of details that were built.
+  List<TokenDetails> details = [];
+
+  /// Initialize a newly created builder.
+  TokenDetailBuilder();
+
+  /// Visit a [node] in the AST structure to build details for all of the tokens
+  /// contained by that node.
+  void visitNode(AstNode node) {
+    for (SyntacticEntity entity in node.childEntities) {
+      if (entity is Token) {
+        _createDetails(entity, null);
+      } else if (entity is SimpleIdentifier) {
+        List<String> kinds = [];
+        if (entity.inDeclarationContext()) {
+          kinds.add('declaration');
+        } else {
+          kinds.add('identifier');
+        }
+        _createDetails(entity.token, kinds);
+      } else if (entity is AstNode) {
+        visitNode(entity);
+      }
+    }
+  }
+
+  /// Create the details for a single [token], using the given list of [kinds].
+  void _createDetails(Token token, List<String> kinds) {
+    details.add(new TokenDetails(token.lexeme, token.type.name,
+        validElementKinds: kinds));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 4c4e5a8..bb459c1 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -51,7 +51,7 @@
       "Convert to line documentation comment",
       associatedErrorCodes: <String>['slash_for_doc_comments']);
   static const CONVERT_INTO_ASYNC_BODY = const AssistKind(
-      'dart.assist.convert.bodyToAsync', 30, "Convert to async function body");
+      'dart.assist.convert.bodyToAsync', 29, "Convert to async function body");
   static const CONVERT_INTO_BLOCK_BODY = const AssistKind(
       'dart.assist.convert.bodyToBlock', 30, "Convert to block body");
   static const CONVERT_INTO_EXPRESSION_BODY = const AssistKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index ee38d9c..b373465 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -224,8 +224,8 @@
     DeclaredIdentifier declaredIdentifier =
         node.thisOrAncestorOfType<DeclaredIdentifier>();
     if (declaredIdentifier == null) {
-      ForStatement2 forEach = node.thisOrAncestorMatching(
-          (node) => node is ForStatement2 && node.forLoopParts is ForEachParts);
+      ForStatement forEach = node.thisOrAncestorMatching(
+          (node) => node is ForStatement && node.forLoopParts is ForEachParts);
       ForEachParts forEachParts = forEach?.forLoopParts;
       int offset = node.offset;
       if (forEach != null &&
@@ -457,7 +457,7 @@
     }
 
     bool isEmptyListLiteral(Expression expression) =>
-        expression is ListLiteral && expression.elements2.isEmpty;
+        expression is ListLiteral && expression.elements.isEmpty;
 
     ListLiteral list = target;
     Expression argument = invocation.argumentList.arguments[0];
@@ -484,7 +484,7 @@
     elementText ??= '...${utils.getNodeText(argument)}';
     DartChangeBuilder changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addSimpleInsertion(list.elements2.last.end, ', $elementText');
+      builder.addSimpleInsertion(list.elements.last.end, ', $elementText');
       builder.addDeletion(range.node(invocation));
     });
     _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_TO_SPREAD);
@@ -1429,8 +1429,8 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     // find enclosing ForEachStatement
-    ForStatement2 forEachStatement = node.thisOrAncestorMatching(
-        (node) => node is ForStatement2 && node.forLoopParts is ForEachParts);
+    ForStatement forEachStatement = node.thisOrAncestorMatching(
+        (node) => node is ForStatement && node.forLoopParts is ForEachParts);
     if (forEachStatement == null) {
       _coverageMarker();
       return;
@@ -2352,7 +2352,7 @@
 
     AstNode parentList = widget.parent;
     if (parentList is ListLiteral) {
-      List<CollectionElement> parentElements = parentList.elements2;
+      List<CollectionElement> parentElements = parentList.elements;
       int index = parentElements.indexOf(widget);
       if (index != parentElements.length - 1) {
         var changeBuilder = _newDartChangeBuilder();
@@ -2386,7 +2386,7 @@
 
     AstNode parentList = widget.parent;
     if (parentList is ListLiteral) {
-      List<CollectionElement> parentElements = parentList.elements2;
+      List<CollectionElement> parentElements = parentList.elements;
       int index = parentElements.indexOf(widget);
       if (index > 0) {
         var changeBuilder = _newDartChangeBuilder();
@@ -2423,8 +2423,8 @@
       var childrenArgument = flutter.findChildrenArgument(widgetCreation);
       var childrenExpression = childrenArgument?.expression;
       if (childrenExpression is ListLiteral &&
-          childrenExpression.elements2.isNotEmpty) {
-        childrenExpressions = childrenExpression.elements2;
+          childrenExpression.elements.isNotEmpty) {
+        childrenExpressions = childrenExpression.elements;
       } else {
         return;
       }
@@ -3234,7 +3234,7 @@
     if (node is! ListLiteral) {
       return;
     }
-    if ((node as ListLiteral).elements2.any((CollectionElement exp) =>
+    if ((node as ListLiteral).elements.any((CollectionElement exp) =>
         !(exp is InstanceCreationExpression &&
             flutter.isWidgetCreation(exp)))) {
       _coverageMarker();
@@ -4026,8 +4026,8 @@
   /// placed inside curly braces, would lexically make the resulting literal a
   /// set literal rather than a map literal.
   bool _listHasUnambiguousElement(AstNode node) {
-    if (node is ListLiteral && node.elements2.length > 0) {
-      for (CollectionElement element in node.elements2) {
+    if (node is ListLiteral && node.elements.length > 0) {
+      for (CollectionElement element in node.elements) {
         if (_isUnambiguousElement(element)) {
           return true;
         }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 3bb80d7..b800b5d 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -38,7 +38,6 @@
     errorCode == StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1 ||
     errorCode == StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2 ||
     errorCode == StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS ||
-    errorCode == StaticWarningCode.FUNCTION_WITHOUT_CALL ||
     errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER ||
     errorCode ==
         CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE ||
@@ -133,6 +132,8 @@
       appliedTogetherMessage: "Add all casts in file");
   static const ADD_FIELD_FORMAL_PARAMETERS = const FixKind(
       'ADD_FIELD_FORMAL_PARAMETERS', 70, "Add final field formal parameters");
+  static const ADD_MISSING_ENUM_CASE_CLAUSES = const FixKind(
+      'ADD_MISSING_ENUM_CASE_CLAUSES', 50, 'Add missing case clauses');
   static const ADD_MISSING_PARAMETER_NAMED = const FixKind(
       'ADD_MISSING_PARAMETER_NAMED', 70, "Add named parameter '{0}'");
   static const ADD_MISSING_PARAMETER_POSITIONAL = const FixKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index adeb0f9..05d16f0 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -209,9 +209,6 @@
   String get eol => utils.endOfLine;
 
   Future<List<Fix>> compute() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-
     node = new NodeLocator2(errorOffset).searchWithin(unit);
     coveredNode = new NodeLocator2(errorOffset, errorOffset + errorLength - 1)
         .searchWithin(unit);
@@ -335,7 +332,18 @@
 //    }
     if (errorCode == HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE) {
       await _addFix_importAsync();
-      await _addFix_updateSdkConstraints();
+      await _addFix_updateSdkConstraints('2.1.0');
+    }
+    if (errorCode == HintCode.SDK_VERSION_SET_LITERAL) {
+      await _addFix_updateSdkConstraints('2.2.0');
+    }
+    if (errorCode == HintCode.SDK_VERSION_AS_EXPRESSION_IN_CONST_CONTEXT ||
+        errorCode == HintCode.SDK_VERSION_BOOL_OPERATOR ||
+        errorCode == HintCode.SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT ||
+        errorCode == HintCode.SDK_VERSION_GT_GT_GT_OPERATOR ||
+        errorCode == HintCode.SDK_VERSION_IS_EXPRESSION_IN_CONST_CONTEXT ||
+        errorCode == HintCode.SDK_VERSION_UI_AS_CODE) {
+      await _addFix_updateSdkConstraints('2.2.2');
     }
     if (errorCode == HintCode.TYPE_CHECK_IS_NOT_NULL) {
       await _addFix_isNotNull();
@@ -550,6 +558,9 @@
         CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE) {
       await _addFix_extendClassForMixin();
     }
+    if (errorCode == StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH) {
+      await _addFix_addMissingEnumCaseClauses();
+    }
     // lints
     if (errorCode is LintCode) {
       String name = errorCode.name;
@@ -709,7 +720,7 @@
       // TODO(brianwilkerson) Consider updating the right operand.
       return;
     }
-    bool needsParentheses = target.precedence2 < Precedence.postfix;
+    bool needsParentheses = target.precedence < Precedence.postfix;
     if (((_isDartCoreIterable(fromType) || _isDartCoreList(fromType)) &&
             _isDartCoreList(toType)) ||
         (_isDartCoreSet(fromType) && _isDartCoreSet(toType))) {
@@ -774,6 +785,69 @@
     }
   }
 
+  Future<void> _addFix_addMissingEnumCaseClauses() async {
+    SwitchStatement statement = node as SwitchStatement;
+    String enumName;
+    List<String> enumConstantNames = [];
+    DartType expressionType = statement.expression.staticType;
+    if (expressionType is InterfaceType) {
+      ClassElement enumElement = expressionType.element;
+      if (enumElement.isEnum) {
+        enumName = enumElement.name;
+        for (FieldElement field in enumElement.fields) {
+          if (!field.isSynthetic) {
+            enumConstantNames.add(field.name);
+          }
+        }
+      }
+    }
+    if (enumName == null) {
+      return;
+    }
+    for (SwitchMember member in statement.members) {
+      if (member is SwitchCase) {
+        Expression expression = member.expression;
+        if (expression is Identifier) {
+          Element element = expression.staticElement;
+          if (element is PropertyAccessorElement) {
+            enumConstantNames.remove(element.name);
+          }
+        }
+      }
+    }
+    if (enumConstantNames.isEmpty) {
+      return;
+    }
+
+    String statementIndent = utils.getLinePrefix(statement.offset);
+    String singleIndent = utils.getIndent(1);
+
+    DartChangeBuilder changeBuilder = _newDartChangeBuilder();
+    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addInsertion(utils.getLineThis(statement.end), (builder) {
+        for (String constantName in enumConstantNames) {
+          builder.write(statementIndent);
+          builder.write(singleIndent);
+          builder.write('case ');
+          builder.write(enumName);
+          builder.write('.');
+          builder.write(constantName);
+          builder.writeln(':');
+          builder.write(statementIndent);
+          builder.write(singleIndent);
+          builder.write(singleIndent);
+          builder.writeln('// TODO: Handle this case.');
+          builder.write(statementIndent);
+          builder.write(singleIndent);
+          builder.write(singleIndent);
+          builder.writeln('break;');
+        }
+      });
+    });
+    _addFixFromBuilder(
+        changeBuilder, DartFixKind.ADD_MISSING_ENUM_CASE_CLAUSES);
+  }
+
   Future<void> _addFix_addMissingParameter() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -1189,7 +1263,7 @@
 
     // child: [widget1, widget2]
     if (expression is ListLiteral &&
-        expression.elements2.every(flutter.isWidgetExpression)) {
+        expression.elements.every(flutter.isWidgetExpression)) {
       var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addSimpleReplacement(range.node(named.name), 'children:');
@@ -1210,8 +1284,8 @@
         node.parent?.parent is NamedExpression) {
       NamedExpression named = node.parent?.parent;
       Expression expression = named.expression;
-      if (expression is ListLiteral && expression.elements2.length == 1) {
-        CollectionElement widget = expression.elements2[0];
+      if (expression is ListLiteral && expression.elements.length == 1) {
+        CollectionElement widget = expression.elements[0];
         if (flutter.isWidgetExpression(widget)) {
           String widgetText = utils.getNodeText(widget);
           String indentOld = utils.getLinePrefix(widget.offset);
@@ -3203,16 +3277,6 @@
     }
   }
 
-  Future<void> _addFix_replaceVarWithDynamic() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    var changeBuilder = _newDartChangeBuilder();
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addSimpleReplacement(range.error(error), 'dynamic');
-    });
-    _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_VAR_WITH_DYNAMIC);
-  }
-
   Future<void> _addFix_replaceNullWithClosure() async {
     var nodeToFix;
     var parameters = const <ParameterElement>[];
@@ -3246,6 +3310,16 @@
     }
   }
 
+  Future<void> _addFix_replaceVarWithDynamic() async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    var changeBuilder = _newDartChangeBuilder();
+    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addSimpleReplacement(range.error(error), 'dynamic');
+    });
+    _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_VAR_WITH_DYNAMIC);
+  }
+
   Future<void> _addFix_replaceWithConditionalAssignment() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -3301,16 +3375,6 @@
     }
   }
 
-  Future<void> _addFix_replaceWithRethrow() async {
-    if (coveredNode is ThrowExpression) {
-      var changeBuilder = _newDartChangeBuilder();
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addSimpleReplacement(range.node(coveredNode), 'rethrow');
-      });
-      _addFixFromBuilder(changeBuilder, DartFixKind.USE_RETHROW);
-    }
-  }
-
   Future<void> _addFix_replaceWithIdentifier() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -3328,6 +3392,16 @@
     }
   }
 
+  Future<void> _addFix_replaceWithRethrow() async {
+    if (coveredNode is ThrowExpression) {
+      var changeBuilder = _newDartChangeBuilder();
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addSimpleReplacement(range.node(coveredNode), 'rethrow');
+      });
+      _addFixFromBuilder(changeBuilder, DartFixKind.USE_RETHROW);
+    }
+  }
+
   Future<void> _addFix_replaceWithTearOff() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -3746,7 +3820,7 @@
     _addFixFromBuilder(changeBuilder, DartFixKind.ADD_FIELD_FORMAL_PARAMETERS);
   }
 
-  Future<void> _addFix_updateSdkConstraints() async {
+  Future<void> _addFix_updateSdkConstraints(String minimumVersion) async {
     Context context = resourceProvider.pathContext;
     File pubspecFile = null;
     Folder folder = resourceProvider.getFolder(context.dirname(file));
@@ -3774,13 +3848,13 @@
       length = spaceOffset;
     }
     if (text == 'any') {
-      newText = '^2.1.0';
+      newText = '^$minimumVersion';
     } else if (text.startsWith('^')) {
-      newText = '^2.1.0';
+      newText = '^$minimumVersion';
     } else if (text.startsWith('>=')) {
-      newText = '>=2.1.0';
+      newText = '>=$minimumVersion';
     } else if (text.startsWith('>')) {
-      newText = '>=2.1.0';
+      newText = '>=$minimumVersion';
     }
     if (newText == null) {
       return;
diff --git a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
index 3575661..dcba372 100644
--- a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
@@ -105,8 +105,8 @@
   }
 
   @override
-  Object visitForStatement2(ForStatement2 node) {
-    super.visitForStatement2(node);
+  Object visitForStatement(ForStatement node) {
+    super.visitForStatement(node);
     var forLoopParts = node.forLoopParts;
     if (forLoopParts is ForParts) {
       List<AstNode> selectedNodes = this.selectedNodes;
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 3ac28b5..d4a4280 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -331,7 +331,7 @@
  */
 Precedence getExpressionPrecedence(AstNode node) {
   if (node is Expression) {
-    return node.precedence2;
+    return node.precedence;
   }
   return Precedence.none;
 }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index 074f91c..2c14f1f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -970,8 +970,8 @@
   }
 
   @override
-  Object visitForStatement2(ForStatement2 node) {
-    super.visitForStatement2(node);
+  Object visitForStatement(ForStatement node) {
+    super.visitForStatement(node);
     var forLoopParts = node.forLoopParts;
     if (forLoopParts is ForParts) {
       if (forLoopParts is ForPartsWithDeclarations &&
@@ -1104,11 +1104,11 @@
   }
 
   @override
-  visitForStatement2(ForStatement2 node) {
+  visitForStatement(ForStatement node) {
     if (node.awaitKeyword != null) {
       result = true;
     }
-    super.visitForStatement2(node);
+    super.visitForStatement(node);
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index aac3156..57c725a 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -1104,19 +1104,19 @@
 
   @override
   Future generateContent(Map<String, String> params) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-
     h3('Analysis plugins');
     List<PluginInfo> analysisPlugins = server.pluginManager.plugins;
 
     if (analysisPlugins.isEmpty) {
       blankslate('No known analysis plugins.');
     } else {
+      analysisPlugins
+          .sort((first, second) => first.pluginId.compareTo(second.pluginId));
       for (PluginInfo plugin in analysisPlugins) {
-        // TODO(brianwilkerson) Sort the plugins by name.
         String id = plugin.pluginId;
         PluginData data = plugin.data;
+        Map<String, List<int>> responseTimes =
+            PluginManager.pluginResponseTimes[plugin];
 
         List<String> components = pathPackage.split(id);
         int length = components.length;
@@ -1155,6 +1155,19 @@
               buf.writeln(root.root);
             });
           }
+          p('Performance:');
+          List<String> requestNames = responseTimes.keys.toList();
+          requestNames.sort();
+          for (String requestName in requestNames) {
+            List<int> data = responseTimes[requestName];
+            // TODO(brianwilkerson) Consider displaying these times as a graph,
+            //  similar to the one in AbstractCompletionPage.generateContent.
+            StringBuffer buffer = new StringBuffer();
+            buffer.write(requestName);
+            buffer.write(' ');
+            buffer.write(data);
+            p(buffer.toString());
+          }
         }
       }
     }
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 7a7aa0f..4f34392 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -855,6 +855,14 @@
     assertHasFileTarget(unitFile, 0, 0);
   }
 
+  test_string_part_invalidUri() async {
+    addTestFile('''
+part ":[invalid]";
+''');
+    await prepareNavigation();
+    assertNoRegionString('":[invalid]"');
+  }
+
   Future<void> test_string_part_unresolvedUri() async {
     addTestFile('''
 library lib;
diff --git a/pkg/analysis_server/test/constants.dart b/pkg/analysis_server/test/constants.dart
index 8b0282c..e6bae68 100644
--- a/pkg/analysis_server/test/constants.dart
+++ b/pkg/analysis_server/test/constants.dart
@@ -20,4 +20,5 @@
 const String START_LINE = 'startLine';
 const String SUBSCRIPTIONS = 'subscriptions';
 const String TYPE = 'type';
+const String URL = 'url';
 const String VERSION = 'version';
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index fa74e67..c98af16 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -23,12 +23,14 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(CompletionDomainHandlerGetSuggestionsTest);
     defineReflectiveTests(CompletionDomainHandlerTest);
   });
 }
 
 @reflectiveTest
-class CompletionDomainHandlerTest extends AbstractCompletionDomainTest {
+class CompletionDomainHandlerGetSuggestionsTest
+    extends AbstractCompletionDomainTest {
   test_ArgumentList_constructor_named_fieldFormalParam() async {
     // https://github.com/dart-lang/sdk/issues/31023
     addTestFile('''
@@ -863,6 +865,81 @@
   }
 }
 
+@reflectiveTest
+class CompletionDomainHandlerTest extends AbstractCompletionDomainTest {
+  test_listTokenDetails() async {
+    newFile(testFile, content: '''
+class A {
+  static A b(String s) {}
+  c(int i) {}
+}
+main() {
+  A.b('s').c(3);
+}
+''');
+    Request request =
+        new CompletionListTokenDetailsParams(testFile).toRequest('0');
+    Response response = await waitResponse(request);
+    List<Map<String, dynamic>> tokens = response.result['tokens'];
+    _expectTokens(tokens, [
+      _token('class', 'CLASS', null),
+      _token('A', 'STRING_INT', ['declaration']),
+      _token('{', 'OPEN_CURLY_BRACKET', null),
+      _token('static', 'STATIC', null),
+      _token('A', 'STRING_INT', ['identifier']),
+      _token('b', 'STRING_INT', ['declaration']),
+      _token('(', 'OPEN_PAREN', null),
+      _token('String', 'STRING_INT', ['identifier']),
+      _token('s', 'STRING_INT', ['declaration']),
+      _token(')', 'CLOSE_PAREN', null),
+      _token('{', 'OPEN_CURLY_BRACKET', null),
+      _token('}', 'CLOSE_CURLY_BRACKET', null),
+      _token('c', 'STRING_INT', ['declaration']),
+      _token('(', 'OPEN_PAREN', null),
+      _token('int', 'STRING_INT', ['identifier']),
+      _token('i', 'STRING_INT', ['declaration']),
+      _token(')', 'CLOSE_PAREN', null),
+      _token('{', 'OPEN_CURLY_BRACKET', null),
+      _token('}', 'CLOSE_CURLY_BRACKET', null),
+      _token('}', 'CLOSE_CURLY_BRACKET', null),
+      _token('main', 'STRING_INT', ['declaration']),
+      _token('(', 'OPEN_PAREN', null),
+      _token(')', 'CLOSE_PAREN', null),
+      _token('{', 'OPEN_CURLY_BRACKET', null),
+      _token('A', 'STRING_INT', ['identifier']),
+      _token('.', 'PERIOD', null),
+      _token('b', 'STRING_INT', ['identifier']),
+      _token('(', 'OPEN_PAREN', null),
+      _token("'s'", 'STRING', null),
+      _token(')', 'CLOSE_PAREN', null),
+      _token('.', 'PERIOD', null),
+      _token('c', 'STRING_INT', ['identifier']),
+      _token('(', 'OPEN_PAREN', null),
+      _token('3', 'INT', null),
+      _token(')', 'CLOSE_PAREN', null),
+      _token(';', 'SEMICOLON', null),
+      _token('}', 'CLOSE_CURLY_BRACKET', null),
+    ]);
+  }
+
+  void _expectTokens(List<Map<String, dynamic>> actualTokens,
+      List<TokenDetails> expectedTokens) {
+    int length = expectedTokens.length;
+    expect(actualTokens, hasLength(length));
+    for (int i = 0; i < length; i++) {
+      Map<String, dynamic> actual = actualTokens[i];
+      TokenDetails expected = expectedTokens[i];
+      expect(actual['lexeme'], expected.lexeme);
+      expect(actual['type'], expected.type);
+      expect(actual['validElementKinds'], expected.validElementKinds);
+    }
+  }
+
+  TokenDetails _token(String lexeme, String type, List<String> kinds) {
+    return new TokenDetails(lexeme, type, validElementKinds: kinds);
+  }
+}
+
 class MockRelevancySorter implements DartContributionSorter {
   bool enabled = true;
 
diff --git a/pkg/analysis_server/test/integration/linter/test_all.dart b/pkg/analysis_server/test/integration/linter/test_all.dart
new file mode 100644
index 0000000..079a94c
--- /dev/null
+++ b/pkg/analysis_server/test/integration/linter/test_all.dart
@@ -0,0 +1,13 @@
+// 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:test_reflective_loader/test_reflective_loader.dart';
+
+import 'lint_names_test.dart' as lint_names;
+
+main() {
+  defineReflectiveSuite(() {
+    lint_names.main();
+  }, name: 'linter');
+}
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index 3369f94..7cee89f 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -34,6 +34,7 @@
  *   "message": String
  *   "correction": optional String
  *   "code": String
+ *   "url": optional String
  *   "hasFix": optional bool
  * }
  */
@@ -46,6 +47,7 @@
           "code": isString
         }, optionalFields: {
           "correction": isString,
+          "url": isString,
           "hasFix": isBool
         }));
 
@@ -1617,15 +1619,12 @@
  * {
  *   "lexeme": String
  *   "type": String
- *   "validElementKinds": List<ElementKind>
+ *   "validElementKinds": optional List<String>
  * }
  */
-final Matcher isTokenDetails =
-    new LazyMatcher(() => new MatchesJsonObject("TokenDetails", {
-          "lexeme": isString,
-          "type": isString,
-          "validElementKinds": isListOf(isElementKind)
-        }));
+final Matcher isTokenDetails = new LazyMatcher(() => new MatchesJsonObject(
+    "TokenDetails", {"lexeme": isString, "type": isString},
+    optionalFields: {"validElementKinds": isListOf(isString)}));
 
 /**
  * TypeHierarchyItem
diff --git a/pkg/analysis_server/test/integration/test_all.dart b/pkg/analysis_server/test/integration/test_all.dart
index 3479ca8..3c601b3 100644
--- a/pkg/analysis_server/test/integration/test_all.dart
+++ b/pkg/analysis_server/test/integration/test_all.dart
@@ -4,34 +4,32 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'analysis/test_all.dart' as analysis_test_all;
-import 'analytics/test_all.dart' as analytics_test_all;
-import 'completion/test_all.dart' as completion_test_all;
+import 'analysis/test_all.dart' as analysis;
+import 'analytics/test_all.dart' as analytics;
+import 'completion/test_all.dart' as completion;
 import 'coverage_test.dart' as coverage_test;
-import 'diagnostic/test_all.dart' as diagnostic_test_all;
-import 'edit/test_all.dart' as edit_test_all;
-import 'execution/test_all.dart' as execution_test_all;
-import 'kythe/test_all.dart' as kythe_test_all;
-import 'linter/lint_names_test.dart' as lint_names_test;
-import 'search/test_all.dart' as search_test_all;
-import 'server/test_all.dart' as server_test_all;
+import 'diagnostic/test_all.dart' as diagnostic;
+import 'edit/test_all.dart' as edit;
+import 'execution/test_all.dart' as execution;
+import 'kythe/test_all.dart' as kythe;
+import 'linter/test_all.dart' as linter;
+import 'lsp_server/test_all.dart' as lsp_server;
+import 'search/test_all.dart' as search;
+import 'server/test_all.dart' as server;
 
-/**
- * Utility for manually running all integration tests.
- */
 main() {
   defineReflectiveSuite(() {
-    analysis_test_all.main();
-    analytics_test_all.main();
-    completion_test_all.main();
-    diagnostic_test_all.main();
-    edit_test_all.main();
-    execution_test_all.main();
-    kythe_test_all.main();
-    lint_names_test.main();
-    search_test_all.main();
-    server_test_all.main();
-
+    analysis.main();
+    analytics.main();
+    completion.main();
     coverage_test.main();
+    diagnostic.main();
+    edit.main();
+    execution.main();
+    kythe.main();
+    linter.main();
+    lsp_server.main();
+    search.main();
+    server.main();
   }, name: 'analysis_server_integration');
 }
diff --git a/pkg/analysis_server/test/lsp/test_all.dart b/pkg/analysis_server/test/lsp/test_all.dart
index bdd25b3..7c6ab34 100644
--- a/pkg/analysis_server/test/lsp/test_all.dart
+++ b/pkg/analysis_server/test/lsp/test_all.dart
@@ -4,49 +4,50 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/lsp/lsp_packet_transformer_test.dart'
-    as packet_transformer_tests;
-import 'code_actions_assists_test.dart' as assists_code_action_tests;
-import 'code_actions_fixes_test.dart' as fixes_code_action_tests;
-import 'code_actions_source_test.dart' as source_code_action_tests;
-import 'completion_test.dart' as completion_test;
-import 'definition_test.dart' as definition_test;
-import 'diagnostic_test.dart' as diagnostic_test;
-import 'document_highlights_test.dart' as document_highlights_test;
-import 'document_symbols_test.dart' as document_symbols_test;
-import 'file_modification_test.dart' as file_modification_test;
-import 'folding_test.dart' as folding_test;
-import 'format_test.dart' as format_test;
-import 'hover_test.dart' as hover_test;
-import 'initialization_test.dart' as initialization_test;
-import 'priority_files_test.dart' as priority_files_test;
-import 'references_test.dart' as references_test;
-import 'rename_test.dart' as rename_test;
-import 'server_test.dart' as server_test;
-import 'signature_help_test.dart' as signature_help_test;
-import 'workspace_symbols_test.dart' as workspace_symbols_test;
+import '../src/lsp/lsp_packet_transformer_test.dart' as lsp_packet_transformer;
+import 'change_workspace_folders_test.dart' as change_workspace_folders;
+import 'code_actions_assists_test.dart' as code_actions_assists;
+import 'code_actions_fixes_test.dart' as code_actions_fixes;
+import 'code_actions_source_test.dart' as code_actions_source;
+import 'completion_test.dart' as completion;
+import 'definition_test.dart' as definition;
+import 'diagnostic_test.dart' as diagnostic;
+import 'document_highlights_test.dart' as document_highlights;
+import 'document_symbols_test.dart' as document_symbols;
+import 'file_modification_test.dart' as file_modification;
+import 'folding_test.dart' as folding;
+import 'format_test.dart' as format;
+import 'hover_test.dart' as hover;
+import 'initialization_test.dart' as initialization;
+import 'priority_files_test.dart' as priority_files;
+import 'references_test.dart' as references;
+import 'rename_test.dart' as rename;
+import 'server_test.dart' as server;
+import 'signature_help_test.dart' as signature_help;
+import 'workspace_symbols_test.dart' as workspace_symbols;
 
 main() {
   defineReflectiveSuite(() {
-    completion_test.main();
-    definition_test.main();
-    diagnostic_test.main();
-    document_symbols_test.main();
-    document_highlights_test.main();
-    file_modification_test.main();
-    priority_files_test.main();
-    format_test.main();
-    hover_test.main();
-    initialization_test.main();
-    references_test.main();
-    server_test.main();
-    signature_help_test.main();
-    source_code_action_tests.main();
-    fixes_code_action_tests.main();
-    assists_code_action_tests.main();
-    packet_transformer_tests.main();
-    rename_test.main();
-    folding_test.main();
-    workspace_symbols_test.main();
+    change_workspace_folders.main();
+    code_actions_assists.main();
+    code_actions_fixes.main();
+    code_actions_source.main();
+    completion.main();
+    definition.main();
+    diagnostic.main();
+    document_highlights.main();
+    document_symbols.main();
+    file_modification.main();
+    folding.main();
+    format.main();
+    lsp_packet_transformer.main();
+    hover.main();
+    initialization.main();
+    priority_files.main();
+    references.main();
+    rename.main();
+    server.main();
+    signature_help.main();
+    workspace_symbols.main();
   }, name: 'lsp');
 }
diff --git a/pkg/analysis_server/test/protocol_server_test.dart b/pkg/analysis_server/test/protocol_server_test.dart
index 553f0a8..7b66304 100644
--- a/pkg/analysis_server/test/protocol_server_test.dart
+++ b/pkg/analysis_server/test/protocol_server_test.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/dart/element/element.dart' as engine;
 import 'package:analyzer/dart/element/type.dart' as engine;
 import 'package:analyzer/error/error.dart' as engine;
+import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:analyzer/src/error/codes.dart' as engine;
 import 'package:analyzer/src/generated/source.dart' as engine;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -67,6 +68,56 @@
     });
   }
 
+  void test_fromEngine_hasUrl() {
+    engineError = new MockAnalysisError(
+        source,
+        new MockErrorCode(url: 'http://codes.dartlang.org/TEST_ERROR'),
+        10,
+        20,
+        'my message');
+    AnalysisError error = newAnalysisError_fromEngine(lineInfo, engineError);
+    expect(error.toJson(), {
+      SEVERITY: 'ERROR',
+      TYPE: 'COMPILE_TIME_ERROR',
+      LOCATION: {
+        FILE: 'foo.dart',
+        OFFSET: 10,
+        LENGTH: 20,
+        START_LINE: 3,
+        START_COLUMN: 2
+      },
+      MESSAGE: 'my message',
+      CODE: 'test_error',
+      URL: 'http://codes.dartlang.org/TEST_ERROR',
+      HAS_FIX: false
+    });
+  }
+
+  void test_fromEngine_lint() {
+    engineError = new MockAnalysisError(
+        source,
+        new LintCode('my_lint', 'my message', correction: 'correction'),
+        10,
+        20,
+        'my message');
+    AnalysisError error = newAnalysisError_fromEngine(lineInfo, engineError);
+    expect(error.toJson(), {
+      SEVERITY: 'INFO',
+      TYPE: 'LINT',
+      LOCATION: {
+        FILE: 'foo.dart',
+        OFFSET: 10,
+        LENGTH: 20,
+        START_LINE: 3,
+        START_COLUMN: 2
+      },
+      MESSAGE: 'my message',
+      CODE: 'my_lint',
+      URL: 'https://dart-lang.github.io/linter/lints/my_lint.html',
+      HAS_FIX: false
+    });
+  }
+
   void test_fromEngine_noCorrection() {
     engineError.correction = null;
     AnalysisError error = newAnalysisError_fromEngine(lineInfo, engineError);
@@ -213,3 +264,41 @@
   MockAnalysisError(
       this.source, this.errorCode, this.offset, this.length, this.message);
 }
+
+class MockErrorCode implements engine.ErrorCode {
+  @override
+  engine.ErrorType type;
+
+  @override
+  engine.ErrorSeverity errorSeverity;
+
+  @override
+  String name;
+
+  @override
+  String url;
+
+  MockErrorCode(
+      {this.type: engine.ErrorType.COMPILE_TIME_ERROR,
+      this.errorSeverity: engine.ErrorSeverity.ERROR,
+      this.name: 'TEST_ERROR',
+      this.url});
+
+  @override
+  String get correction {
+    throw new StateError('Unexpected invocation of correction');
+  }
+
+  @override
+  bool get isUnresolvedIdentifier => false;
+
+  @override
+  String get message {
+    throw new StateError('Unexpected invocation of message');
+  }
+
+  @override
+  String get uniqueName {
+    throw new StateError('Unexpected invocation of uniqueName');
+  }
+}
diff --git a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
index 57d2907..600a33a 100644
--- a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
@@ -29,6 +29,27 @@
     expect(includedIdSet, contains(asyncSet.id));
   }
 
+  test_dart_instanceCreationExpression() async {
+    addTestFile(r'''
+main() {
+  new ; // ref
+}
+''');
+
+    var mathSet = await waitForSetWithUri('dart:math');
+    var asyncSet = await waitForSetWithUri('dart:async');
+
+    var results = await _getSuggestions(testFile, findOffset('; // ref'));
+    expect(
+      results.includedElementKinds,
+      unorderedEquals([ElementKind.CONSTRUCTOR]),
+    );
+
+    var includedIdSet = results.includedSuggestionSets.map((set) => set.id);
+    expect(includedIdSet, contains(mathSet.id));
+    expect(includedIdSet, contains(asyncSet.id));
+  }
+
   test_defaultArgumentListString() async {
     newFile('/home/test/lib/a.dart', content: r'''
 void fff(int aaa, int bbb) {}
@@ -119,6 +140,7 @@
       unorderedEquals([
         ElementKind.CLASS,
         ElementKind.CLASS_TYPE_ALIAS,
+        ElementKind.CONSTRUCTOR,
         ElementKind.ENUM,
         ElementKind.ENUM_CONSTANT,
         ElementKind.FUNCTION,
diff --git a/pkg/analysis_server/test/src/lsp/test_all.dart b/pkg/analysis_server/test/src/lsp/test_all.dart
new file mode 100644
index 0000000..fa29bbd
--- /dev/null
+++ b/pkg/analysis_server/test/src/lsp/test_all.dart
@@ -0,0 +1,13 @@
+// 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:test_reflective_loader/test_reflective_loader.dart';
+
+import 'lsp_packet_transformer_test.dart' as lsp_packet_transformer;
+
+main() {
+  defineReflectiveSuite(() {
+    lsp_packet_transformer.main();
+  }, name: 'lsp');
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart
new file mode 100644
index 0000000..f796f39
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_enum_case_clauses_test.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddMissingEnumCaseClausesTest);
+  });
+}
+
+@reflectiveTest
+class AddMissingEnumCaseClausesTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_MISSING_ENUM_CASE_CLAUSES;
+
+  Future<void> assertHasFixWithFilter(String expected) async {
+    bool noError = true;
+    await assertHasFix(expected, errorFilter: (error) {
+      if (noError &&
+          error.errorCode ==
+              StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH) {
+        noError = false;
+        return true;
+      }
+      return false;
+    });
+  }
+
+  test_empty() async {
+    await resolveTestUnit('''
+enum E {a, b, c}
+void f(E e) {
+  switch (e) {
+  }
+}
+''');
+    await assertHasFixWithFilter('''
+enum E {a, b, c}
+void f(E e) {
+  switch (e) {
+    case E.a:
+      // TODO: Handle this case.
+      break;
+    case E.b:
+      // TODO: Handle this case.
+      break;
+    case E.c:
+      // TODO: Handle this case.
+      break;
+  }
+}
+''');
+  }
+
+  test_nonEmpty() async {
+    await resolveTestUnit('''
+enum E {a, b, c}
+void f(E e) {
+  switch (e) {
+    case E.a:
+      break;
+  }
+}
+''');
+    await assertHasFixWithFilter('''
+enum E {a, b, c}
+void f(E e) {
+  switch (e) {
+    case E.a:
+      break;
+    case E.b:
+      // TODO: Handle this case.
+      break;
+    case E.c:
+      // TODO: Handle this case.
+      break;
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 9e4fffb..e9ea84e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -8,6 +8,8 @@
 import 'add_await_test.dart' as add_await;
 import 'add_explicit_cast_test.dart' as add_explicit_cast;
 import 'add_field_formal_parameters_test.dart' as add_field_formal_parameters;
+import 'add_missing_enum_case_clauses_test.dart'
+    as add_missing_enum_case_clauses;
 import 'add_missing_parameter_named_test.dart' as add_missing_parameter_named;
 import 'add_missing_parameter_positional_test.dart'
     as add_missing_parameter_positional;
@@ -21,6 +23,7 @@
 import 'add_static_test.dart' as add_static;
 import 'add_super_constructor_invocation_test.dart'
     as add_super_constructor_invocation;
+import 'change_argument_name_test.dart' as change_argument_name;
 import 'change_to_nearest_precise_value_test.dart'
     as change_to_nearest_precise_value;
 import 'change_to_static_access_test.dart' as change_to_static_access;
@@ -109,6 +112,7 @@
     add_await.main();
     add_explicit_cast.main();
     add_field_formal_parameters.main();
+    add_missing_enum_case_clauses.main();
     add_missing_parameter_named.main();
     add_missing_parameter_positional.main();
     add_missing_parameter_required.main();
@@ -118,6 +122,7 @@
     add_required.main();
     add_static.main();
     add_super_constructor_invocation.main();
+    change_argument_name.main();
     change_to.main();
     change_to_nearest_precise_value.main();
     change_to_static_access.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart b/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
index 4b957b3..33223ec 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -23,6 +24,21 @@
     await testUpdate(from: 'any', to: '^2.1.0');
   }
 
+  test_asInConstContext() async {
+    createAnalysisOptionsFile(experiments: [EnableString.constant_update_2018]);
+    await testUpdate(content: '''
+const dynamic a = 2;
+const c = a as int;
+''', to: '^2.2.2');
+  }
+
+  test_boolOperator() async {
+    createAnalysisOptionsFile(experiments: [EnableString.constant_update_2018]);
+    await testUpdate(content: '''
+const c = true & false;
+''', to: '^2.2.2');
+  }
+
   test_caret() async {
     await testUpdate(from: '^2.0.0', to: '^2.1.0');
   }
@@ -31,6 +47,16 @@
     await testUpdate(from: "'>=2.0.0 <3.0.0'", to: "'>=2.1.0 <3.0.0'");
   }
 
+  test_eqEqOperatorInConstContext() async {
+    await testUpdate(content: '''
+class A {
+  const A();
+}
+const a = A();
+const c = a == null;
+''', to: '^2.2.2');
+  }
+
   test_gt() async {
     await testUpdate(from: "'>2.0.0'", to: "'>=2.1.0'");
   }
@@ -39,12 +65,36 @@
     await testUpdate(from: "'>=2.0.0'", to: "'>=2.1.0'");
   }
 
-  testUpdate({String from, String to}) async {
+  test_gtGtGtOperator() async {
+    createAnalysisOptionsFile(experiments: [EnableString.triple_shift]);
+    await testUpdate(content: '''
+class C {
+  C operator >>>(C other) => this;
+}
+''', to: '^2.2.2');
+  }
+
+  test_isInConstContext() async {
+    createAnalysisOptionsFile(experiments: [EnableString.constant_update_2018]);
+    await testUpdate(content: '''
+const a = 0;
+const c = a is int;
+''', to: '^2.2.2');
+  }
+
+  test_setLiteral() async {
+    await testUpdate(content: '''
+var s = <int>{};
+''', to: '^2.2.0');
+  }
+
+  testUpdate({String content, String from: '^2.0.0', String to}) async {
     updateTestPubspecFile('''
 environment:
   sdk: $from
 ''');
-    await resolveTestUnit('''
+    await resolveTestUnit(content ??
+        '''
 Future<int> zero() async => 0;
 ''');
     await assertHasFix('''
diff --git a/pkg/analysis_server/test/src/test_all.dart b/pkg/analysis_server/test/src/test_all.dart
index 51ad9b3..86eb450 100644
--- a/pkg/analysis_server/test/src/test_all.dart
+++ b/pkg/analysis_server/test/src/test_all.dart
@@ -4,29 +4,31 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'computer/test_all.dart' as computer_all;
-import 'domain_abstract_test.dart' as domain_abstract_test;
-import 'domains/test_all.dart' as domains_all;
-import 'flutter/test_all.dart' as flutter_all;
-import 'nullability/test_all.dart' as nullability_all;
-import 'plugin/test_all.dart' as plugin_all;
-import 'services/test_all.dart' as services_all;
-import 'utilities/test_all.dart' as utilities_all;
-import 'watch_manager_test.dart' as watch_manager_test;
+import 'computer/test_all.dart' as computer;
+import 'domain_abstract_test.dart' as domain_abstract;
+import 'domains/test_all.dart' as domains;
+import 'flutter/test_all.dart' as flutter;
+import 'lsp/test_all.dart' as lsp;
+import 'nullability/test_all.dart' as nullability;
+import 'plugin/test_all.dart' as plugin;
+import 'services/test_all.dart' as services;
+import 'utilities/test_all.dart' as utilities;
+import 'watch_manager_test.dart' as watch_manager;
 
 /**
  * Utility for manually running all tests.
  */
 main() {
   defineReflectiveSuite(() {
-    computer_all.main();
-    domain_abstract_test.main();
-    domains_all.main();
-    flutter_all.main();
-    nullability_all.main();
-    plugin_all.main();
-    services_all.main();
-    utilities_all.main();
-    watch_manager_test.main();
+    computer.main();
+    domain_abstract.main();
+    domains.main();
+    flutter.main();
+    lsp.main();
+    nullability.main();
+    plugin.main();
+    services.main();
+    utilities.main();
+    watch_manager.main();
   }, name: 'src');
 }
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index e26c43d..9d87caa 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -5,50 +5,55 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../tool/spec/check_all_test.dart' as check_spec;
-import 'analysis/test_all.dart' as analysis_all;
-import 'analysis_server_test.dart' as analysis_server_test;
-import 'channel/test_all.dart' as channel_test;
-import 'completion_test.dart' as completion_test;
-import 'context_manager_test.dart' as context_manager_test;
-import 'domain_analysis_test.dart' as domain_analysis_test;
-import 'domain_completion_test.dart' as domain_completion_test;
-import 'domain_diagnostic_test.dart' as domain_experimental_test;
-import 'domain_edit_dartfix_test.dart' as domain_edit_dartfix_test;
-import 'domain_execution_test.dart' as domain_execution_test;
-import 'domain_server_test.dart' as domain_server_test;
-import 'edit/test_all.dart' as edit_all;
-import 'plugin/test_all.dart' as plugin_all;
-import 'protocol_server_test.dart' as protocol_server_test;
-import 'protocol_test.dart' as protocol_test;
-import 'search/test_all.dart' as search_all;
-import 'services/test_all.dart' as services_all;
-import 'socket_server_test.dart' as socket_server_test;
-import 'src/test_all.dart' as src_all;
+import 'analysis/test_all.dart' as analysis;
+import 'analysis_server_test.dart' as analysis_server;
+import 'benchmarks_test.dart' as benchmarks;
+import 'channel/test_all.dart' as channel;
+import 'completion_test.dart' as completion;
+import 'context_manager_test.dart' as context_manager;
+import 'domain_analysis_test.dart' as domain_analysis;
+import 'domain_completion_test.dart' as domain_completion;
+import 'domain_diagnostic_test.dart' as domain_experimental;
+import 'domain_edit_dartfix_test.dart' as domain_edit_dartfix;
+import 'domain_execution_test.dart' as domain_execution;
+import 'domain_server_test.dart' as domain_server;
+import 'edit/test_all.dart' as edit;
+import 'lsp/test_all.dart' as lsp;
+import 'plugin/test_all.dart' as plugin;
+import 'protocol_server_test.dart' as protocol_server;
+import 'protocol_test.dart' as protocol;
+import 'search/test_all.dart' as search;
+import 'services/test_all.dart' as services;
+import 'socket_server_test.dart' as socket_server;
+import 'src/test_all.dart' as src;
+import 'tool/test_all.dart' as tool;
+import 'verify_tests_test.dart' as verify_tests;
 
-/**
- * Utility for manually running all tests.
- */
 main() {
   defineReflectiveSuite(() {
-    analysis_all.main();
-    analysis_server_test.main();
-    channel_test.main();
-    completion_test.main();
-    context_manager_test.main();
-    domain_analysis_test.main();
-    domain_completion_test.main();
-    domain_edit_dartfix_test.main();
-    domain_execution_test.main();
-    domain_experimental_test.main();
-    domain_server_test.main();
-    edit_all.main();
-    plugin_all.main();
-    protocol_server_test.main();
-    protocol_test.main();
-    search_all.main();
-    services_all.main();
-    socket_server_test.main();
-    src_all.main();
+    analysis.main();
+    analysis_server.main();
+    benchmarks.main();
+    channel.main();
+    completion.main();
+    context_manager.main();
+    domain_analysis.main();
+    domain_completion.main();
+    domain_edit_dartfix.main();
+    domain_execution.main();
+    domain_experimental.main();
+    domain_server.main();
+    edit.main();
+    lsp.main();
+    plugin.main();
+    protocol_server.main();
+    protocol.main();
+    search.main();
+    services.main();
+    socket_server.main();
+    src.main();
+    tool.main();
+    verify_tests.main();
     defineReflectiveSuite(() {
       defineReflectiveTests(SpecTest);
     }, name: 'spec');
diff --git a/pkg/analysis_server/test/tool/test_all.dart b/pkg/analysis_server/test/tool/test_all.dart
new file mode 100644
index 0000000..8f79e7d
--- /dev/null
+++ b/pkg/analysis_server/test/tool/test_all.dart
@@ -0,0 +1,13 @@
+// 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:test_reflective_loader/test_reflective_loader.dart';
+
+import 'lsp_spec/test_all.dart' as lsp_spec;
+
+main() {
+  defineReflectiveSuite(() {
+    lsp_spec.main();
+  }, name: 'tool');
+}
diff --git a/pkg/analysis_server/test/verify_tests_test.dart b/pkg/analysis_server/test/verify_tests_test.dart
new file mode 100644
index 0000000..4373181
--- /dev/null
+++ b/pkg/analysis_server/test/verify_tests_test.dart
@@ -0,0 +1,84 @@
+// 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/analysis_context.dart';
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:front_end/src/testing/package_root.dart' as package_root;
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+
+main() {
+  PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
+  String packageRoot = provider.pathContext.normalize(package_root.packageRoot);
+  String analysisServerPath =
+      provider.pathContext.join(packageRoot, 'analysis_server');
+  String testDirPath = provider.pathContext.join(analysisServerPath, 'test');
+
+  AnalysisContextCollection collection = new AnalysisContextCollection(
+      includedPaths: <String>[testDirPath], resourceProvider: provider);
+  List<AnalysisContext> contexts = collection.contexts;
+  if (contexts.length != 1) {
+    fail('The test directory contains multiple analysis contexts.');
+  }
+
+  buildTestsIn(
+      contexts[0].currentSession, testDirPath, provider.getFolder(testDirPath));
+}
+
+void buildTestsIn(
+    AnalysisSession session, String testDirPath, Folder directory) {
+  List<String> testFileNames = [];
+  File testAllFile;
+  List<Resource> children = directory.getChildren();
+  children.sort((first, second) => first.shortName.compareTo(second.shortName));
+  for (Resource child in children) {
+    if (child is Folder) {
+      if (child.shortName != 'integration' &&
+          child.getChildAssumingFile('test_all.dart').exists) {
+        testFileNames.add('${child.shortName}/test_all.dart');
+      }
+      buildTestsIn(session, testDirPath, child);
+    } else if (child is File) {
+      String name = child.shortName;
+      if (name == 'test_all.dart') {
+        testAllFile = child;
+      } else if (name.endsWith('_test.dart')) {
+        testFileNames.add(name);
+      }
+    }
+  }
+  String relativePath = path.relative(directory.path, from: testDirPath);
+  test(relativePath, () {
+    if (testFileNames.isEmpty) {
+      return;
+    }
+    if (testAllFile == null) {
+      fail('Missing "test_all.dart" in $relativePath');
+    }
+    ParsedUnitResult result = session.getParsedUnit(testAllFile.path);
+    if (result.state != ResultState.VALID) {
+      fail('Could not parse ${testAllFile.path}');
+    }
+    List<String> importedFiles = [];
+    for (var directive in result.unit.directives) {
+      if (directive is ImportDirective) {
+        importedFiles.add(directive.uri.stringValue);
+      }
+    }
+    List<String> missingFiles = [];
+    for (String testFileName in testFileNames) {
+      if (!importedFiles.contains(testFileName)) {
+        missingFiles.add(testFileName);
+      }
+    }
+    if (missingFiles.isNotEmpty) {
+      fail('Tests missing from "test_all.dart": ${missingFiles.join(', ')}');
+    }
+  });
+}
diff --git a/pkg/analysis_server/tool/spec/check_all_test.dart b/pkg/analysis_server/tool/spec/check_all_test.dart
index 1388652..e37d58f 100644
--- a/pkg/analysis_server/tool/spec/check_all_test.dart
+++ b/pkg/analysis_server/tool/spec/check_all_test.dart
@@ -19,5 +19,5 @@
   int index = components.indexOf('analysis_server');
   String pkgPath = joinAll(components.sublist(0, index + 1));
   await GeneratedContent.checkAll(
-      pkgPath, join('tool', 'spec', 'generate_all.dart'), allTargets);
+      pkgPath, join(pkgPath, 'tool', 'spec', 'generate_all.dart'), allTargets);
 }
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisError.java b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisError.java
index d4affbc..6bb4c35 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/AnalysisError.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/AnalysisError.java
@@ -69,6 +69,11 @@
   private final String code;
 
   /**
+   * The URL of a page containing documentation associated with this error.
+   */
+  private final String url;
+
+  /**
    * A hint to indicate to interested clients that this error has an associated fix (or fixes). The
    * absence of this field implies there are not known to be fixes. Note that since the operation to
    * calculate whether fixes apply needs to be performant it is possible that complicated tests will
@@ -82,13 +87,14 @@
   /**
    * Constructor for {@link AnalysisError}.
    */
-  public AnalysisError(String severity, String type, Location location, String message, String correction, String code, Boolean hasFix) {
+  public AnalysisError(String severity, String type, Location location, String message, String correction, String code, String url, Boolean hasFix) {
     this.severity = severity;
     this.type = type;
     this.location = location;
     this.message = message;
     this.correction = correction;
     this.code = code;
+    this.url = url;
     this.hasFix = hasFix;
   }
 
@@ -103,6 +109,7 @@
         ObjectUtilities.equals(other.message, message) &&
         ObjectUtilities.equals(other.correction, correction) &&
         ObjectUtilities.equals(other.code, code) &&
+        ObjectUtilities.equals(other.url, url) &&
         ObjectUtilities.equals(other.hasFix, hasFix);
     }
     return false;
@@ -115,8 +122,9 @@
     String message = jsonObject.get("message").getAsString();
     String correction = jsonObject.get("correction") == null ? null : jsonObject.get("correction").getAsString();
     String code = jsonObject.get("code").getAsString();
+    String url = jsonObject.get("url") == null ? null : jsonObject.get("url").getAsString();
     Boolean hasFix = jsonObject.get("hasFix") == null ? null : jsonObject.get("hasFix").getAsBoolean();
-    return new AnalysisError(severity, type, location, message, correction, code, hasFix);
+    return new AnalysisError(severity, type, location, message, correction, code, url, hasFix);
   }
 
   public static List<AnalysisError> fromJsonArray(JsonArray jsonArray) {
@@ -189,6 +197,13 @@
     return type;
   }
 
+  /**
+   * The URL of a page containing documentation associated with this error.
+   */
+  public String getUrl() {
+    return url;
+  }
+
   @Override
   public int hashCode() {
     HashCodeBuilder builder = new HashCodeBuilder();
@@ -198,6 +213,7 @@
     builder.append(message);
     builder.append(correction);
     builder.append(code);
+    builder.append(url);
     builder.append(hasFix);
     return builder.toHashCode();
   }
@@ -212,6 +228,9 @@
       jsonObject.addProperty("correction", correction);
     }
     jsonObject.addProperty("code", code);
+    if (url != null) {
+      jsonObject.addProperty("url", url);
+    }
     if (hasFix != null) {
       jsonObject.addProperty("hasFix", hasFix);
     }
@@ -234,6 +253,8 @@
     builder.append(correction + ", ");
     builder.append("code=");
     builder.append(code + ", ");
+    builder.append("url=");
+    builder.append(url + ", ");
     builder.append("hasFix=");
     builder.append(hasFix);
     builder.append("]");
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/TokenDetails.java b/pkg/analysis_server/tool/spec/generated/java/types/TokenDetails.java
index 6a27a41..183ba52 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/TokenDetails.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/TokenDetails.java
@@ -74,7 +74,7 @@
   public static TokenDetails fromJson(JsonObject jsonObject) {
     String lexeme = jsonObject.get("lexeme").getAsString();
     String type = jsonObject.get("type").getAsString();
-    List<String> validElementKinds = JsonUtilities.decodeStringList(jsonObject.get("validElementKinds").getAsJsonArray());
+    List<String> validElementKinds = jsonObject.get("validElementKinds") == null ? null : JsonUtilities.decodeStringList(jsonObject.get("validElementKinds").getAsJsonArray());
     return new TokenDetails(lexeme, type, validElementKinds);
   }
 
@@ -124,11 +124,13 @@
     JsonObject jsonObject = new JsonObject();
     jsonObject.addProperty("lexeme", lexeme);
     jsonObject.addProperty("type", type);
-    JsonArray jsonArrayValidElementKinds = new JsonArray();
-    for (String elt : validElementKinds) {
-      jsonArrayValidElementKinds.add(new JsonPrimitive(elt));
+    if (validElementKinds != null) {
+      JsonArray jsonArrayValidElementKinds = new JsonArray();
+      for (String elt : validElementKinds) {
+        jsonArrayValidElementKinds.add(new JsonPrimitive(elt));
+      }
+      jsonObject.add("validElementKinds", jsonArrayValidElementKinds);
     }
-    jsonObject.add("validElementKinds", jsonArrayValidElementKinds);
     return jsonObject;
   }
 
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 9948e9c..edbcba3 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -3901,9 +3901,9 @@
           The type of this token.
         </p>
       </field>
-      <field name="validElementKinds">
+      <field name="validElementKinds" optional="true">
         <list>
-          <ref>ElementKind</ref>
+          <ref>String</ref>
         </list>
         <p>
           The kinds of elements which could validly replace this token.
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
index 04b3cdc..b9d94ce 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -21542,7 +21542,7 @@
  * {
  *   "lexeme": String
  *   "type": String
- *   "validElementKinds": List<ElementKind>
+ *   "validElementKinds": optional List<String>
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -21552,7 +21552,7 @@
 
   String _type;
 
-  List<ElementKind> _validElementKinds;
+  List<String> _validElementKinds;
 
   /**
    * The raw token text.
@@ -21583,18 +21583,16 @@
   /**
    * The kinds of elements which could validly replace this token.
    */
-  List<ElementKind> get validElementKinds => _validElementKinds;
+  List<String> get validElementKinds => _validElementKinds;
 
   /**
    * The kinds of elements which could validly replace this token.
    */
-  void set validElementKinds(List<ElementKind> value) {
-    assert(value != null);
+  void set validElementKinds(List<String> value) {
     this._validElementKinds = value;
   }
 
-  TokenDetails(
-      String lexeme, String type, List<ElementKind> validElementKinds) {
+  TokenDetails(String lexeme, String type, {List<String> validElementKinds}) {
     this.lexeme = lexeme;
     this.type = type;
     this.validElementKinds = validElementKinds;
@@ -21618,17 +21616,15 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, "type");
       }
-      List<ElementKind> validElementKinds;
+      List<String> validElementKinds;
       if (json.containsKey("validElementKinds")) {
         validElementKinds = jsonDecoder.decodeList(
             jsonPath + ".validElementKinds",
             json["validElementKinds"],
-            (String jsonPath, Object json) =>
-                new ElementKind.fromJson(jsonDecoder, jsonPath, json));
-      } else {
-        throw jsonDecoder.mismatch(jsonPath, "validElementKinds");
+            jsonDecoder.decodeString);
       }
-      return new TokenDetails(lexeme, type, validElementKinds);
+      return new TokenDetails(lexeme, type,
+          validElementKinds: validElementKinds);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "TokenDetails", json);
     }
@@ -21639,8 +21635,9 @@
     Map<String, dynamic> result = {};
     result["lexeme"] = lexeme;
     result["type"] = type;
-    result["validElementKinds"] =
-        validElementKinds.map((ElementKind value) => value.toJson()).toList();
+    if (validElementKinds != null) {
+      result["validElementKinds"] = validElementKinds;
+    }
     return result;
   }
 
@@ -21653,7 +21650,7 @@
       return lexeme == other.lexeme &&
           type == other.type &&
           listEqual(validElementKinds, other.validElementKinds,
-              (ElementKind a, ElementKind b) => a == b);
+              (String a, String b) => a == b);
     }
     return false;
   }
diff --git a/pkg/analysis_tool/lib/tools.dart b/pkg/analysis_tool/lib/tools.dart
index 0e35b61..74dd816 100644
--- a/pkg/analysis_tool/lib/tools.dart
+++ b/pkg/analysis_tool/lib/tools.dart
@@ -313,14 +313,15 @@
    * out a message instructing the user to regenerate them, and exit with a
    * nonzero error code.
    *
-   * [pkgPath] is the path to the current package.  [generatorRelPath] is the
-   * path to a .dart script the user may use to regenerate the targets.
+   * [pkgPath] is the path to the current package.  [generatorPath] is the path
+   * to a .dart script the user may use to regenerate the targets.
    *
-   * To avoid mistakes when run on Windows, [generatorRelPath] always uses
+   * To avoid mistakes when run on Windows, [generatorPath] always uses
    * POSIX directory separators.
    */
-  static Future<void> checkAll(String pkgPath, String generatorRelPath,
-      Iterable<GeneratedContent> targets) async {
+  static Future<void> checkAll(
+      String pkgPath, String generatorPath, Iterable<GeneratedContent> targets,
+      {List<String> args = const []}) async {
     bool generateNeeded = false;
     for (GeneratedContent target in targets) {
       bool ok = await target.check(pkgPath);
@@ -339,9 +340,8 @@
         // ignore: deprecated_member_use
         packageRoot = ' --package-root=${Platform.packageRoot}';
       }
-      String generateScript =
-          join(pkgPath, joinAll(posix.split(generatorRelPath)));
-      print('  $executable$packageRoot $generateScript');
+      String generateScript = normalize(joinAll(posix.split(generatorPath)));
+      print('  $executable$packageRoot $generateScript ${args.join(" ")}');
       exit(1);
     } else {
       print('All generated files up to date.');
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index e376b96..e30b6cf 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,38 @@
+## 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/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
index 3516414..3806ad9 100644
--- a/pkg/analyzer/lib/analyzer.dart
+++ b/pkg/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.
 
diff --git a/pkg/analyzer/lib/context/context_root.dart b/pkg/analyzer/lib/context/context_root.dart
index 7625503..df4a4b4 100644
--- a/pkg/analyzer/lib/context/context_root.dart
+++ b/pkg/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/pkg/analyzer/lib/context/declared_variables.dart b/pkg/analyzer/lib/context/declared_variables.dart
index c0d7fdf..74dc187 100644
--- a/pkg/analyzer/lib/context/declared_variables.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/analysis/analysis_context.dart b/pkg/analyzer/lib/dart/analysis/analysis_context.dart
index e24bfc8..6c3728f 100644
--- a/pkg/analyzer/lib/dart/analysis/analysis_context.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/analysis/context_builder.dart b/pkg/analyzer/lib/dart/analysis/context_builder.dart
index f99dce5..08cbd34 100644
--- a/pkg/analyzer/lib/dart/analysis/context_builder.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/analysis/context_locator.dart b/pkg/analyzer/lib/dart/analysis/context_locator.dart
index ce4d07a..d2c4cd3 100644
--- a/pkg/analyzer/lib/dart/analysis/context_locator.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/analysis/context_root.dart b/pkg/analyzer/lib/dart/analysis/context_root.dart
index a8998fe..ccb15b5 100644
--- a/pkg/analyzer/lib/dart/analysis/context_root.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/analysis/declared_variables.dart b/pkg/analyzer/lib/dart/analysis/declared_variables.dart
index a517582..bcd0d74 100644
--- a/pkg/analyzer/lib/dart/analysis/declared_variables.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/analysis/uri_converter.dart b/pkg/analyzer/lib/dart/analysis/uri_converter.dart
index ec1ed8d..a93d045 100644
--- a/pkg/analyzer/lib/dart/analysis/uri_converter.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index b2ce8fa..3e5b2fa 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -507,9 +507,6 @@
 
   R visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node);
 
-  @Deprecated('Replaced by visitForStatement2')
-  R visitForEachStatement(ForEachStatement node);
-
   R visitForElement(ForElement node);
 
   R visitFormalParameterList(FormalParameterList node);
@@ -518,9 +515,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 +568,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 +609,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);
@@ -1983,14 +1965,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 +2220,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.
@@ -2511,78 +2435,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 +2452,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 +2473,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 +3567,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 +3587,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 +3601,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 +4426,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 +4444,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.
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index b057147..ab5ef3d 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.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.
 
@@ -7,45 +7,33 @@
 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 +42,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 +53,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 +105,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 +127,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,19 +146,15 @@
       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.
   CompilationUnit compilationUnit(
       Token beginToken,
       ScriptTag scriptTag,
@@ -204,9 +162,7 @@
       List<CompilationUnitMember> declarations,
       Token endToken);
 
-  /**
-   * Returns a newly created conditional expression.
-   */
+  /// Returns a newly created conditional expression.
   ConditionalExpression conditionalExpression(
       Expression condition,
       Token question,
@@ -214,9 +170,7 @@
       Token colon,
       Expression elseExpression);
 
-  /**
-   * Returns a newly created configuration.
-   */
+  /// Returns a newly created configuration.
   Configuration configuration(
       Token ifKeyword,
       Token leftParenthesis,
@@ -226,21 +180,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 +208,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 +218,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 +239,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 +259,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 +294,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 +307,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 +342,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,15 +363,13 @@
       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,
@@ -474,23 +382,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 +401,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 +411,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 +419,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 +427,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 +436,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 +461,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 +488,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,12 +503,10 @@
       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,
@@ -626,9 +516,7 @@
       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 +524,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 +538,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 +553,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 +564,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 +586,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 +663,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 +672,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 +685,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 +729,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 +774,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,12 +792,10 @@
       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,
@@ -1054,61 +804,43 @@
       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 +850,60 @@
       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'.
   VariableDeclarationList variableDeclarationList(
       Comment comment,
       List<Annotation> metadata,
@@ -1201,27 +911,19 @@
       TypeAnnotation type,
       List<VariableDeclaration> variables);
 
-  /**
-   * Returns a newly created variable declaration statement.
-   */
+  /// 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/pkg/analyzer/lib/dart/ast/precedence.dart b/pkg/analyzer/lib/dart/ast/precedence.dart
index a5480d5..aaed019 100644
--- a/pkg/analyzer/lib/dart/ast/precedence.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/ast/resolution_map.dart b/pkg/analyzer/lib/dart/ast/resolution_map.dart
index 3762587..83a4820 100644
--- a/pkg/analyzer/lib/dart/ast/resolution_map.dart
+++ b/pkg/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,259 @@
 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.
 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/pkg/analyzer/lib/dart/ast/standard_ast_factory.dart b/pkg/analyzer/lib/dart/ast/standard_ast_factory.dart
index 9333242..acb1366 100644
--- a/pkg/analyzer/lib/dart/ast/standard_ast_factory.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/ast/standard_resolution_map.dart b/pkg/analyzer/lib/dart/ast/standard_resolution_map.dart
index c778063..3353e19 100644
--- a/pkg/analyzer/lib/dart/ast/standard_resolution_map.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/ast/token.dart b/pkg/analyzer/lib/dart/ast/token.dart
index 55874de..4262a60 100644
--- a/pkg/analyzer/lib/dart/ast/token.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index ac55621..6646631 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/constant/value.dart b/pkg/analyzer/lib/dart/constant/value.dart
index 64a29c6..7799cc5 100644
--- a/pkg/analyzer/lib/dart/constant/value.dart
+++ b/pkg/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/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index c4beb80..7c752c2 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -1,141 +1,108 @@
-// 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.
   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 +115,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 +281,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 +551,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/pkg/analyzer/lib/dart/element/visitor.dart b/pkg/analyzer/lib/dart/element/visitor.dart
index fa3fa79..fc6d4a6 100644
--- a/pkg/analyzer/lib/dart/element/visitor.dart
+++ b/pkg/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/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index a4ba3c5..c5b2489 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -59,10 +59,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 +67,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 +74,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 +83,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,
@@ -129,6 +122,8 @@
   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,7 +168,6 @@
   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,
@@ -226,8 +220,10 @@
   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,
@@ -333,6 +329,13 @@
   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_SET_LITERAL,
+  HintCode.SDK_VERSION_UI_AS_CODE,
   HintCode.STRICT_RAW_TYPE,
   HintCode.SUBTYPE_OF_SEALED_CLASS,
   HintCode.TYPE_CHECK_IS_NOT_NULL,
@@ -352,9 +355,6 @@
   HintCode.UNUSED_LABEL,
   HintCode.UNUSED_LOCAL_VARIABLE,
   HintCode.UNUSED_SHOWN_NAME,
-  HtmlErrorCode.PARSE_ERROR,
-  HtmlWarningCode.INVALID_URI,
-  HtmlWarningCode.URI_DOES_NOT_EXIST,
   ParserErrorCode.ABSTRACT_CLASS_MEMBER,
   ParserErrorCode.ABSTRACT_ENUM,
   ParserErrorCode.ABSTRACT_STATIC_METHOD,
@@ -521,8 +521,10 @@
   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,
@@ -539,7 +541,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,
@@ -602,8 +603,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,
@@ -615,15 +614,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,
@@ -694,10 +688,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,
@@ -705,7 +697,6 @@
   StrongModeCode.TOP_LEVEL_IDENTIFIER_NO_TYPE,
   StrongModeCode.TOP_LEVEL_INSTANCE_GETTER,
   StrongModeCode.TOP_LEVEL_INSTANCE_METHOD,
-  StrongModeCode.TOP_LEVEL_UNSUPPORTED,
   TodoCode.TODO,
 ];
 
diff --git a/pkg/analyzer/lib/instrumentation/instrumentation.dart b/pkg/analyzer/lib/instrumentation/instrumentation.dart
index dc04bf5..e593f13 100644
--- a/pkg/analyzer/lib/instrumentation/instrumentation.dart
+++ b/pkg/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/pkg/analyzer/lib/plugin/embedded_resolver_provider.dart b/pkg/analyzer/lib/plugin/embedded_resolver_provider.dart
index 217ab7f..e16bc00 100644
--- a/pkg/analyzer/lib/plugin/embedded_resolver_provider.dart
+++ b/pkg/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/pkg/analyzer/lib/plugin/resolver_provider.dart b/pkg/analyzer/lib/plugin/resolver_provider.dart
index 3c22554..40567da 100644
--- a/pkg/analyzer/lib/plugin/resolver_provider.dart
+++ b/pkg/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/pkg/analyzer/lib/source/analysis_options_provider.dart b/pkg/analyzer/lib/source/analysis_options_provider.dart
index 939f634..a35bfbc 100644
--- a/pkg/analyzer/lib/source/analysis_options_provider.dart
+++ b/pkg/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/pkg/analyzer/lib/source/custom_resolver.dart b/pkg/analyzer/lib/source/custom_resolver.dart
index 8dfe9f9..2569313 100644
--- a/pkg/analyzer/lib/source/custom_resolver.dart
+++ b/pkg/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/pkg/analyzer/lib/source/embedder.dart b/pkg/analyzer/lib/source/embedder.dart
index dfd679f..a1af355 100644
--- a/pkg/analyzer/lib/source/embedder.dart
+++ b/pkg/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/pkg/analyzer/lib/source/error_processor.dart b/pkg/analyzer/lib/source/error_processor.dart
index 3391264..f2efaba 100644
--- a/pkg/analyzer/lib/source/error_processor.dart
+++ b/pkg/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/pkg/analyzer/lib/source/line_info.dart b/pkg/analyzer/lib/source/line_info.dart
index 5d5be56..5413ae4 100644
--- a/pkg/analyzer/lib/source/line_info.dart
+++ b/pkg/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/pkg/analyzer/lib/source/package_map_provider.dart b/pkg/analyzer/lib/source/package_map_provider.dart
index f3c2119..2c33ab5 100644
--- a/pkg/analyzer/lib/source/package_map_provider.dart
+++ b/pkg/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/pkg/analyzer/lib/source/package_map_resolver.dart b/pkg/analyzer/lib/source/package_map_resolver.dart
index 6a1d230..cf65834 100644
--- a/pkg/analyzer/lib/source/package_map_resolver.dart
+++ b/pkg/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/pkg/analyzer/lib/source/path_filter.dart b/pkg/analyzer/lib/source/path_filter.dart
index ba5454e..26ecec2 100644
--- a/pkg/analyzer/lib/source/path_filter.dart
+++ b/pkg/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/pkg/analyzer/lib/source/sdk_ext.dart b/pkg/analyzer/lib/source/sdk_ext.dart
index 7f5557b..425553e 100644
--- a/pkg/analyzer/lib/source/sdk_ext.dart
+++ b/pkg/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/pkg/analyzer/lib/source/source_range.dart b/pkg/analyzer/lib/source/source_range.dart
index 338ad7a..b2d3069 100644
--- a/pkg/analyzer/lib/source/source_range.dart
+++ b/pkg/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/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
index 550f3e3..5d3e616 100644
--- a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
+++ b/pkg/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/pkg/analyzer/lib/src/context/cache.dart b/pkg/analyzer/lib/src/context/cache.dart
index a1834e2..65349a0 100644
--- a/pkg/analyzer/lib/src/context/cache.dart
+++ b/pkg/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/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index 95a75e7..418bb41 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/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.
 
@@ -82,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.
@@ -593,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/pkg/analyzer/lib/src/context/context_root.dart b/pkg/analyzer/lib/src/context/context_root.dart
index 744f298..a7da43e 100644
--- a/pkg/analyzer/lib/src/context/context_root.dart
+++ b/pkg/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/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index 70abd3dc..71abce1 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/analysis/byte_store.dart b/pkg/analyzer/lib/src/dart/analysis/byte_store.dart
index 80f7b32..6e7c301 100644
--- a/pkg/analyzer/lib/src/dart/analysis/byte_store.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/analysis/cache.dart b/pkg/analyzer/lib/src/dart/analysis/cache.dart
index 47a32a3..58a7253 100644
--- a/pkg/analyzer/lib/src/dart/analysis/cache.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/analysis/crc32.dart b/pkg/analyzer/lib/src/dart/analysis/crc32.dart
index 457712e..e571bfc 100644
--- a/pkg/analyzer/lib/src/dart/analysis/crc32.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/analysis/defined_names.dart b/pkg/analyzer/lib/src/dart/analysis/defined_names.dart
index 44baa00..4da5300 100644
--- a/pkg/analyzer/lib/src/dart/analysis/defined_names.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
index 4740d58..20859c2 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
+++ b/pkg/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.
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
index ef5022d..10baa3c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
index 482dc4b..5f16104 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
+++ b/pkg/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);
@@ -662,8 +662,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/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 3081077..463a9db 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/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 = 79;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
index 5bf37c7..4b86a47 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
@@ -52,6 +52,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';
 
@@ -94,6 +97,12 @@
         IsEnabledByDefault.set_literals,
         IsExpired.set_literals,
         'Set Literals'),
+    EnableString.triple_shift: const ExperimentalFeature(
+        4,
+        EnableString.triple_shift,
+        IsEnabledByDefault.triple_shift,
+        IsExpired.triple_shift,
+        'Triple-shift operator'),
     EnableString.bogus_disabled: const ExperimentalFeature(
         null,
         EnableString.bogus_disabled,
@@ -117,13 +126,15 @@
       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,
+          triple_shift ?? IsEnabledByDefault.triple_shift,
         ];
 
   /// Decodes the strings given in [flags] into a representation of the set of
@@ -157,6 +168,9 @@
   /// Current state for the flag "spread_collections"
   bool get spread_collections => _enableFlags[3];
 
+  /// Current state for the flag "triple_shift"
+  bool get triple_shift => _enableFlags[4];
+
   /// Queries whether the given [feature] is enabled or disabled.
   bool isEnabled(ExperimentalFeature feature) => feature.isExpired
       ? feature.isEnabledByDefault
@@ -185,6 +199,9 @@
   /// Default state of the experiment "spread-collections"
   static const bool spread_collections = false;
 
+  /// 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;
 
@@ -211,6 +228,9 @@
   /// Expiration status of the experiment "spread-collections"
   static const bool spread_collections = false;
 
+  /// 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/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 3e1a68a..536e53d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.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.
 
@@ -696,7 +696,7 @@
     ExperimentStatus experimentStatus = analysisOptions.experimentStatus;
     CharSequenceReader reader = new CharSequenceReader(content);
     Scanner scanner = new Scanner(source, reader, errorListener);
-    scanner.enableGtGtGt = experimentStatus.constant_update_2018;
+    scanner.enableGtGtGt = experimentStatus.triple_shift;
     Token token = PerformanceStatistics.scan.makeCurrentWhile(() {
       return scanner.tokenize();
     });
@@ -709,6 +709,7 @@
     parser.enableSpreadCollections = experimentStatus.spread_collections;
     parser.enableControlFlowCollections =
         experimentStatus.control_flow_collections;
+    parser.enableTripleShift = experimentStatus.triple_shift;
     CompilationUnit unit = parser.parseCompilationUnit(token);
     unit.lineInfo = lineInfo;
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
index 1e34697..363b777 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/analysis/fletcher16.dart b/pkg/analyzer/lib/src/dart/analysis/fletcher16.dart
index 8eb3e2e..46f3ae6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/fletcher16.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index ac79c40..61b116e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 7a4b3d0..abea6f05 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -345,6 +345,7 @@
     CodeChecker checker = new CodeChecker(
       _typeProvider,
       _context.typeSystem,
+      _inheritance,
       errorListener,
       _analysisOptions,
     );
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index 2b3f303..0be1dab 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/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.
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_graph.dart b/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
index 74cb08c..7b0bcaf 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
+++ b/pkg/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.
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/performance_logger.dart b/pkg/analyzer/lib/src/dart/analysis/performance_logger.dart
index 47af4cd..6c265db 100644
--- a/pkg/analyzer/lib/src/dart/analysis/performance_logger.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart b/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
index 9148fef..ab09542 100644
--- a/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/analysis/top_level_declaration.dart b/pkg/analyzer/lib/src/dart/analysis/top_level_declaration.dart
index b32e636..1658aad 100644
--- a/pkg/analyzer/lib/src/dart/analysis/top_level_declaration.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 8dfa18b..72796b5 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -443,13 +443,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 +692,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 +914,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 +979,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 +1263,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;
@@ -2283,13 +2258,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 +2408,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 +3011,6 @@
   }
 
   @override
-  ParameterElement get declaredElement => _parameter.declaredElement;
-
-  @override
   Token get beginToken => _parameter.beginToken;
 
   @override
@@ -3055,6 +3021,9 @@
   Token get covariantKeyword => null;
 
   @override
+  ParameterElement get declaredElement => _parameter.declaredElement;
+
+  @override
   Expression get defaultValue => _defaultValue;
 
   @override
@@ -3699,6 +3668,10 @@
   @override
   bool get isAssignable => false;
 
+  @Deprecated('Use precedence')
+  @override
+  Precedence get precedence2 => precedence;
+
   @deprecated
   @override
   ParameterElement get propagatedParameterElement => null;
@@ -4171,107 +4144,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 {
@@ -4641,20 +4513,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 +4527,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 +4564,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 +4573,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 +4861,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 +4930,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
@@ -6002,13 +5773,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 +5944,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
@@ -6611,13 +6372,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 +6599,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 +6618,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 +6675,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 +6705,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 +6724,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 +6783,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 +7071,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 +7285,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);
@@ -8210,13 +7837,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 +8032,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 +8139,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 +8215,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 +8297,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 +8439,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 +8531,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 +8569,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 +8585,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
@@ -9274,13 +8806,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 +8871,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 +8914,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 +9360,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 +9626,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 +9677,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);
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index 3c4ba3e..2ce0985 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.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.
 
@@ -461,27 +461,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,
@@ -693,39 +701,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 +853,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,
diff --git a/pkg/analyzer/lib/src/dart/ast/constant_evaluator.dart b/pkg/analyzer/lib/src/dart/ast/constant_evaluator.dart
index a919a7f..430631f 100644
--- a/pkg/analyzer/lib/src/dart/ast/constant_evaluator.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/ast/resolution_map.dart b/pkg/analyzer/lib/src/dart/ast/resolution_map.dart
index 8d59a9e..3fa4ea4 100644
--- a/pkg/analyzer/lib/src/dart/ast/resolution_map.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index cb913fe..f9db9f8 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -490,6 +490,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 +527,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 +729,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 +867,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 +1618,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 +1657,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 +1887,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 +2068,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);
   }
 
@@ -2908,6 +2856,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 +2893,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 +3132,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 +3316,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 +4328,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 +4594,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 +4828,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 +5627,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 +5672,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 +5966,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 +5974,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 +6213,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 +6687,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;
@@ -7451,7 +7239,7 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement(ForStatement node) {
     if (node.awaitKeyword != null) {
       _writer.print('await ');
     }
@@ -7660,22 +7448,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 +7616,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 +7624,7 @@
     }
     _visitNode(node.typeArguments);
     _writer.print('{');
-    _visitNodeListWithSeparator(node.elements2, ', ');
+    _visitNodeListWithSeparator(node.elements, ', ');
     _writer.print('}');
   }
 
@@ -8725,7 +8495,7 @@
   }
 
   @override
-  void visitForStatement2(ForStatement2 node) {
+  void visitForStatement(ForStatement node) {
     if (node.awaitKeyword != null) {
       sink.write('await ');
     }
@@ -8934,22 +8704,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 +8872,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('}');
   }
 
@@ -9319,7 +9071,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 +9083,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/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index a8459c1..f3c1805 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -37,18 +37,9 @@
   /// 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;
-
   /// The current library that is being analyzed.
   final LibraryElement _currentLibrary;
 
@@ -62,10 +53,7 @@
       {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,
@@ -147,12 +135,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);
       }
     }
@@ -167,56 +154,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,
+            );
+          }
         }
       }
     }
@@ -417,6 +403,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.
@@ -450,26 +459,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);
       }
     }
   }
@@ -542,149 +545,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);
       }
@@ -695,19 +610,20 @@
 
       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;
-
       var conditionValue = verifier._validate(element.condition, errorCode);
       var conditionBool = conditionValue?.toBoolValue();
 
       // The errors have already been reported.
       if (conditionBool == null) return false;
 
+      verifier._reportErrorIfFromDeferredLibrary(
+          element.condition,
+          CompileTimeErrorCode
+              .NON_CONSTANT_IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY);
+
       var thenValid = true;
       var elseValid = true;
       if (conditionBool) {
@@ -726,11 +642,14 @@
     } else if (element is MapLiteralEntry) {
       return _validateMapLiteralEntry(element);
     } else if (element is SpreadElement) {
-      if (!isConst) return true;
-
       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);
       }
@@ -821,6 +740,15 @@
       }
     }
 
+    if (forSet) {
+      var iterableValue = listValue ?? setValue;
+      for (var item in iterableValue) {
+        if (!setUniqueValues.add(item)) {
+          setDuplicateExpressions.add(element.expression);
+        }
+      }
+    }
+
     return true;
   }
 
@@ -830,78 +758,60 @@
     var keyExpression = entry.key;
     var valueExpression = entry.value;
 
-    if (isConst) {
-      var keyValue = verifier._validate(
-        keyExpression,
-        CompileTimeErrorCode.NON_CONSTANT_MAP_KEY,
-      );
-      var valueValue = verifier._validate(
-        valueExpression,
-        CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE,
-      );
+    var keyValue = verifier._validate(
+      keyExpression,
+      CompileTimeErrorCode.NON_CONSTANT_MAP_KEY,
+    );
+    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 (verifier._implementsEqualsWhenNotAllowed(keyType)) {
+        verifier._errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
+          keyExpression,
+          [keyType],
+        );
+      }
+
+      verifier._reportErrorIfFromDeferredLibrary(
+        keyExpression,
+        CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY,
       );
 
-      if (keyValue != null) {
-        if (!mapUniqueKeys.add(keyValue)) {
-          mapDuplicateKeyElements.add(keyExpression);
-        }
+      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;
   }
 
@@ -919,7 +829,7 @@
         DartObjectImpl keyValue = entry.key;
         if (keyValue != null) {
           if (!mapUniqueKeys.add(keyValue)) {
-            mapDuplicateKeyElements.add(element.expression);
+            mapDuplicateKeyExpressions.add(element.expression);
           }
         }
       }
@@ -957,7 +867,7 @@
     );
 
     if (!setUniqueValues.add(value)) {
-      setDuplicateElements.add(expression);
+      setDuplicateExpressions.add(expression);
     }
 
     return true;
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index c4416ee..789609e 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/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';
@@ -918,6 +919,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);
   }
 
@@ -1213,8 +1218,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
@@ -1319,7 +1326,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) {
@@ -1448,7 +1455,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) {
@@ -1475,7 +1482,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) {
@@ -1757,6 +1764,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.
diff --git a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
index 5a48513..3d091bd 100644
--- a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
+++ b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
@@ -100,6 +100,13 @@
       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) {
@@ -133,6 +140,10 @@
       return _methodInvocation(node);
     }
 
+    if (node is NamedExpression) {
+      return collect(node.expression);
+    }
+
     if (node is BinaryExpression) {
       collect(node.leftOperand);
       collect(node.rightOperand);
@@ -214,10 +225,22 @@
         return;
       }
       if (element is MethodElement && element.isStatic) {
-        if (_isConstantTypeName(node.prefix)) {
+        if (!_isConstantTypeName(node.prefix)) {
+          nodes.add(node);
+        }
+        return;
+      }
+    }
+
+    if (element is ParameterElement) {
+      var enclosing = element.enclosingElement;
+      if (enclosing is ConstructorElement && enclosing.isConst) {
+        if (node.thisOrAncestorOfType<ConstructorInitializer>() != null) {
           return;
         }
       }
+      nodes.add(node);
+      return;
     }
 
     if (element is VariableElement) {
@@ -239,6 +262,9 @@
     if (element is FunctionElement) {
       return;
     }
+    if (element is MethodElement && element.isStatic) {
+      return;
+    }
     nodes.add(node);
   }
 
@@ -296,7 +322,7 @@
         }
       }
 
-      for (var element in node.elements2) {
+      for (var element in node.elements) {
         collect(element);
       }
       return;
@@ -322,7 +348,7 @@
         }
       }
 
-      for (var element in node.elements2) {
+      for (var element in node.elements) {
         collect(element);
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index 6e5f535..60cecdd 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index fcaa320..bb01428 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -2413,9 +2413,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;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 5cf726d..8cbeb21 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -519,6 +519,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedNode.codeLength;
+    }
     if (_unlinkedClass != null) {
       return _unlinkedClass.codeRange?.length;
     }
@@ -527,6 +530,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedNode.codeOffset;
+    }
     if (_unlinkedClass != null) {
       return _unlinkedClass.codeRange?.offset;
     }
@@ -546,7 +552,8 @@
     if (linkedNode != null) {
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@constructor');
-      if (linkedNode.kind == LinkedNodeKind.classDeclaration) {
+      if (linkedNode.kind == LinkedNodeKind.classDeclaration ||
+          linkedNode.kind == LinkedNodeKind.mixinDeclaration) {
         _constructors = linkedNode.classOrMixinDeclaration_members
             .where((node) => node.kind == LinkedNodeKind.constructorDeclaration)
             .map((node) {
@@ -584,16 +591,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].
@@ -1061,7 +1069,7 @@
     if (linkedNode != null) {
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@typeParameter');
-      var typeParameters = context.getTypeParameters(linkedNode);
+      var typeParameters = LinkedUnitContext.getTypeParameters(linkedNode);
       if (typeParameters == null) {
         return _typeParameterElements = const [];
       }
@@ -1780,7 +1788,9 @@
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@typeAlias');
       _typeAliases = linkedNode.compilationUnit_declarations
-          .where((node) => node.kind == LinkedNodeKind.functionTypeAlias)
+          .where((node) =>
+              node.kind == LinkedNodeKind.functionTypeAlias ||
+              node.kind == LinkedNodeKind.genericTypeAlias)
           .map((node) {
         var name = context.getUnitMemberName(node);
         var reference = containerRef.getChild(name);
@@ -1830,8 +1840,23 @@
 
   @override
   List<ClassElement> get mixins {
+    if (_mixins != null) return _mixins;
+
+    if (linkedNode != null) {
+      var context = enclosingUnit.linkedContext;
+      var containerRef = reference.getChild('@class');
+      return _mixins = linkedNode.compilationUnit_declarations
+          .where((node) => node.kind == LinkedNodeKind.mixinDeclaration)
+          .map((node) {
+        var name = context.getUnitMemberName(node);
+        var reference = containerRef.getChild(name);
+        reference.node = node;
+        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,10 +1934,12 @@
 
   @override
   List<ClassElement> get types {
+    if (_types != null) return _types;
+
     if (linkedNode != null) {
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@class');
-      _types = linkedNode.compilationUnit_declarations
+      return _types = linkedNode.compilationUnit_declarations
           .where((node) =>
               node.kind == LinkedNodeKind.classDeclaration ||
               node.kind == LinkedNodeKind.classTypeAlias)
@@ -1922,11 +1949,14 @@
         reference.node = node;
         return ClassElementImpl.forLinkedNode(this, reference, node);
       }).toList();
-    } else if (_unlinkedUnit != null) {
-      _types ??= _unlinkedUnit.classes
+    }
+
+    if (_unlinkedUnit != null) {
+      return _types = _unlinkedUnit.classes
           .map((c) => new ClassElementImpl.forSerialized(c, this))
           .toList(growable: false);
     }
+
     return _types ?? const <ClassElement>[];
   }
 
@@ -2415,6 +2445,14 @@
   /// there are no initializers, or `null` if there was an error in the source.
   List<ConstructorInitializer> get constantInitializers {
     if (_constantInitializers == null) {
+      if (linkedNode != null) {
+        var context = enclosingUnit.linkedContext;
+        return _constantInitializers ??=
+            linkedNode.constructorDeclaration_initializers.map((node) {
+          return context.readNode(node) as ConstructorInitializer;
+        }).toList();
+      }
+
       if (serializedExecutable != null) {
         _constantInitializers = serializedExecutable.constantInitializers
             .map((i) => _buildConstructorInitializer(i))
@@ -2561,6 +2599,25 @@
   @override
   ConstructorElement get redirectedConstructor {
     if (_redirectedConstructor == null) {
+      if (linkedNode != null) {
+        var context = enclosingUnit.linkedContext;
+        if (isFactory) {
+          var node = linkedNode.constructorDeclaration_redirectedConstructor;
+          if (node != null) {
+            ConstructorName ast = context.readNode(node);
+            return ast.staticElement;
+          }
+        } else {
+          for (var node in linkedNode.constructorDeclaration_initializers) {
+            if (node.kind == LinkedNodeKind.redirectingConstructorInvocation) {
+              RedirectingConstructorInvocation ast = context.readNode(node);
+              return ast.staticElement;
+            }
+          }
+        }
+        return null;
+      }
+
       if (serializedExecutable != null) {
         if (serializedExecutable.isRedirectedConstructor) {
           if (serializedExecutable.isFactory) {
@@ -2742,7 +2799,7 @@
 
     if (linkedNode != null) {
       var context = enclosingUnit.linkedContext;
-      return _constantInitializer = context.readInitializer(linkedNode);
+      return _constantInitializer = context.readInitializer(this, linkedNode);
     }
 
     if (_unlinkedConst != null) {
@@ -2792,6 +2849,10 @@
   DefaultFieldFormalParameterElementImpl(String name, int nameOffset)
       : super(name, nameOffset);
 
+  DefaultFieldFormalParameterElementImpl.forLinkedNode(
+      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      : super.forLinkedNode(enclosing, reference, linkedNode);
+
   /// Initialize a newly created parameter element to have the given [name].
   DefaultFieldFormalParameterElementImpl.forNode(Identifier name)
       : super.forNode(name);
@@ -3904,6 +3965,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedNode.codeLength;
+    }
     if (_unlinkedEnum != null) {
       return _unlinkedEnum.codeRange?.length;
     }
@@ -3912,6 +3976,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedNode.codeOffset;
+    }
     if (_unlinkedEnum != null) {
       return _unlinkedEnum.codeRange?.offset;
     }
@@ -4213,6 +4280,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedNode.codeLength;
+    }
     if (serializedExecutable != null) {
       return serializedExecutable.codeRange?.length;
     }
@@ -4221,6 +4291,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedNode.codeOffset;
+    }
     if (serializedExecutable != null) {
       return serializedExecutable.codeRange?.offset;
     }
@@ -4372,32 +4445,12 @@
         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 [];
-        }
+        _parameters = ParameterElementImpl.forLinkedNodeList(
+          this,
+          context,
+          containerRef,
+          formalParameters,
+        );
       }
       if (serializedExecutable != null) {
         _parameters = ParameterElementImpl.resynthesizeList(
@@ -4570,6 +4623,12 @@
         _unlinkedExportNonPublic = null,
         super(null, offset);
 
+  ExportElementImpl.forLinkedNode(
+      LibraryElementImpl enclosing, LinkedNode 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 +4636,20 @@
 
   @override
   List<NamespaceCombinator> get combinators {
-    if (_combinators == null) {
-      if (_unlinkedExportPublic != null) {
-        _combinators = ImportElementImpl._buildCombinators(
-            _unlinkedExportPublic.combinators);
-      }
+    if (_combinators != null) return _combinators;
+
+    if (linkedNode != null) {
+      return _combinators = ImportElementImpl._buildCombinators2(
+        enclosingUnit.linkedContext,
+        linkedNode,
+      );
     }
+
+    if (_unlinkedExportPublic != null) {
+      return _combinators = ImportElementImpl._buildCombinators(
+          _unlinkedExportPublic.combinators);
+    }
+
     return _combinators ?? const <NamespaceCombinator>[];
   }
 
@@ -4592,14 +4659,31 @@
   }
 
   @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) {
+      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 _exportedLibrary = elementFactory.libraryOfUri('$uri');
     }
+
+    if (_unlinkedExportNonPublic != null) {
+      LibraryElementImpl library = enclosingElement as LibraryElementImpl;
+      _exportedLibrary = library.resynthesizerContext.buildExportedLibrary(uri);
+    }
+
     return _exportedLibrary;
   }
 
@@ -4616,6 +4700,11 @@
 
   @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 (_unlinkedExportNonPublic != null) {
         return _metadata = _buildAnnotations(library.definingCompilationUnit,
@@ -4760,6 +4849,12 @@
 
   @override
   bool get isCovariant {
+    if (linkedNode != null) {
+      if (linkedNode.kind == LinkedNodeKind.variableDeclaration) {
+        return linkedNode.variableDeclaration_declaration.isCovariant;
+      }
+      return false;
+    }
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.isCovariant;
     }
@@ -4872,11 +4967,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 +5001,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, LinkedNode linkedNode)
+      : super.forLinkedNode(enclosing, reference, linkedNode);
 
   /// Initialize a newly created function element to have the given [name].
   FunctionElementImpl.forNode(Identifier name) : super.forNode(name);
@@ -4976,6 +5066,14 @@
   }
 
   @override
+  void set returnType(DartType returnType) {
+    if (linkedNode != null) {
+      enclosingUnit.linkedContext.setReturnType(linkedNode, returnType);
+    }
+    super.returnType = returnType;
+  }
+
+  @override
   SourceRange get visibleRange {
     if (serializedExecutable != null) {
       if (serializedExecutable.visibleLength == 0) {
@@ -5143,6 +5241,10 @@
   /// The type defined by this element.
   FunctionType _type;
 
+  GenericFunctionTypeElementImpl.forLinkedNode(
+      ElementImpl enclosingElement, Reference reference, LinkedNode 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 +5269,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 +5299,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 +5332,16 @@
     _type = type;
   }
 
+  @override
+  List<TypeParameterElement> get typeParameters {
+    if (linkedNode != null) {
+      if (linkedNode.kind == LinkedNodeKind.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) {
@@ -5316,6 +5441,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedNode.codeLength;
+    }
     if (_unlinkedTypedef != null) {
       return _unlinkedTypedef.codeRange?.length;
     }
@@ -5324,6 +5452,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedNode.codeOffset;
+    }
     if (_unlinkedTypedef != null) {
       return _unlinkedTypedef.codeRange?.offset;
     }
@@ -5362,24 +5493,19 @@
     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.kind == LinkedNodeKind.genericTypeAlias) {
+        _function = GenericFunctionTypeElementImpl.forLinkedNode(
           this,
-          reference,
-          node,
+          reference.getChild('@function'),
+          linkedNode.genericTypeAlias_functionType,
         );
-      }).toList();
+      } else {
+        return _function = GenericFunctionTypeElementImpl.forLinkedNode(
+          this,
+          reference.getChild('@function'),
+          linkedNode,
+        );
+      }
       return _function;
     }
 
@@ -5579,20 +5705,40 @@
   /// The unlinked representation of the combinator in the summary.
   final UnlinkedCombinator _unlinkedCombinator;
 
+  final LinkedUnitContext linkedContext;
+  final LinkedNode 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.hideCombinator_hiddenNames
+          .map((node) => linkedContext.getSimpleName(node))
+          .toList();
     }
+
+    if (_unlinkedCombinator != null) {
+      return _hiddenNames = _unlinkedCombinator.hides.toList(growable: false);
+    }
+
     return _hiddenNames ?? const <String>[];
   }
 
@@ -5666,11 +5812,19 @@
 
   @override
   List<NamespaceCombinator> get combinators {
-    if (_combinators == null) {
-      if (_unlinkedImport != null) {
-        _combinators = _buildCombinators(_unlinkedImport.combinators);
-      }
+    if (_combinators != null) return _combinators;
+
+    if (linkedNode != null) {
+      return _combinators = _buildCombinators2(
+        enclosingUnit.linkedContext,
+        linkedNode,
+      );
     }
+
+    if (_unlinkedImport != null) {
+      return _combinators = _buildCombinators(_unlinkedImport.combinators);
+    }
+
     return _combinators ?? const <NamespaceCombinator>[];
   }
 
@@ -5729,6 +5883,9 @@
 
   @override
   bool get isDeferred {
+    if (linkedNode != null) {
+      return linkedNode.importDirective_deferredKeyword != 0;
+    }
     if (_unlinkedImport != null) {
       return _unlinkedImport.isDeferred;
     }
@@ -5787,6 +5944,19 @@
 
   PrefixElement get prefix {
     if (_prefix == null) {
+      if (linkedNode != null) {
+        var prefix = linkedNode.importDirective_prefix;
+        if (prefix != null) {
+          var context = enclosingUnit.linkedContext;
+          var name = context.getSimpleName(prefix);
+          LibraryElementImpl 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);
@@ -5897,6 +6067,20 @@
       return const <NamespaceCombinator>[];
     }
   }
+
+  static List<NamespaceCombinator> _buildCombinators2(
+      LinkedUnitContext context, LinkedNode linkedNode) {
+    return linkedNode.namespaceDirective_combinators.map((node) {
+      var kind = node.kind;
+      if (kind == LinkedNodeKind.hideCombinator) {
+        return HideElementCombinatorImpl.forLinkedNode(context, node);
+      }
+      if (kind == LinkedNodeKind.showCombinator) {
+        return ShowElementCombinatorImpl.forLinkedNode(context, node);
+      }
+      throw UnimplementedError('$kind');
+    }).toList();
+  }
 }
 
 /// A concrete implementation of a [LabelElement].
@@ -6127,6 +6311,11 @@
 
   @override
   Namespace get exportNamespace {
+    if (linkedNode != null) {
+      if (_exportNamespace != null) return _exportNamespace;
+      var elements = linkedContext.bundleContext.elementFactory;
+      return _exportNamespace = elements.buildExportNamespace(source.uri);
+    }
     if (resynthesizerContext != null) {
       _exportNamespace ??= resynthesizerContext.buildExportNamespace();
     }
@@ -6140,6 +6329,13 @@
   @override
   List<ExportElement> get exports {
     if (_exports == null) {
+      if (linkedNode != null) {
+        return _exports = linkedNode.compilationUnit_directives
+            .where((node) => node.kind == LinkedNodeKind.exportDirective)
+            .map((node) {
+          return ExportElementImpl.forLinkedNode(this, node);
+        }).toList();
+      }
       if (unlinkedDefiningUnit != null) {
         List<UnlinkedExportNonPublic> unlinkedNonPublicExports =
             unlinkedDefiningUnit.exports;
@@ -6407,7 +6603,7 @@
       if (_metadata != null) return _metadata;
       CompilationUnitElementImpl enclosingUnit = _definingCompilationUnit;
       var context = enclosingUnit.linkedContext;
-      var metadata = context.getMetadataOrEmpty(linkedNode);
+      var metadata = context.getLibraryMetadataOrEmpty(linkedNode);
       return _metadata = _buildAnnotations2(enclosingUnit, metadata);
     }
     if (_metadata == null) {
@@ -6954,6 +7150,12 @@
   /// 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, LinkedNode linkedNode)
+      : super.forLinkedNode(enclosing, reference, linkedNode) {
+    enclosing.linkedContext.loadClassMemberReferences(reference);
+  }
+
   /// Initialize a newly created class element to have the given [name].
   MixinElementImpl.forNode(Identifier name) : super.forNode(name);
 
@@ -6969,24 +7171,44 @@
   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 = linkedNode.mixinDeclaration_onClause;
+      if (onClause != null) {
+        var context = enclosingUnit.linkedContext;
+        constraints = onClause.onClause_superclassConstraints
+            .map((node) => context.getInterfaceType(node.typeName_type))
+            .where((type) => type != null)
+            .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>[];
   }
 
@@ -7445,6 +7667,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedNode.codeLength;
+    }
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.codeRange?.length;
     }
@@ -7453,6 +7678,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedNode.codeOffset;
+    }
     if (_unlinkedVariable != null) {
       return _unlinkedVariable.codeRange?.offset;
     }
@@ -7649,7 +7877,8 @@
         reference,
         linkedNode,
       );
-    } else if (kind == LinkedNodeKind.simpleFormalParameter) {
+    } else if (kind == LinkedNodeKind.functionTypedFormalParameter ||
+        kind == LinkedNodeKind.simpleFormalParameter) {
       return ParameterElementImpl.forLinkedNode(
         enclosing,
         reference,
@@ -7708,6 +7937,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedNode.codeLength;
+    }
     if (unlinkedParam != null) {
       return unlinkedParam.codeRange?.length;
     }
@@ -7716,6 +7948,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedNode.codeOffset;
+    }
     if (unlinkedParam != null) {
       return unlinkedParam.codeRange?.offset;
     }
@@ -7842,14 +8077,7 @@
   @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;
+      return enclosingUnit.linkedContext.isFinal(linkedNode);
     }
     if (unlinkedParam != null) {
       return unlinkedParam.isFinal;
@@ -7962,15 +8190,8 @@
   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.getFormalParameterType(linkedNode);
     }
     _resynthesizeTypeAndParameters();
     return super.type;
@@ -8080,6 +8301,47 @@
     }
   }
 
+  static List<ParameterElement> forLinkedNodeList(
+      ElementImpl enclosing,
+      LinkedUnitContext context,
+      Reference containerRef,
+      List<LinkedNode> formalParameters) {
+    if (formalParameters == null) {
+      return const [];
+    }
+
+    return 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;
+        if (parameterNode.kind == LinkedNodeKind.fieldFormalParameter) {
+          return DefaultFieldFormalParameterElementImpl.forLinkedNode(
+            enclosing,
+            reference,
+            node,
+          );
+        } else {
+          return DefaultParameterElementImpl.forLinkedNode(
+            enclosing,
+            reference,
+            node,
+          );
+        }
+      } else {
+        var name = context.getFormalParameterName(node);
+        var reference = containerRef.getChild(name);
+        reference.node = node;
+        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,
@@ -8202,6 +8464,11 @@
       : _unlinkedImport = null,
         super(name, nameOffset);
 
+  PrefixElementImpl.forLinkedNode(
+      ElementImpl enclosing, Reference reference, LinkedNode 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 +8487,6 @@
       super.enclosingElement as LibraryElement;
 
   @override
-  String get identifier => "_${super.identifier}";
-
-  @override
   List<LibraryElement> get importedLibraries => const <LibraryElement>[];
 
   @override
@@ -8230,6 +8494,9 @@
 
   @override
   String get name {
+    if (linkedNode != null) {
+      return reference.name;
+    }
     if (_name == null) {
       if (_unlinkedImport != null) {
         LibraryElementImpl library = enclosingElement as LibraryElementImpl;
@@ -8242,6 +8509,10 @@
 
   @override
   int get nameOffset {
+    if (linkedNode != null) {
+      LibraryElementImpl library = enclosingElement;
+      return library.linkedContext.getSimpleOffset(linkedNode);
+    }
     int offset = super.nameOffset;
     if (offset == 0 && _unlinkedImport != null) {
       return _unlinkedImport.prefixOffset;
@@ -8401,7 +8672,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;
@@ -8638,6 +8913,9 @@
   /// The unlinked representation of the combinator in the summary.
   final UnlinkedCombinator _unlinkedCombinator;
 
+  final LinkedUnitContext linkedContext;
+  final LinkedNode 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 +8927,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 +8955,9 @@
 
   @override
   int get offset {
+    if (linkedNode != null) {
+      return linkedContext.getTokenOffset(linkedNode.combinator_keyword);
+    }
     if (_unlinkedCombinator != null) {
       return _unlinkedCombinator.offset;
     }
@@ -8682,9 +8971,18 @@
 
   @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.showCombinator_shownNames
+          .map((node) => linkedContext.getSimpleName(node))
+          .toList();
     }
+
+    if (_unlinkedCombinator != null) {
+      return _shownNames = _unlinkedCombinator.shows.toList(growable: false);
+    }
+
     return _shownNames ?? const <String>[];
   }
 
@@ -8878,6 +9176,9 @@
 
   @override
   int get codeLength {
+    if (linkedNode != null) {
+      return linkedNode.codeLength;
+    }
     if (_unlinkedTypeParam != null) {
       return _unlinkedTypeParam.codeRange?.length;
     }
@@ -8886,6 +9187,9 @@
 
   @override
   int get codeOffset {
+    if (linkedNode != null) {
+      return linkedNode.codeOffset;
+    }
     if (_unlinkedTypeParam != null) {
       return _unlinkedTypeParam.codeRange?.offset;
     }
@@ -8986,7 +9290,7 @@
     if (linkedNode != null) {
       var context = enclosingUnit.linkedContext;
       var containerRef = reference.getChild('@typeParameter');
-      var typeParameters = context.getTypeParameters(linkedNode);
+      var typeParameters = LinkedUnitContext.getTypeParameters(linkedNode);
       if (typeParameters == null) {
         return _typeParameterElements = const [];
       }
@@ -9194,6 +9498,9 @@
   DartObject get constantValue => evaluationResult?.value;
 
   void set declaredType(DartType type) {
+    if (linkedNode != null) {
+      enclosingUnit.linkedContext.setVariableType(linkedNode, type);
+    }
     _declaredType = _checkElementOfType(type);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
index b2fb92f..8bdc5c7 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 5fbed4f..e2393ca 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -1541,6 +1541,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
@@ -2825,6 +2834,9 @@
   bool get isDartCoreNull => false;
 
   @override
+  bool get isDartCoreString => false;
+
+  @override
   bool get isDynamic => false;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/wrapped.dart b/pkg/analyzer/lib/src/dart/element/wrapped.dart
index 10c3f75..984a7b1 100644
--- a/pkg/analyzer/lib/src/dart/element/wrapped.dart
+++ b/pkg/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.
 
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index 39f9dee..64dcf19 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -322,6 +322,8 @@
   /**
    * 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 "
@@ -340,6 +342,8 @@
   /**
    * 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 "
@@ -550,6 +554,81 @@
           "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 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.");
+
+  /**
    * This hint is generated anywhere where a `@sealed` class or mixin is used as
    * a super-type of a class.
    */
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index 62e8d17..67fbccc 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -379,11 +379,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 =
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index fd3008b..598d093 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -102,6 +102,8 @@
   _MISSING_CATCH_OR_FINALLY,
   _EXPERIMENT_NOT_ENABLED,
   _EXPECTED_ELSE_OR_COMMA,
+  _INVALID_SUPER_IN_INITIALIZER,
+  _INVALID_THIS_IN_INITIALIZER,
 ];
 
 const ParserErrorCode _ABSTRACT_CLASS_MEMBER = const ParserErrorCode(
@@ -386,6 +388,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 '}'.");
diff --git a/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart b/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart
index 838c611..bcf3d5e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart b/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
index 432367d..a0d6371 100644
--- a/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart b/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
index 9e54c4c..0184c06 100644
--- a/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
+++ b/pkg/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.
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 6471484..844dfd9 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/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/pkg/analyzer/lib/src/dart/sdk/patch.dart b/pkg/analyzer/lib/src/dart/sdk/patch.dart
index 532ae5e..d2f8f1e 100644
--- a/pkg/analyzer/lib/src/dart/sdk/patch.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/patch.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/pkg/analyzer/lib/src/dart/sdk/sdk.dart b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
index e20937d..41e4bfe 100644
--- a/pkg/analyzer/lib/src/dart/sdk/sdk.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
@@ -20,7 +20,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 +85,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;
   }
diff --git a/pkg/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart b/pkg/analyzer/lib/src/dartdoc/dartdoc_directive_info.dart
new file mode 100644
index 0000000..ca9c241
--- /dev/null
+++ b/pkg/analyzer/lib/src/dartdoc/dartdoc_directive_info.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.
+
+/// 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 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 macro directives with
+  /// the body of the corresponding template.
+  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;
+        }
+      }
+    }
+    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/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index b1161d4..41a977e 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/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
@@ -68,77 +67,6 @@
           "'{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}'.");
-
-  /**
    * 16.12.2 Const: It is a compile-time error if evaluation of a constant
    * object results in an uncaught exception being thrown.
    */
@@ -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>.
    *
@@ -516,12 +416,6 @@
           "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.
@@ -980,6 +874,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:
@@ -1531,19 +1441,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.
    */
@@ -2227,6 +2124,22 @@
           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',
@@ -2235,30 +2148,14 @@
           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*'.");
@@ -3256,6 +3153,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}'.",
@@ -3719,21 +3618,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.
    *
@@ -3915,16 +3799,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.
    *
@@ -3984,79 +3858,6 @@
           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
@@ -4855,11 +4656,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',
@@ -4922,12 +4718,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',
@@ -4974,12 +4764,6 @@
       "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/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 29d4bd9..1a75a35 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.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.
 
@@ -29,6 +29,8 @@
         messageFieldInitializerOutsideConstructor,
         messageIllegalAssignmentToNonAssignable,
         messageInterpolationInUri,
+        messageInvalidSuperInInitializer,
+        messageInvalidThisInInitializer,
         messageMissingAssignableSelector,
         messageNativeClauseShouldBeAnnotation,
         messageStaticConstructor,
@@ -111,6 +113,9 @@
   /// `true` if control-flow-collections behavior is enabled
   bool enableControlFlowCollections = false;
 
+  /// `true` if triple-shift behavior is enabled
+  bool enableTripleShift = false;
+
   AstBuilder(ErrorReporter errorReporter, this.fileUri, this.isFullAst,
       [Uri uri])
       : this.errorReporter = new FastaErrorReporter(errorReporter),
@@ -395,6 +400,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);
+      }
     }
   }
 
@@ -727,7 +739,7 @@
     Token forToken = pop();
     Token awaitToken = pop(NullValue.AwaitToken);
 
-    push(ast.forStatement2(
+    push(ast.forStatement(
       awaitKeyword: awaitToken,
       forKeyword: forToken,
       leftParenthesis: leftParenthesis,
@@ -880,7 +892,7 @@
     Token leftParen = pop();
     Token forToken = pop();
 
-    push(ast.forStatement2(
+    push(ast.forStatement(
       forKeyword: forToken,
       leftParenthesis: leftParen,
       forLoopParts: forLoopParts,
@@ -1123,8 +1135,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 +1193,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');
       }
     }
 
@@ -1869,6 +1934,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 +2151,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 +2599,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 +2626,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,
+        ));
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/fasta/token_utils.dart b/pkg/analyzer/lib/src/fasta/token_utils.dart
index 2037396..c5ad5c2 100644
--- a/pkg/analyzer/lib/src/fasta/token_utils.dart
+++ b/pkg/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/pkg/analyzer/lib/src/file_system/file_system.dart b/pkg/analyzer/lib/src/file_system/file_system.dart
index 183b8d1..28bd8b2 100644
--- a/pkg/analyzer/lib/src/file_system/file_system.dart
+++ b/pkg/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/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 3b0eba2..a1900ab 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/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/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 5518d7c..da03617 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/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/pkg/analyzer/lib/src/generated/element_handle.dart b/pkg/analyzer/lib/src/generated/element_handle.dart
index 115c44d..4c798bd 100644
--- a/pkg/analyzer/lib/src/generated/element_handle.dart
+++ b/pkg/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/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 9a99f54..1b53d3f 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -847,7 +847,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 +953,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 +1883,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/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 55671cc..cdffbef 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -2303,11 +2303,6 @@
  */
 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.
    */
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 3d71368..fe431d2 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/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/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 50697a0..c372f0d 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -2977,7 +2977,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;
@@ -3871,7 +3871,7 @@
       forList: true,
       elementType: listElementType,
     );
-    for (CollectionElement element in literal.elements2) {
+    for (CollectionElement element in literal.elements) {
       verifier.verify(element);
     }
   }
@@ -3906,7 +3906,7 @@
         mapKeyType: keyType,
         mapValueType: valueType,
       );
-      for (CollectionElement element in literal.elements2) {
+      for (CollectionElement element in literal.elements) {
         verifier.verify(element);
       }
     }
@@ -5128,7 +5128,7 @@
         forSet: true,
         elementType: setElementType,
       );
-      for (CollectionElement element in literal.elements2) {
+      for (CollectionElement element in literal.elements) {
         verifier.verify(element);
       }
     }
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index cd39326..2055493 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -1,4 +1,4 @@